sql >> データベース >  >> RDS >> Oracle

クエリコスト:グローバル一時テーブルとコレクション(仮想配列)

    グローバル一時テーブルは、他のテーブルと同じように統計を持つことができます。実際、これらは他のテーブルと同様に、一時テーブルスペースにデータセグメントがあります。

    11gでは、統計はグローバルであるため、実行プランで問題が発生することがあります。 12cでは、これらはセッションベースであるため、各セッションは適切なセッションを取得します(利用可能な場合)。

    コレクションタイプのカーディナリティはDBブロックサイズに基づいており、デフォルトでは8kBブロックは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へのアクセスは収集へのアクセスの約2倍であり、テストマシンでは約200ミリ秒であるのに対し400ミリ秒です。行数を10000000に増やすと、ORA-22813が発生しました。2番目のクエリでオペランド値がシステム制限を超えています。



    1. ソケット'/tmp/mysql.sockを介してローカルMySQLサーバーに接続できません

    2. SQLServerデータベースにすべてのストアドプロシージャを一覧表示する3つの方法

    3. PostgreSQLを使用した英数字の並べ替え

    4. MySQLでテーブルの列名を取得しますか?