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
|

Podobne dokumenty