Globala temporära tabeller kan ha statistik som vilken annan tabell som helst. Faktum är att de är som alla andra tabeller, de har datasegment, bara i tillfällig tabellyta.
I 11g är statistiken global så den orsakar ibland problem med genomförandeplaner. I 12c är de sessionsbaserade så varje session får korrekta (om tillgängliga).
Insamlingstypens kardinalitet baseras på DB-blockstorlek och som standard är 8 kB-blocket 8168. Samlingsinnehåll lagras i PGA. Det är ganska vanligt att antyda kardinalitet när man använder samlingstyper i komplexa frågor för att antyda optimeraren. Du kan också använda utökat optimeringsgränssnitt för att implementera ett eget sätt för kostnadsberäkning.
Redigera - tillagda tester:
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 det här fallet är tillgången till GTT ungefär dubbelt så snabb än till samlingen, ca 200 ms mot 400 ms på min testmaskin. När jag ökade antalet rader till 10 000 000 fick jag ORA-22813:operandvärdet överskrider systemgränserna i den andra frågan.