2010-11-02 8 views
7

Mam na myśli, w kategoriach zapytań SQL, czy są one kompilowane lub interpretowane na niskim poziomie ?. Jak to działa wewnętrznie, Jest to instrukcja SQL interpretowana lub kompilowana ?.Czy DBMS (MySQL, SQL Server ....) Jest interpretowany lub kompilowany?

+0

Pytasz o MySQL w szczególności, czy jakikolwiek DBMS? Ponieważ różne systemy zarządzania bazą danych znajdują się w różnych punktach widma kompilowania i interpretowania – einpoklum

Odpowiedz

11

To zazwyczaj działa tak:

 
    SQL String ---[Optimizer]---> Execution Plan ---[Execution]---> Result 

Ja osobiście chciałbym zobaczyć optymalizator kwerendy (planowanie) jako coś bardzo podobnego do kompilatora. Przekształca instrukcję SQL w coś, co jest łatwiejsze do wykonania. Jednak nie jest to szopka na chipie. Ta "kompilacja" jest dość droga - podobnie jak kompilacja kodu C++. Jest to część, w której oceniane są różne warianty wykonania; kolejność łączenia, indeks do użycia i tak dalej. Dobrą praktyką jest unikanie tego, gdy tylko jest to możliwe, za pomocą parametrów wiązania . Parametry wiązania.

Plan wykonania jest następnie pobierany do wykonania przez bazę danych. Jednak strategia jest już ustalona. wykonanie właśnie to robi. Ta część jest rodzajem interpretacji planu wykonania, a nie SQL.

W końcu jest ona podobna do Javy lub .NET, gdzie kompilacja zamienia kod źródłowy na postać binarną, którą można łatwiej zinterpretować. Jeśli zignorujemy JIT dla tego argumentu, wykonanie programu Java interpretuje ten meta-kod.


użyłem w ten sposób, aby wyjaśnić korzyści using bind parameters for (Oracle) performance w moim free eBook "Use The Index, Luke".

+0

Proszę, popraw mnie, jeśli się mylę: możesz dodać, że Optymalizator może używać buforowania dla planu wykonania, co wyjaśniałoby zalety parametrów wiązania. – bvh

0

W nowoczesnych środowiskach SQL jest to podejście etapowe, w którym podejmuje się decyzję na określonym poziomie przepływu pracy, niezależnie od tego, czy chce się ponownie użyć i istniejący skompilowany blok, czy też rozpocząć wszystkie etapy ponownie, jeśli uzyska się lepszy plan pewna kombinacja argumentów.

Myślę, że jest to spłata między (ponowną) kompilacją i czasem wykonania wyniku (następnie skompilowanego do kodu wykonywalnego). W zależności od złożoności zapytania, rekompilacja stosująca specyfikację podanych argumentów w czasie wykonywania może nie być warta wysiłku, jeśli czas wykonywania istniejącego kodu jest już niski z powodu przewidywalnego minimalnego zużycia zasobów (np. Odczyt dwóch wierszy i powrót).

Przy większej złożoności zapytań i szacunkowym zużyciu zasobów (wiele dużych tabel, istotny wybór indeksu, możliwe skanowanie tabeli), granulacja twoich statystyk wchodzi w grę. np. jeśli masz selektywności, wartości odstające, zakresy selektywności, śr. wielkości pól, fizyczne rozmiary map itp. optymalizator może dojść do bardzo różnych wniosków z różnymi zestawami argumentów.

Obliczenie najlepszego planu dla 25-złączeń z argumentami zmiennej 10 ++ może zabrać swój czas i zasoby. Jeśli wynik jest szybszy i bardziej wydajny niż wersja "jeden dla wszystkich", to jest wart wysiłku. Szczególnie, że podany zestaw argumentów może zawierać zmieniacze gry, a zapytanie będzie często wykonywane ponownie.

Wreszcie, twój przebieg może się różnić w zależności od dostawcy;)

Powiązane problemy