Optymalizacja zapytań opartych o linked servery
Transkrypt
Optymalizacja zapytań opartych o linked servery
Optymalizacja zapytań opartych o linked servery Michał Janiec Our Sponsors 2 | 10/3/2016 | Our Sponsors Our Partners 3 | 10/3/2016 | Our Partners O mnie SQL Server DBA i DEV Branża TSL i Warehouse Management Poznański oddział PLSSUG Blog: sqlinspirations.com Mail: [email protected] Skype: michal.janiec.skype 4 | 10/3/2016 | O mnie Agenda Konfiguracja SQL Server Konfiguracja Linked Server Optymalizacja DQ vs. LQ Problemy związane z DQ Uwaga: tylko SQL Server ↔ SQL Server Umiejętność czytania planów zapytań 5 | 10/3/2016 | Agenda Konfiguracja SQL Server Network Packet Size + Maximum Transmission Unit + Jumbo Frames Można sobie zrobić krzywdę – testy workloadu Domyślne ustawienia są OK Statystyki - SQL Server 2012 i niższe sysadmin, db_ddladmin, object owner DBCC SHOW_STATISTICS Statystyki - SQL Server 2012 SP1 i wyższe Uprawnienie SELECT na kolumnach czytanych i filtrowanych 6 | 10/3/2016 | Konfiguracja SQL Server Konfiguracja Linked Server Collation Compatible Zaufaj mi, collation po obu stronach są kompatybilne Może zwrócić niepoprawne wyniki Wysyła filtry na stronę remote Use Remote Collation True – użyj remote collation (o ile SQL Server) True – użyj podanego collation (o ile nie SQL Server) False – użyj lokalnego collation Lazy Schema Validation False - sprawdzaj metadane przed egzekucją True – nie sprawdzaj metadanych – sprawdź po egzekucji (może powodować błędy, gdy schemat się zmieni) 7 | 10/3/2016 | Konfiguracja SQL Server Wstęp do optymalizacji Plan zapytania, to klucz do wydajności Optymalizator kosztowy Koszt to funkcja estymacji ilości i wielkości wierszy wędrujących przez operatory w planie Estymacja = statystyki lub zgadywanie Wypychanie predykatów Parsowanie, bindowanie, optymalizacja Ograniczenia Dojście do danych 8 | 10/3/2016 | Optymalizacja DEMO Podstawowe zasady DQ Wpływ uprawnień na estymację 9 | 10/3/2016 | Optymalizacja DQ vs. LQ - bindowanie Metadane są ściągane z serwera zdalnego i składowane lokalnie Schematy dla obiektów programowalnych są kompilowane po stronie zdalnej i składowane lokalnie Typy danych providera są mapowane na najbliższe SQL Server 10 | 10/3/2016 | Optymalizacja DQ vs. LQ – optymalizacja (1) Nie istnieje „trivial plan” Pierwszy plan: „ściągnij wszystkie dane” i stwórz plan na tej podstawie Krok kolejny: użyj statystyk (!), ograniczeń, stwórz inne plany Zmiana paradygmatu: wygrywa plan, który przesyła mniej danych przez sieć, a nie ten który będzie szybszy (!!!) 11 | 10/3/2016 | Optymalizacja DQ vs. LQ – optymalizacja (2) Trochę inne zasady tworzenia planów Inny algorytm kolejności JOINowania Agresywne „aggregation pushdown” Agresywne „predicate pushdown” Optymalizator nie bierze pod uwagę indeksów po stronie remote (???) Brak możliwości wysłania danych lokalnych na stronę remote (nie licząc „id” złączeniowych) Często używane spoole (!) 12 | 10/3/2016 | Optymalizacja DQ vs. LQ – egzekucja Walidacja schematu zdalnego przy każdym odpaleniu zapytania – gdy zmiany rekompilacja Dwa modele egzekucji: Cursor API – unikać! (do wykrycia przez Profiler) „Streaming” - przesyłanie wierszy pojedynczo lub w paczkach np. 100 sztuk 13 | 10/3/2016 | Optymalizacja Przykład – small remote JOIN big local JOIN REMOTE 14 | 10/3/2016 | Optymalizacja LOCAL Przykład – small local JOIN big remote JOIN LOCAL REMOTE Co jeżeli po stronie remote nie ma indeksu? 15 | 10/3/2016 | Optymalizacja Przykład – remote CROSS JOIN remote REMOTE 16 | 10/3/2016 | Optymalizacja CROSS JOIN REMOTE Selekcja danych - problemy Wersja SQL Server / Service Pack Uprawnienia Collation (bazy domyślnej połączenia) Funkcje skalarne Operatory IN, EXISTS (SELECT remote) Brak indeksów po stronie remote Zmienne lokalne Brak możliwości wypchnięcia predykatów 17 | 10/3/2016 | Optymalizacja Selekcja danych – rozwiązania (1) Migracja na SQL Server 2012 - min. SP1 Poprawa uprawnień (db_ddladmin bez CREATE, ALTER, DROP) OpenQuery() Option(optimize for) Option(recompile) JOINy zamiast IN, EXISTS (SELECT remote) Ustawienia Collation Funkcje INLINE + CROSS APPLY 18 | 10/3/2016 | Optymalizacja Selekcja danych – rozwiązania (2) Gdy parametry się nie wyślą zdalnie OPENQUERY – gdy znamy wartości parametrów Co jak nie znamy wartości parametrów? Co jak używamy IN (local SELECT)? Rozwiązanie: Dynamiczny OPENQUERY Wysłać parametry do dedykowanej tabelki :) 19 | 10/3/2016 | Optymalizacja Modyfikacja danych - problemy INSERT into server.baza.schemat.tabela == into OPENQUERY Uwaga na spoole „Push” kilka razy gorszy niż „Pull” UPDATE Typy bit, uniqueidentifier - spoolowanie + ściąganie całej tabeli lokalnie OPENQUERY – spoolowanie JOINów – spoolowanie Na 1 tabeli i „normalny” typ danych – brak spoola DELETE server.baza.schemat.tabela – brak spoolowania OPENQUERY – spoolowanie 20 | 10/3/2016 | Optymalizacja DEMO Problemy z SELECT Problemy z INSERT Problemy z DELETE Wysyłka parametrów do remote 21 | 10/3/2016 | Optymalizacja Podsumowanie Sieć Wersja SQL Server + uprawnienia Estymacja, spoole, indeksy Operacje modyfikacji danych 22 | 10/3/2016 | Optymalizacja Our Sponsors 23 | 10/3/2016 Footer Goes Here | Our Partners 24 | 10/3/2016 Footer Goes Here |