Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Custo da consulta:tabelas temporárias globais x coleções (matrizes virtuais)


As tabelas temporárias globais podem ter estatísticas como qualquer outra tabela. Na verdade eles são como qualquer outra tabela, eles possuem segmentos de dados, apenas em tablespace temporário.

No 11g, as estatísticas são globais, por isso às vezes causam problemas com os planos de execução. Em 12c, eles são baseados em sessão, para que cada sessão receba os apropriados (se disponíveis).

A cardinalidade do tipo de coleção é baseada no tamanho do bloco de banco de dados e, por padrão, o bloco de 8 kB é 8168. O conteúdo da coleção é armazenado no PGA. É bastante comum sugerir a cardinalidade ao usar tipos de coleção em consultas complexas para sugerir o otimizador. Você também pode usar a interface otimizada estendida para implementar a própria maneira de calcular o custo.

Editar - testes adicionados:
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;

Neste caso é o acesso ao GTT cerca de duas vezes mais rápido que a coleta, cca 200 ms vs. 400 ms na minha máquina de teste. Quando aumentei o número de linhas para 10.000.000, obtive ORA-22813:o valor do operando excede os limites do sistema na segunda consulta.