každý dotaz SQL, který odešlete na server, musí projít třemi (čtyřmi – v případě výběru) fázemi. Nejprve Oracle vyhledá odpovídající SQL hash v mezipaměti knihovny. Je – li nalezen hash bude jen načíst přidružené vysvětlit plán a provede jej. Pokud tomu tak není, je vyvolána tvrdá analýza – >, což znamená, že mají být provedeny následující kroky.
- analyzovat
- kontrola syntaxe
- kontrola sémantiky
- kontrola oprávnění
- BIND
- nahraďte proměnné bind / host skutečnými hodnotami
- EXEC
- skutečné provedení založené na plánu vysvětlení
- načíst (pouze vybrat příkazy)
- vrátí výsledek nastavený uživateli
vysvětlím každou fázi v následujícím příkladu.
provedli jste tento dotaz:
SELECT *FROM employee;
proces serveru vygeneruje hash pro otázky SQL dotazu. Hash je hexadecimální hodnota generovaná na základě textu dotazu SQL. Zde přichází velmi důležitá část!! Dokonce i sebemenší změna (velká až malá písmena a naopak; přidání / odstranění mezery;…) změní hash, a proto může generovat tvrdou analýzu (více o tvrdé analýze vs měkké analýze níže). Musíte být velmi opatrní a pokusit se držet pouze jednoho kódu – proto postupy fungují nejlépe (navíc-většinou používají vázané proměnné, které generují identické dotazy v očích Oracle).
můžete jej snadno ověřit sami provedením níže uvedených dotazů:
-- 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.
jakmile je vygenerován hash, Oracle zkontroluje, zda byl tento dotaz již v tomto případě proveden. Jak? Kontrolou, zda hash již existuje v oblasti SQL.
za předpokladu, že tento dotaz ještě není k dispozici, bude vytvořena oblast SQL s hodnotou hash pro tento dotaz a Oracle zahájí první fázi zpracování dotazu, a to je analýza.
- během kontroly syntaxe Oracle zkontroluje dotaz, zda je syntakticky správný (vyberte místo výběru; správné pořadí příkazů – > vyberte * z tabulky pořadí podle col1 kde col2 = ‚John‘; atd.).
- dalším krokem je kontrola sémantiky, kde Oracle ověří, zda jsou názvy sloupců a názvy objektů správné. Jak? Zaškrtnutím je pomocí mezipaměti datového slovníku
- v posledním kroku fáze analýzy Oracle zkontroluje, zda má uživatel / aplikace správná oprávnění pro přístup k dotazovaným objektům.
jakmile to skončí, oblast SQL je platná a další nástroj v Oracle nazvaný OPTIMIZER vygeneruje plán provádění-to znamená, že optimalizátor rozhodne, jak bude dotaz proveden. Po výběru nejlepšího plánu provádění Oracle váže všechny proměnné a pokračuje ve třetím kroku – provedení.
co se tady bude dít? Oracle bude číst datové bloky související s dotazovanými objekty a přivést je do vyrovnávací paměti cache (pokud tam ještě nejsou prezentovány. Pokud tam jsou, Oracle je znovu nepřečte!). Tento proces vygeneruje I/O (což, jak jsem zmínil v článku výpočetní architektura, je ve srovnání se čtením z paměti velmi pomalé). Na chvíli se zde zastavím a zdůrazním I / O generaci. V případě měkké analýzy jsou všechna data čtena z paměti (vyrovnávací paměť), která je mnohem rychlejší než jejich čtení z disku. Proto se musíte snažit co nejvíce recyklovat/znovu použít své dotazy. Každá změna dotazu vygeneruje nový hash, a proto bude s největší pravděpodobností generovat I / o. to vše je stále zpracováno serverovým procesem.
Nyní, když jsou data již v paměti (vyrovnávací paměť), příkaz SELECT je zpracován a je spuštěna konečná fáze (FETCH) a sada výsledků je vrácena zpět uživateli.
pokud je stejný dotaz proveden znovu, vygeneruje se hash a protože oblast SQL pro tento hash již existuje, fáze PARSE je přeskočena a jsou prováděny pouze EXEC a FETCH.