2012-01-22 14 views
5

Rozumiem główną różnicę między używaniem Oświadczenia i Przygotowanej Deklaracji (PreparedStatements umożliwiają przekazywanie parametrów). Ale przeczytałem o subtelnej różnicy między tymi dwoma - mianowicie, że PreparedStatements może być szybszy niż generyczne instrukcje, ponieważ PreparedStatement SQL jest prekompilowany.Oświadczenie kontra Przygotowane oświadczenie w zakresie Prekompilacji

Co właściwie oznacza prekompilacja i dlaczego ma znaczenie?

+0

Dobry Szczegóły o Pre-kompilacji: [http://stackoverflow.com/questions/5497297/what-does-pre-compiling-a-jdbc-preparedstatement-do][1] [1]: http: // stackoverflow.com/questions/5497297/what-does-pre-compiling-a-jdbc-preparestatement-do – Awan

Odpowiedz

8

przygotowane oświadczenie wykonuje następujące kontrole:

  • zapewnia, że ​​tabele i kolumny istnieć
  • zapewnia, że ​​typy parametrów dopasować swoje kolumny
  • Analizuje SQL, aby upewnić się, że składnia jest poprawny
  • Kompiluje i buforuje skompilowany SQL, aby można go było ponownie wykonać bez powtarzania tych kroków.
+2

Sprawdzanie istnienia tabel i kolumn, sprawdzanie składni, uwierzytelnianie dostępu, przygotowywanie planu wykonania: serwer db wykonuje to dla każdego wyciągu, przygotowany albo nie. Serwery takie jak Oracle również zawierają instrukcje cache (przygotowane lub nie) na podstawie skrótu otrzymanego ciągu instrukcji. Po wykonaniu tej pracy, a serwer bazy danych "przygotował" obszar pamięci jako gotowy do uruchomienia, sterownik jdbc może powiązać parametry i użyć tego obiektu serwera. Następnie ponownie połącz nowe parametry i ponownie użyj ponownie bez konieczności ponownego przygotowywania instrukcji. Jeśli kierowca wprowadza to w ten sposób. – Glenn

4

Najważniejszą częścią procesu kompilacji jest utworzenie planu kwerend.

Plan zapytania, jak sugeruje nazwa, wskazuje, w jaki sposób baza danych powinna wykonać zapytanie (np. Które indeksy użyć, typy łączenia, które mogą być używane, takie jak sprzężenie w pętli/mieszanie/scalanie itp.). Może to trochę potrwać, ponieważ baza danych potrzebuje przeanalizować informacje na temat tabel, aby dobrze zgadnąć, co jest optymalne (np. Rozmiary tabel, dostępne indeksy, konkretne indeksy itp.).

Przygotowane oświadczenia mogą zaoszczędzić czas, trzeba uważać, ponieważ czasami mogą spowolnić program. Czemu? Ponieważ nie dostarczając wartości klauzuli where jako części kompilacji, baza danych musi odgadnąć wartości, które zamierzasz podać, i może wybrać wartości, które prowadzą do nieoptymalnego planu zapytania.

Może to być najbardziej widoczne w przypadku zapytań dotyczących zakresu. Załóżmy na przykład, że tworzymy przygotowaną instrukcję z minimalnymi i maksymalnymi datami jako parametrami. To zapytanie posłuży do pobrania kilku dni transakcji. Biorąc pod uwagę mały zakres dat, kwerenda ta może być najbardziej wydajna do wykonania, jeśli baza danych korzysta z indeksu nieklastrowego.

Ponieważ baza danych nie wie, jakie parametry należy podać, baza danych może zostać zoptymalizowana dla znacznie większego zakresu dat (np. Roku lub więcej), który może być najskuteczniejszy do wykonania przy użyciu skanowania tabeli. W takim przypadku użycie przygotowanej instrukcji spowolniłoby Twój program (chyba, że ​​podasz wskazówkę do bazy danych, jakie parametry optymalizować lub jawnie wskaże, które indeksy użyć).

Oczywiście jeśli w przygotowanym zestawieniu podane parametry będą wskazywać na poszczególne rekordy (np. Unikalne klucze na tabelach), baza danych nie może się nie udać podczas tworzenia planu zapytań.

Chyba staram się podkreślić, że są tutaj plusy i minusy. Przygotowane dokumenty mogą być szybsze w niektórych sytuacjach, ale trzeba zachować ostrożność.