SELECT przetwarzanie instrukcji

każde zapytanie SQL wysyłane na serwer musi przejść trzy (cztery – w przypadku SELECT) etapy. Po pierwsze, Oracle będzie szukać pasującego skrótu SQL w pamięci podręcznej Biblioteki. Jeśli hash zostanie znaleziony, po prostu pobierze powiązany Plan explain i uruchomi go. Jeśli nie, wywoływany jest twardy parse – >, co oznacza, że następujące kroki mają zostać wykonane.

  1. PARSE
    • sprawdzanie składni
    • sprawdzanie semantyki
    • sprawdzanie uprawnień
  2. BIND
    • zamień zmienne bind / host na rzeczywiste wartości
  3. EXEC
    • rzeczywista realizacja na podstawie planu
  4. FETCH (tylko polecenia SELECT)
    • zwraca wynik ustawiony użytkownikowi

pozwólcie, że wyjaśnię każdą fazę w poniższym przykładzie.

wykonałeś to zapytanie:

wybierz *
od pracownika;
SELECT * FROM employee;

SELECT *FROM employee;

proces serwera wygeneruje hash dla zapytania issues SQL. Hash jest wartością szesnastkową generowaną na podstawie tekstu zapytania SQL. Nadchodzi bardzo ważna część!! Nawet najmniejsze zmiany (duże i małe litery i odwrotnie; dodanie / usunięcie spacji;…) zmieni hash i dlatego może wygenerować twardy parse (więcej na twardym parse vs miękki parse poniżej). Trzeba być bardzo ostrożnym i starać się trzymać tylko jednego kodu – dlatego procedury działają najlepiej (na dodatek – najczęściej używają zmiennych bind, które generują identyczne zapytania w oczach Oracle).

możesz go łatwo zweryfikować samodzielnie, wykonując poniższe zapytania:

— najpierw uruchom to zapytanie
wybierz * z dual;
— następnie uruchom go ponownie ze wszystkimi wielkimi literami
wybierz * z DUAL;
— sprawdź skróty sql
wybierz sql_id
, sql_text
, hash_value
FROM v$sql
gdzie 1=1
i niższe (sql_text) jak ’ % select % from dual%’;
sql_id / sql_text / hash_value
————————————————–
0x735fvggtnu6 / wybierz * z DUAL| 3741111110
3vyt9wdmca69b / wybierz * z dual| 1724193067
— jak widać, Oracle ocenił to jako dwa różne zapytania.
— najpierw uruchom to querySELECT * from dual;– następnie uruchom to ponownie ze wszystkimi wielkimi literamiwybierz * FROM DUAL;– sprawdź skróty sql wybierz sql_id, sql_text, hash_valueFROM v$sqlghere 1 = 1i niższe(sql_text) jak ’ % select % from dual%’; sql_id / sql_text / hash_value————————————————–0X735FVGGTNU6 | SELECT * FROM DUAL | 37411111103VYT9WDMCA69B | SELECT * FROM dual / 1724193067– jak widać Oracle ocenił to jako dwa różne zapytania.

-- first run this querySELECT * FROM dual;-- then run this one again with all uppercase lettersSELECT * FROM DUAL;-- check the sql hashes SELECT sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1AND lower(sql_text) LIKE '%select%from dual%'; sql_id | sql_text | hash_value--------------------------------------------------0x735fvggtnu6 | SELECT * FROM DUAL | 37411111103vyt9wdmca69b | SELECT * FROM dual | 1724193067-- As you can see Oracle evaluated it as two different queries.

po wygenerowaniu skrótu Oracle sprawdza, czy to zapytanie zostało już wykonane w tej instancji. Jak? Sprawdzając, czy hash już istnieje w obszarze SQL.

zakładając, że to zapytanie nie jest jeszcze dostępne, zostanie utworzony obszar SQL z wartością skrótu dla tego zapytania, A Oracle rozpocznie pierwszy etap przetwarzania zapytania, czyli PARSE.

  • podczas sprawdzania składni Oracle sprawdzi zapytanie, czy jest poprawne składniowo (SELECT zamiast SELECT; prawidłowa kolejność poleceń – > SELECT * Z kolejności tabeli wg col1 gdzie col2 = 'John’; itd.).
  • następnym krokiem jest sprawdzenie semantyki, w której Oracle sprawdza, czy nazwy kolumn i nazw obiektów są poprawne. Jak? Sprawdzając je za pomocą pamięci podręcznej słownika danych
  • w ostatnim etapie analizy, Oracle sprawdza, czy użytkownik/aplikacja ma odpowiednie uprawnienia dostępu do zapytanych obiektów.

gdy to się skończy, obszar SQL jest ważny i inne narzędzie w Oracle o nazwie OPTIMIZER wygeneruje plan wykonania – oznacza to, że optymalizator zdecyduje, jak zapytanie zostanie wykonane. Po wybraniu najlepszego planu wykonania Oracle wiąże wszystkie zmienne i przechodzi do trzeciego kroku – wykonania.

co tu się stanie? Oracle odczyta bloki danych związane z zapytanymi obiektami i przeniesie je do bufora cache (jeśli nie są tam jeszcze prezentowane. Jeśli tam są, Wyrocznia nie przeczyta ich ponownie!). Proces ten wygeneruje I / O(co, jak wspomniałem w artykule architektura obliczeniowa, jest bardzo powolne w porównaniu do odczytu z pamięci). Zatrzymam się tutaj na chwilę i podkreślę generację I / O. W przypadku analiz miękkich wszystkie dane są odczytywane z pamięci (bufora cache), co jest znacznie szybsze niż odczyt ich z dysku. Dlatego musisz dążyć do recyklingu / ponownego wykorzystania zapytań w jak największym stopniu. Każda zmiana zapytania wygeneruje nowy hash, a zatem najprawdopodobniej wygeneruje I / O. wszystko to jest nadal obsługiwane przez proces serwera.

teraz, gdy dane są już w pamięci (bufor cache), instrukcja SELECT jest przetwarzana i Uruchamiany jest ostatni etap (FETCH), a wynik jest zwracany z powrotem do użytkownika.

jeśli to samo zapytanie zostanie wykonane ponownie, hash jest generowany, a ponieważ obszar SQL dla tego hasha już istnieje, etap PARSE jest pomijany i wykonywane są tylko EXEC i FETCH.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.