sql >> Database >  >> RDS >> Oracle

Querykosten:wereldwijde tijdelijke tabellen versus verzamelingen (virtuele arrays)

Globale tijdelijke tabellen kunnen statistieken hebben zoals elke andere tabel. In feite zijn ze net als elke andere tabel, ze hebben datasegmenten, alleen in tijdelijke tabelruimte.

In 11g zijn de statistieken globaal, dus ze veroorzaken soms problemen met uitvoeringsplannen. In 12c zijn ze sessiegebaseerd, dus elke sessie krijgt de juiste (indien beschikbaar).

De kardinaliteit van het verzamelingstype is gebaseerd op de DB-blokgrootte en voor het standaard 8 kB-blok is 8168. De inhoud van de verzameling wordt opgeslagen in PGA. Het is vrij gebruikelijk om de kardinaliteit te hinten bij het gebruik van verzamelingstypen in complexe query's om de optimizer te hinten. U kunt ook de uitgebreide optimalisatie-interface gebruiken voor het implementeren van uw eigen manier om kosten te berekenen.

Bewerken - tests toegevoegd:

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;

In dit geval is de toegang tot GTT ongeveer twee keer zo snel dan tot het ophalen, ca 200 ms versus 400 ms op mijn testmachine. Toen ik het aantal rijen verhoogde tot 10 000 000, kreeg ik ORA-22813:de operandwaarde overschrijdt de systeemlimieten bij de tweede query.



  1. SQL recursieve query die alle voorouders van een item ophaalt

  2. Wat is het verschil tussen CLOB en NCLOB?

  3. Hoe een opgeslagen procedure aan te roepen en de retourwaarde in Slick te krijgen (met behulp van Scala)

  4. Oracle Return Constant wanneer leeg Resultaat