sql >> Database teknologi >  >> RDS >> Oracle

Forespørgselsomkostninger:Globale midlertidige tabeller vs. samlinger (virtuelle arrays)

Globale midlertidige tabeller kan have statistik som enhver anden tabel. Faktisk er de ligesom enhver anden tabel, de har datasegmenter, bare i midlertidig tablespace.

I 11g er statistikken globale, så de forårsager nogle gange problemer med eksekveringsplaner. I 12c er de sessionsbaserede, så hver session får de rigtige (hvis de er tilgængelige).

Indsamlingstypens kardinalitet er baseret på DB-blokstørrelse og som standard er 8 kB-blok 8168. Samlingsindhold gemmes i PGA. Det er ret almindeligt at antyde kardinaliteten, når du bruger samlingstyper i komplekse forespørgsler for at antyde optimeringsværktøjet. Du kan også bruge udvidet optimeringsgrænseflade til at implementere din egen måde at beregne omkostninger på.

Rediger - tilføjede tests:

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;

I dette tilfælde er adgangen til GTT cirka dobbelt så hurtig end til samling, ca. 200 ms vs. 400 ms på min testmaskine. Da jeg øgede antallet af rækker til 10.000.000, fik jeg ORA-22813:operandværdien overstiger systemgrænserne på den anden forespørgsel.



  1. Hvordan vi kan bruge mysql_affected_rows() i lagret procedure

  2. 25 Microsoft Access-genveje for at spare tid i tabeller i dataarkvisning

  3. Postgres:Begrænsning med kun check på INSERT

  4. 5 tricks til at sikre SQL Server Peak Performance