sql >> Databáze >  >> RDS >> Oracle

Aspekty výkonu pro dočasná data v Oracle

Dočasné tabulky jsou v podstatě stejné jako tabulky v paměti díky ukládání do mezipaměti a asynchronnímu I/O a řešení dočasné tabulky nevyžaduje žádnou režii pro převod mezi SQL a PL/SQL.

Potvrzení výsledků

Při porovnání dvou verzí s RunStats verze dočasné tabulky vypadá mnohem horší. Všechen ten odpad pro dočasnou tabulkovou verzi v Run1 a jen trochu paměti navíc pro verzi PL/SQL v Run2. Zpočátku se zdá, že PL/SQL by měl být jasným vítězem.

Type  Name                              Run1 (temp) Run2 (PLSQL)         Diff
----- -------------------------------- ------------ ------------ ------------
...
STAT  physical read bytes                    81,920            0      -81,920
STAT  physical read total bytes              81,920            0      -81,920
LATCH cache buffers chains                  104,663          462     -104,201
STAT  session uga memory                    445,488      681,016      235,528
STAT  KTFB alloc space (block)            2,097,152            0   -2,097,152
STAT  undo change vector size             2,350,188            0   -2,350,188
STAT  redo size                           2,804,516            0   -2,804,516
STAT  temp space allocated (bytes)       12,582,912            0  -12,582,912
STAT  table scan rows gotten             15,499,845            0  -15,499,845
STAT  session pga memory                    196,608   19,857,408   19,660,800
STAT  logical read bytes from cache     299,958,272            0 -299,958,272

Ale na konci dne záleží pouze na nástěnných hodinách. Kroky načítání i dotazování běží mnohem rychleji s dočasnými tabulkami.

Verzi PL/SQL lze vylepšit nahrazením BULK COLLECT s cast(collect(test_o(MOD(a, 10), '' || MOD(a, 12))) as test_t) INTO t . Stále je však výrazně pomalejší než dočasná tabulková verze.

Optimalizované čtení

Čtení z malé dočasné tabulky používá pouze vyrovnávací paměť, která je v paměti. Spusťte pouze část dotazu mnohokrát a sledujte, jak se consistent gets from cache (paměť) se zvýší, zatímco physical reads cache (disk) zůstat stejný.

select name, value
from v$sysstat
where name in ('db block gets from cache', 'consistent gets from cache', 
'physical reads cache');

Optimalizované zápisy

V ideálním případě by neexistoval žádný fyzický vstup/výstup, zejména proto, že dočasná tabulka je ON COMMIT DELETE ROWS . A zdá se, že příští verze Oracle může takový mechanismus zavést. Ale v tomto případě na tom moc nezáleží, nezdá se, že by vstup/výstup disku věci zpomaloval.

Spusťte krok načítání několikrát a poté spusťte select * from v$active_session_history order by sample_time desc; . Většina I/O je BACKGROUND , což znamená, že na něj nic nečeká. Předpokládám, že interní logika dočasné tabulky je jen kopií běžných mechanismů DML. Obecně platí, že nová data tabulky mohou musí být zapsán na disk, pokud je potvrzen. Oracle na tom může začít pracovat, například přesunem dat z vyrovnávací paměti protokolu na disk, ale není kam spěchat, dokud nedojde ke skutečnému COMMIT .

Kam jde čas PL/SQL?

Nemám tušení. Existuje více kontextových přepínačů nebo jedna konverze mezi motory SQL a PL/SQL? Pokud vím, žádná z dostupných metrik neukazuje čas vynaložené na přepínání mezi SQL a PL/SQL.

Možná se nikdy přesně nedozvíme, proč je kód PL/SQL pomalejší. Moc se tím netrápím. Obecná odpověď zní, že drtivá většina databázové práce se stejně musí dělat v SQL. Dávalo by velký smysl, kdyby Oracle věnoval více času optimalizaci jádra své databáze, SQL, než přídavného jazyka PL/SQL.

Další poznámky

Pro testování výkonu může být užitečné odstranit connect by logiku do samostatného kroku. Tento SQL je skvělý trik pro načítání dat, ale může být velmi pomalý a náročný na zdroje. Realističtější je jednou načíst vzorovou tabulku pomocí tohoto triku a poté z této tabulky vložit.

Zkusil jsem použít novou funkci Oracle 12c, dočasné vrácení zpět a novou funkci 18c, soukromé dočasné tabulky. Ani jeden nezlepšil výkon oproti běžným dočasným tabulkám.

Nesázel bych na to, ale vidím způsob, jak by se výsledky s přibývajícími daty úplně změnily. Vyrovnávací paměť protokolu a mezipaměť vyrovnávací paměti mohou být jen tak velké. A nakonec by se I/O na pozadí mohly přidat a přetížit některé procesy, čímž by se BACKGROUND počkejte do FOREGROUND Počkejte. Na druhou stranu je tu jen tolik paměti PGA pro řešení PL/SQL a pak se věci zhroutí.

Konečně to částečně potvrzuje mou skepsi k „in-memory databázím“. Ukládání do mezipaměti není nic nového, databáze to dělají desítky let.



  1. Chybějící indexy v MS SQL nebo optimalizace v žádném okamžiku

  2. Šifrování databáze:Proč a kde potřebujete šifrování dat

  3. Jak chránit databázi heslem v Accessu 2016

  4. DROP TABLE, POKUD EXISTUJE v MariaDB