Oracle
 sql >> база данни >  >> RDS >> Oracle

Разходи за заявка:Глобални временни таблици срещу колекции (виртуални масиви)

Глобалните временни таблици могат да имат статистика като всяка друга таблица. Всъщност те са като всяка друга таблица, имат сегменти от данни, само във временно таблично пространство.

В 11g статистиката е глобална, така че понякога причинява проблеми с плановете за изпълнение. В 12c те са базирани на сесия, така че всяка сесия получава подходящи (ако има такива).

Кардиналността на типа колекция се основава на размера на DB блока и за блока от 8 kB по подразбиране е 8168. Съдържанието на колекцията се съхранява в PGA. Доста обичайно е да се подсказва кардиналността, когато се използват типове колекция в сложни заявки, за да се подскаже оптимизаторът. Можете също да използвате разширен интерфейс на оптимизатор за прилагане на собствен начин за изчисляване на разходите.

Редактиране - добавени тестове:

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;

В този случай достъпът до GTT е около два пъти по-бърз от този до събирането, около 200 ms срещу 400 ms на моята тестова машина. Когато увеличих броя на редовете до 10 000 000, получих ORA-22813:стойността на операнда надвишава системните ограничения при втората заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземане на дъмп на таблици в oracle 10g чрез PL/SQL процедура

  2. търсене в база данни на oracle с помощта на php

  3. Как да анализирате ефективно json в Oracle 18c?

  4. Въведете подзаявки ORM

  5. Оператор ALL VS Any при празна заявка