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

Cena dotazu:globální dočasné tabulky vs. kolekce (virtuální pole)

Globální dočasné tabulky mohou mít statistiku jako kterákoli jiná tabulka. Ve skutečnosti jsou jako každá jiná tabulka, mají datové segmenty, jen v dočasném tabulkovém prostoru.

V 11g jsou statistiky globální, takže někdy způsobují problémy s prováděcími plány. V 12c jsou založeny na relaci, takže každá relace dostane ty správné (pokud jsou k dispozici).

Mohutnost typu kolekce je založena na velikosti bloku DB a pro výchozí blok 8 kB je 8168. Obsah kolekce je uložen v PGA. Je docela běžné naznačit mohutnost při použití typů kolekcí ve složitých dotazech k nápovědě pro optimalizátor. Můžete také použít rozšířené rozhraní optimalizátoru pro implementaci vlastního způsobu výpočtu nákladů.

Upravit - přidány testy:

CREATE TYPE STRINGTABLE IS TABLE OF VARCHAR2(255);
CREATE GLOBAL TEMPORARY TABLE TMP (VALUE VARCHAR2(255));

INSERT INTO TMP SELECT 'Value' || LEVEL FROM DUAL CONNECT BY LEVEL <= 1000000;

DECLARE
    x STRINGTABLE;
    cnt NUMBER;
BEGIN
    SELECT VALUE BULK COLLECT INTO x FROM TMP;

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSTIMESTAMP, 'MI:SS.FF3'));

    SELECT SUM(LENGTH(VALUE)) INTO cnt FROM TMP;

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSTIMESTAMP, 'MI:SS.FF3'));

    SELECT SUM(LENGTH(COLUMN_VALUE)) INTO cnt FROM TABLE(x);

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSTIMESTAMP, 'MI:SS.FF3'));
END;

V tomto případě je přístup k GTT asi dvakrát rychlejší než ke sběru, cca 200 ms vs. 400 ms na mém testovacím stroji. Když jsem zvýšil počet řádků na 10 000 000, dostal jsem ORA-22813:hodnota operandu překračuje systémové limity na druhý dotaz.



  1. Jak funguje funkce CONCAT() v PostgreSQL

  2. Otázky ze synchronního node.js

  3. Použití DBCC CLONEDATABASE ke generování kopie schématu a statistik pouze uživatelské databáze v SQL Server 2014 SP2

  4. Vynutit INSERT pouze prostřednictvím uložené procedury