Udostępnij przez


Dynamiczna wydajność SQL w odBC

Mimo że statyczny kod SQL działa dobrze w wielu sytuacjach, istnieje klasa aplikacji, w której nie można wcześniej określić dostępu do danych. Załóżmy na przykład, że arkusz kalkulacyjny umożliwia użytkownikowi wprowadzenie zapytania, które następnie arkusz kalkulacyjny wysyła do systemu DBMS w celu pobrania danych. Zawartość tego zapytania oczywiście nie może być znana programisty podczas zapisywania programu arkusza kalkulacyjnego.

Wykonywanie dynamiczne

Aby rozwiązać ten problem, arkusz kalkulacyjny używa formy osadzonej bazy danych SQL o nazwie dynamic SQL. W przeciwieństwie do statycznych instrukcji SQL, które są zakodowane w programie, dynamiczne instrukcje SQL można skompilować w czasie wykonywania i umieścić w zmiennej hosta ciągu. Następnie są one wysyłane do systemu DBMS na potrzeby przetwarzania. Ze względu na to, że system DBMS musi wygenerować plan dostępu w czasie wykonywania dla instrukcji dynamicznych SQL, dynamiczny program SQL jest zwykle wolniejszy niż statyczny język SQL. Gdy program zawierający dynamiczne instrukcje SQL jest kompilowany, instrukcje dynamiczne SQL nie są usuwane z programu, jak w statycznym języku SQL. Zamiast tego są zastępowane przez wywołanie funkcji, które przekazuje instrukcję do usługi DBMS; statyczne instrukcje SQL w tym samym programie są traktowane normalnie.

Najprostszym sposobem wykonania dynamicznej instrukcji SQL jest instrukcja EXECUTE IMMEDIATE. Ta instrukcja przekazuje instrukcję SQL do zestawu DBMS na potrzeby kompilacji i wykonywania.

Jedną wadą instrukcji EXECUTE IMMEDIATE jest to, że system DBMS musi przechodzić przez każde z pięciu kroków przetwarzania instrukcji SQL za każdym razem, gdy instrukcja jest wykonywana. Obciążenie związane z tym procesem może być znaczące, jeśli wiele instrukcji jest wykonywanych dynamicznie i jest marnotrawne, jeśli te instrukcje są podobne.

Przygotowane wykonanie

Aby rozwiązać powyższy problem, dynamiczny program SQL oferuje zoptymalizowaną formę wykonywania nazywaną przygotowanym wykonaniem, co wykorzystuje następujące kroki:

  1. Program tworzy instrukcję SQL w buforze, podobnie jak w przypadku instrukcji EXECUTE IMMEDIATE. Zamiast zmiennych hosta, w dowolnym miejscu tekstu instrukcji można użyć znaku zapytania (?), aby wskazać, że wartość ta zostanie dostarczona później. Znak zapytania jest nazywany znacznikiem parametru.

  2. Program przekazuje instrukcję SQL do systemu DBMS za pomocą instrukcji PREPARE, która żąda, aby DBMS analizował, weryfikował i optymalizował tę instrukcję oraz generował plan wykonania. Następnie program używa instrukcji EXECUTE (a nie instrukcji EXECUTE IMMEDIATE), aby wykonać instrukcję PREPARE w późniejszym czasie. Przekazuje wartości parametrów dla instrukcji za pośrednictwem specjalnej struktury danych o nazwie SQL Data Area lub SQLDA.

  3. Program może wielokrotnie używać instrukcji EXECUTE, podając różne wartości parametrów za każdym razem, gdy jest wykonywana instrukcja dynamiczna.

Przygotowane wykonanie nadal nie jest takie samo jak statyczne SQL. W statycznym języku SQL pierwsze cztery kroki przetwarzania instrukcji SQL odbywają się w czasie kompilacji. W przygotowanym wykonaniu te kroki nadal odbywają się w czasie wykonywania, ale są wykonywane tylko raz. Wykonanie planu odbywa się tylko wtedy, gdy jest wywoływana funkcja EXECUTE. To zachowanie pomaga wyeliminować niektóre wady wydajności związane z architekturą dynamicznego języka SQL.

Zobacz także

WYKONAJ (Transact-SQL)
sp_executesql (Transact-SQL)