sql >> Base de Datos >  >> RDS >> Oracle

Costo de la consulta:Tablas Temporales Globales vs. Colecciones (Arreglos Virtuales)

Las tablas temporales globales pueden tener estadísticas como cualquier otra tabla. De hecho, son como cualquier otra tabla, tienen segmentos de datos, solo en un espacio de tabla temporal.

En 11g, las estadísticas son globales, por lo que a veces causan problemas con los planes de ejecución. En 12c, se basan en sesiones, por lo que cada sesión obtiene las adecuadas (si están disponibles).

La cardinalidad del tipo de colección se basa en el tamaño del bloque DB y el bloque predeterminado de 8 kB es 8168. El contenido de la colección se almacena en PGA. Es bastante común insinuar la cardinalidad cuando se usan tipos de colección en consultas complejas para insinuar el optimizador. También puede usar la interfaz del optimizador extendido para implementar su propia forma de calcular el costo.

Editar - pruebas agregadas:

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;

En este caso, el acceso a GTT es aproximadamente el doble de rápido que a la recopilación, aproximadamente 200 ms frente a 400 ms en mi máquina de prueba. Cuando aumenté el número de filas a 10 000 000, obtuve ORA-22813:el valor del operando supera los límites del sistema en la segunda consulta.