vyberte zpracování příkazů

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.

  1. analyzovat
    • kontrola syntaxe
    • kontrola sémantiky
    • kontrola oprávnění
  2. BIND
    • nahraďte proměnné bind / host skutečnými hodnotami
  3. EXEC
    • skutečné provedení založené na plánu vysvětlení
  4. 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:

vybrat *
od zaměstnance;
Vyberte * od zaměstnance;

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ů:

— nejprve spusťte tento dotaz
vybrat * z duálního;
— pak spusťte tento znovu se všemi velkými písmeny
vybrat * z duálního;
— zkontrolujte hashe sql
vyberte sql_id
, sql_text
, hash_value
z v $ sql
kde 1=1
a nižší (sql_text) jako ‚ %select%from dual%‘;
sql_id | sql_text / hash_value
————————————————–
0x735fvggtnu6 / vybrat * z DUAL| 3741111110
3vyt9wdmca69b / vybrat * z duálního| 1724193067
— jak vidíte, Oracle to vyhodnotil jako dva různé dotazy.
— nejprve spusťte tento querySELECT * z duálního; — pak spusťte tento znovu se všemi velkými písmyvyberte * z duálního;– zkontrolujte, zda sql hashes vybrat sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1AND nižší(sql_text) jako ‚ % select%z dual%‘; sql_id | sql_text / hash_value————————————————–0x735fvggtnu6 / SELECT * FROM DUAL / 37411111103vyt9wdmca69b / SELECT * FROM dual / 1724193067 – jak vidíte, Oracle to vyhodnotil jako dva různé dotazy.

-- 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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.