24 SQLチューニング・セットの管理

SQLチューニング・セットを使用して、文および関連メタデータを単一のオブジェクトにグループ化し、それをSQLチューニング・ツールへの入力として使用できます。

この章のトピックは、次のとおりです:

24.1 SQLチューニング・セットについて

SQLチューニング・セット(STS)は、チューニング・ツールへの入力として使用できるデータベース・オブジェクトです。

このデータベースは、SQLチューニング・セットをデータベース提供のスキーマに格納します。STSには次が含まれます。

  • SQL文のセット

  • 関連する実行コンテキスト(ユーザー・スキーマ、アプリケーション・モジュール名およびアクション、バインド値のリストおよびカーソルのSQLのコンパイルの環境など)

  • 関連する基本実行統計(経過時間、CPUタイム、バッファ読取り、ディスク読取り、処理された行数、カーソル・フェッチ、実行数、実行完了数、オプティマイザ・コストおよびコマンドのタイプなど)

  • 各SQL文の関連実行計画と行ソース統計(オプション)

ノート:

STSをプラガブル・データベースとともに使用すると、データの可視性と権限の要件が一致しない場合があります。コンテナ・データベース(CDB)内での管理機能の動作をまとめた表が記載されている『Oracle Database管理者ガイド』を参照してください。

この項では、次の項目について説明します。

24.1.1 SQLチューニング・セットの目的

STSを使用すると、SQL文と関連するメタデータを単一のデータベース・オブジェクトにグループ化し、そのオブジェクトを使用してチューニングに関する目標を達成できます。

具体的には、SQLチューニング・セットによって次の目標が達成されます。

  • パフォーマンス・チューニング・アドバイザへの入力の提供

    STSは、SQLチューニング・アドバイザ、SQLアクセス・アドバイザ、SQLパフォーマンス・アナライザなど、複数のデータベース・アドバイザの入力として使用できます。

  • データベース間でのSQLの転送

    SQLチューニングセットを別のデータベースにエクスポートすることで、SQLワークロードをデータベース間で転送してリモート・パフォーマンス診断およびチューニングを実行できます。本番データベースにパフォーマンスが最適でないSQL文がある場合、開発者が直接本番システム上で調査およびチューニングを実行することは望ましくありません。DBAにより、開発者が安全に分析およびチューニングできるテスト用データベースに、問題のあるSQL文を転送できます。

24.1.2 SQLチューニング・セットの概念

STSを作成するには、SQL文をソースからSTSにロードする必要があります。

図24-1に示すとおり、使用可能なソースには、自動ワークロード・リポジトリ(AWR)、共有SQL領域、ユーザーによって提供されたカスタマイズ済のSQL、トレース・ファイル、他のSTSなどがあります。

図24-1 SQLチューニング・セット

図24-1の説明が続きます
「図24-1 SQLチューニング・セット」の説明

SQLチューニング・セットでは、次の操作を実行できます。

  • アプリケーション・モジュール名とアクション、または任意の実行統計を使用して、SQL文をフィルタできます。

  • SQL文を実行統計の任意の組合せに基づいてランク付けできます。

  • アドバイザの入力として使用したり、それを異なるデータベースに転送したりできます。

関連項目:

AWRについて学習するには、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください

24.1.3 SQLチューニング・セットのユーザー・インタフェース

Oracle Enterprise Manager Cloud Control (Cloud Control)またはPL/SQLパッケージを使用すると、SQLチューニング・セットを管理できます。Cloud Controlをお薦めします。

この項では、次の項目について説明します。

24.1.3.1 Cloud Controlでの「SQLチューニング・セット」ページへのアクセス

Cloud ControlのSQLチューニング・セット・ページは、SQLチューニング・セットに関係する多くの操作を実行できる開始ページです。

SQLチューニング・セット・ページにアクセスするには:

  1. 適切な資格証明を使用してCloud Controlにログインします。

  2. 「ターゲット」メニューの下で、「データベース」を選択します。

  3. データベース・ターゲットのリストで、管理対象のOracle Databaseインスタンスのターゲットを選択します。

  4. データベースの資格証明の入力を求められた場合は、実行するタスクに必要な最小限の資格証明を入力します。

  5. 「パフォーマンス」メニューから「SQL」を選択し、さらに「SQLチューニング・セット」を選択します。

    SQLチューニング・セット・ページは、図24-2のように表示されます。

    図24-2 SQLチューニング・セット

    図24-2の説明が続きます
    「図24-2 SQLチューニング・セット」の説明
24.1.3.2 SQLチューニング・セットへのコマンドライン・インタフェース

コマンドラインでは、DBMS_SQLTUNEまたはDBMS_SQLSETパッケージを使用してSQLチューニング・セットを管理できます。

所有するSQLチューニング・セットを管理するためのADMINISTER SQL TUNING SETシステム権限が必要です。または、任意のSQLチューニング・セットを管理するためのADMINISTER ANY SQL TUNING SETシステム権限が必要です。

SQLチューニング・セットを管理するための従来のパッケージはDBMS_SQLTUNEで、これにはOracle Tuning Packが必要です。Oracle Database 18c以降では、DBMS_SQLSETで同じタスクを実行できるため、Oracle Tuning Packは必要ありません。ほとんどの場合、DBMS_SQLSETのサブプログラムの名前は、DBMS_SQLTUNEにある同等のサブプログラムの名前と同じです。次の表には、名前が異なる場合サブプログラムのみ示しています。

表24-1 SQLチューニング・セット・サブプログラムにおける名前の違い

DBMS_SQLTUNE DBMS_SQLSET
ADD_SQLSET_REFERENCE ADD_REFERENCE
CAPTURE_CURSOR_CACHE_SQLSET CAPTURE_CURSOR_CACHE
CREATE_STGTAB_SQLSET CREATE_STGTAB
PACK_STGTAB_SQLSET PACK_STGTAB
REMAP_STGTAB_SQLSET REMAP_STGTAB
REVOVE_SQLSET_REFERENCE REMOVE_REFERENCE
UNPACK_STGTAB_SQLSET UNPACK_STGTAB

関連項目:

DBMS_SQLTUNEパッケージおよびDBMS_SQLSETパッケージについて学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

24.1.4 SQLチューニング・セットを管理するための基本タスク

DBMS_SQLTUNEまたはDBMS_SQLSETを使用して、SQLチューニング・セットを作成、使用および削除できます。多くの場合、これらのパッケージ内の関連するサブプログラムの名前は同じです。

次の図は、基本ワークフローを示しています。

図24-3 SQLチューニング・セットAPI

図24-3の説明が続きます
「図24-3 SQLチューニング・セットAPI」の説明

通常、STS操作を実行する順序は次のとおりです。

  1. 新規STSを作成します。

    このタスクについては、「CREATE_SQLSETを使用したSQLチューニング・セットの作成」を参照してください。

  2. そのSTSをSQL文および関連するメタデータとともにロードします。

    このタスクについては、「LOAD_SQLSETを使用したSQLチューニング・セットのロード」を参照してください。

  3. オプションで、STSの内容を表示します。

    このタスクについては、「SQLチューニング・セットの問合せ」を参照してください。

  4. オプションで、STSの内容を更新または削除します。

    このタスクについては、「UPDATE_SQLSETを使用したSQLチューニング・セットの変更」を参照してください。

  5. 入力にSTSを使用してチューニング・タスクを作成します。

  6. オプションで、他のデータベースにSTSを転送します。

    このタスクについては、「SQLチューニング・セットの転送」を参照してください。

  7. 完了時にSTSを削除します。

    このタスクについては、「DROP_SQLSETを使用したSQLチューニング・セットの削除」を参照してください。

関連項目:

DBMS_SQLSETで同等のサブプログラムの名前については、SQLチューニング・セットへのコマンドライン・インタフェースを参照してください

24.2 CREATE_SQLSETを使用したSQLチューニング・セットの作成

DBMS_SQLTUNEおよびDBMS_SQLSETCREATE_SQLSETプロシージャを使用して、データベースに空のSTSを作成します。

プロシージャのかわりにファンクションを使用すると、データベースによってSTSの名前が生成されます。次の表では、一部のプロシージャ・パラメータを説明します。

表24-2 DBMS_SQLSET.CREATE_SQLSETのパラメータ

パラメータ 説明

sqlset_name

STSの名前

description

STSに関するオプションの説明

前提条件

このチュートリアルの前提は次のとおりです。

  • SQLT_WKLD_STSという名前のSTSを作成します。

  • DBMS_SQLSETのかわりにDBMS_SQLTUNEを使用します。

STSを作成するには:

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. DBMS_SQLSET.CREATE_SQLSETプロシージャを使用します。

    たとえば、次のPL/SQLプログラムを実行します。

    BEGIN
      DBMS_SQLSET.CREATE_SQLSET (
        sqlset_name  => 'SQLT_WKLD_STS' 
    ,   description  => 'STS to store SQL from the private SQL area' 
    );
    END;
    
  3. オプションで、STSが作成されたことを確認します。

    次の例では、現行のユーザーによって所有されているすべてのSQLチューニング・セットのステータスを問い合せます。

    COLUMN NAME FORMAT a20
    COLUMN COUNT FORMAT 99999
    COLUMN DESCRIPTION FORMAT a11
    
    SELECT NAME, STATEMENT_COUNT AS "SQLCNT", DESCRIPTION
    FROM   USER_SQLSET;
    

    出力例は次のように表示されます。

    NAME                 SQLCNT DESCRIPTION
    -------------------- ------ -----------
    SQLT_WKLD_STS             2 SQL Cache

関連項目:

詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください

24.3 LOAD_SQLSETを使用したSQLチューニング・セットのロード

STSにSQL文をロードするには、DBMS_SQLTUNEまたはDBMS_SQLSETパッケージのLOAD_SQLSETプロシージャを使用します。

STSにデータを移入するための標準ソースは、AWR、他のSTSまたは共有SQL領域です。ワークロード・リポジトリおよびSQLチューニング・セットのどちらの場合も、事前定義済のテーブル・ファンクションにより、新しいSTSに移入する列をソースから選択できます。

次の表では、DBMS_SQLSET.LOAD_SQLSETプロシージャのパラメータをいくつか説明します。

表24-3 DBMS_SQLSET.LOAD_SQLSETのパラメータ

パラメータ 説明

populate_cursor

STSの入力に使用するカーソル参照を指定します。

load_option

STSへの文のロード方法を指定します。指定可能な値は、INSERT (デフォルト)、UPDATEおよびMERGEです。

DBMS_SQLSET.SELECT_CURSOR_CACHEファンクションは、指定されたフィルタに従って、SQL文を共有SQL領域から収集します。このファンクションは、各データ・ソースで検出されるSQL IDまたはPLAN_HASH_VALUEの組合せごとに1つのSQLSET_ROWを戻します。

DBMS_SQLSET.CAPTURE_CURSOR_CACHE_SQLSETファンクション(または同等のDBMS_SQLSET.CAPTURE_CURSOR_CACHE)を使用して、指定した間隔で共有SQL領域を繰り返しポーリングします。このファンクションは、SELECT_CURSOR_CACHEおよびLOAD_SQLSETプロシージャを繰り返しコールする場合よりも効率的です。また、高負荷SQL文のワークロードのみを取得するAWR、またはデータ・ソースに1回のみアクセスするLOAD_SQLSETプロシージャとは対照的に、ワークロード全体を効果的に取得します。

前提条件

このチュートリアルの前提条件は、次のとおりです。

  • SELECT_CURSOR_CACHEファンクションで提供されるフィルタは、現行のユーザーが実行するSQL文の一部として評価されます。したがって、それらのフィルタは、ユーザーのセキュリティ権限で実行され、ユーザーがアクセスできるすべての構成メンバーおよび副問合せを含んでいますが、それ以外のものは含んでいません。

  • 現行のユーザーは、共有SQL領域のビューに対する権限を持っている必要があります。

前提条件

このチュートリアルでは、次のことが前提となっています。

  • SQLT_WKLD_STSという名前のSQLチューニング・セットに共有SQL領域の文をロードするものとします。

  • DBMS_SQLTUNEのかわりにDBMS_SQLSETを使用してSTSをロードするとします。

STSをロードするには:

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. DBMS_SQLSET.LOAD_SQLSETプロシージャを実行します。

    たとえば、次のPL/SQLプログラムを実行すると、shスキーマに属するすべてのカーソル・キャッシュ文をSQLチューニング・セットに移入できます。

    DECLARE
      c_sqlarea_cursor DBMS_SQLSET.SQLSET_CURSOR;
    BEGIN
     OPEN c_sqlarea_cursor FOR
       SELECT VALUE(p)
       FROM   TABLE( 
                DBMS_SQLSET.SELECT_CURSOR_CACHE(
                ' module = ''SQLT_WKLD'' AND parsing_schema_name = ''SH'' ')
              ) p;
    -- load the tuning set
      DBMS_SQLSET.LOAD_SQLSET (  
        sqlset_name     => 'SQLT_WKLD_STS'
    ,   populate_cursor =>  c_sqlarea_cursor 
    );
    END;
    /

関連項目:

詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

24.4 SQLチューニング・セットの問合せ

作成および移入したSTSの内容を表示するには、DBMS_SQLTUNEまたはDBMS_SQLSETSELECT_SQLSETファンクションを使用し、オプションでフィルタ条件を使用します。

PL/SQL パイプライン・テーブル・ファンクションを使用するSELECT_SQLSETの出力を選択し、行のコレクションを入力として受け入れます。SELECT文のFROMリストで表演算子のオペランドとしてテーブル・ファンクションを起動します。次の表では、SELECT_SQLSETファンクション・パラメータの一部を説明します。

表24-4 DBMS_SQLTUNE.SELECT_SQLSETのパラメータ

パラメータ 説明

basic_filter

SQLSET_ROWの属性に対して定義されたSTSからSQLをフィルタするためのSQL述語。

object_filter

共有SQL領域から選択されたSQLのオブジェクト・リストに含まれるオブジェクトを指定します。

次の表に、SQLSET_ROWオブジェクトの一部の属性の説明を示します。これらの属性は、TABLE(DBMS_SQLTUNE.SELECT_SQLSET())を問い合せたときに列として表示されます。

表24-5 SQLSET_ROWの属性

パラメータ 説明

parsing_schema_name

SQLの解析が行われるスキーマ

elapsed_time

このSQL文で経過した秒数の合計

buffer_gets

このSQL文のバッファ取得回数(データベースがブロックにアクセスした回数)の合計

前提条件

このチュートリアルでは、次のことが前提となっています。

  • SQLT_WKLD_STSという名前のSTSの内容を表示します。

  • DBMS_SQLSETのかわりにDBMS_SQLTUNEを使用しています。

STSの内容を表示するには:

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. TABLEファンクションを使用してSTSの内容を問い合せます。

    たとえば、次の問合せを実行します。

    COLUMN SQL_TEXT FORMAT a30   
    COLUMN SCH FORMAT a3
    COLUMN ELAPSED FORMAT 999999999
    
    SELECT SQL_ID, PARSING_SCHEMA_NAME AS "SCH", SQL_TEXT, 
           ELAPSED_TIME AS "ELAPSED", BUFFER_GETS
    FROM   TABLE( DBMS_SQLTUNE.SELECT_SQLSET( 'SQLT_WKLD_STS' ) );
    

    出力例は次のように表示されます。

    SQL_ID        SCH SQL_TEXT                          ELAPSED BUFFER_GETS
    ------------- --- ------------------------------ ---------- -----------
    79f8shn041a1f SH  select * from sales where quan    8373148       24016
                      tity_sold < 5 union select * f
                      rom sales where quantity_sold
                      > 500
     
    2cqsw036j5u7r SH  select promo_name, count(*) c     3557373         309
                      from promotions p, sales s whe
                      re s.promo_id = p.promo_id and
                       p.promo_category = 'internet'
                       group by p.promo_name order b
                      y c desc
     
    fudq5z56g642p SH  select sum(quantity_sold) from    4787891       12118
                       sales s, products p where s.p
                      rod_id = p.prod_id and s.amoun
                      t_sold > 20000 and p.prod_name
                       = 'Linen Big Shirt'
     
    bzmnj0nbvmz8t SH  select * from sales where amou     442355       15281
                      nt_sold = 4
    
  3. オプションで、ユーザー固有の条件に基づいて結果をフィルタします。

    次の例では、バッファ取得に対するディスク読取りの比率が50%以上の文を表示します。

    COLUMN SQL_TEXT FORMAT a30   
    COLUMN SCH FORMAT a3
    COLUMN BUF_GETS FORMAT 99999999
    COLUMN DISK_READS FORMAT 99999999
    COLUMN %_DISK FORMAT 9999.99
    SELECT sql_id, parsing_schema_name as "SCH", sql_text, 
           buffer_gets as "B_GETS",
           disk_reads as "DR", ROUND(disk_reads/buffer_gets*100,2) "%_DISK"
    FROM TABLE( DBMS_SQLTUNE.SELECT_SQLSET( 
                'SQLT_WKLD_STS',
                '(disk_reads/buffer_gets) >= 0.50' ) );
    

    出力例は次のように表示されます。

    
    SQL_ID        SCH SQL_TEXT                       B_GETS DR      %_DISK
    ------------- --- ------------------------------ ------ ------- -------
    79f8shn041a1f SH  select * from sales where quan  24016   17287  71.98
                      tity_sold < 5 union select * f
                      rom sales where quantity_sold
                      > 500
     
    fudq5z56g642p SH  select sum(quantity_sold) from  12118    6355  52.44
                       sales s, products p where s.p
                      rod_id = p.prod_id and s.amoun
                      t_sold > 20000 and p.prod_name
                       = 'Linen Big Shirt'

関連項目:

詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください

24.5 UPDATE_SQLSETを使用したSQLチューニング・セットの変更

DBMS_SQLTUNEまたはDBMS_SQLSETUPDATE_SQLSETプロシージャを使用して、STSからSQL文を削除します。

UPDATE_SQLSETプロシージャを使用すると、STS名およびSQL IDで識別される既存のSTS内のSQL文の属性(PRIORITYまたはOTHERなど)を更新できます。

前提条件

このチュートリアルでは、SQLT_WKLD_STSを次のように変更するものとします。

  • フェッチ回数が100を超えるすべてのSQL文を削除します。

  • IDがfudq5z56g642pのSQL文の優先順位を1に変更します。優先順位は、SQLチューニング・アドバイザを実行するときのランク付け基準として使用できます。

  • DBMS_SQLTUNEのかわりにDBMS_SQLSETを使用します。

STSの内容を変更するには:

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. オプションで、TABLEファンクションを使用してSTSの内容を問い合せます。

    たとえば、次の問合せを実行します。

    SELECT SQL_ID, ELAPSED_TIME, FETCHES, EXECUTIONS
    FROM   TABLE(DBMS_SQLSET.SELECT_SQLSET('SQLT_WKLD_STS'));
    

    出力例は次のように表示されます。

    SQL_ID        ELAPSED_TIME    FETCHES EXECUTIONS
    ------------- ------------ ---------- ----------
    2cqsw036j5u7r      3407459          2          1
    79f8shn041a1f      9453965      61258          1
    bzmnj0nbvmz8t       401869          1          1
    fudq5z56g642p      5300264          1          1
    
  3. ユーザー固有の条件に基づいてSQL文を削除します。

    SQLSET_ROWの属性に対して定義されたSTSからSQLをフィルタするには、basic_filter述語を使用します。次の例では、フェッチ回数が100を超えるSTS内の文をすべて削除します。

    BEGIN
      DBMS_SQLSET.DELETE_SQLSET (
          sqlset_name  => 'SQLT_WKLD_STS'
    ,     basic_filter => 'fetches > 100'
    );
    END;
    /
    
  4. SQL文の属性値を設定します。

    次の例では、文2cqsw036j5u7rの優先順位を1に設定します。

    BEGIN
      DBMS_SQLSET.UPDATE_SQLSET ( 
          sqlset_name     => 'SQLT_WKLD_STS'    
    ,     sql_id          => '2cqsw036j5u7r'    
    ,     attribute_name  => 'PRIORITY'         
    ,     attribute_value =>  1
    );
    END;
    /
    
  5. オプションで、STSを問い合せて、目的の変更が加えられたことを確認します。

    たとえば、次の問合せを実行します。

    SELECT SQL_ID, ELAPSED_TIME, FETCHES, EXECUTIONS, PRIORITY
    FROM   TABLE(DBMS_SQLSET.SELECT_SQLSET('SQLT_WKLD_STS'));
    

    出力例は次のように表示されます。

    SQL_ID        ELAPSED_TIME    FETCHES EXECUTIONS   PRIORITY
    ------------- ------------ ---------- ---------- ----------
    2cqsw036j5u7r      3407459          2          1          1
    bzmnj0nbvmz8t       401869          1          1
    fudq5z56g642p      5300264          1          1

24.6 SQLチューニング・セットの転送

Oracle Database 10gリリース2 (10.2)以降で作成された任意のデータベースにSTSを転送できます。これは、SQLパフォーマンス・アナライザを使用してテスト用データベースで回帰をチューニングする場合に役立ちます。

この項では、次の項目について説明します。

24.6.1 SQLチューニング・セットの転送について

データベース間のSQLチューニング・セットの転送は、SQLチューニング・セットとステージング表間でコピーして、他のツールを使用してステージング表を宛先データベースに移行することを意味します。最も一般的なツールは、Oracle Data Pumpまたはデータベース・リンクです。

この項では、次の項目について説明します。

24.6.1.1 SQLチューニング・セットを転送するための基本ステップ

SQLチューニング・セットの転送には、STSのエクスポート、ダンプ・ファイルの転送、およびその後のダンプ・ファイルのインポートが必要です。

次の図は、Oracle Data Pumpおよびftpを使用したプロセスを示しています。

図24-4 SQLチューニング・セットの転送

図24-4の説明が続きます
「図24-4 SQLチューニング・セットの転送」の説明

図24-4に示すとおり、次のようなステップがあります。

  1. 本番データベースで、DBMS_SQLTUNE.PACK_STGTAB_SQLSETまたはDBMS_SQLSET.PACK_STGTABを使用してSTSをステージング表にパックします。

  2. Oracle Data Pumpを使用して、STSをステージング表から.dmpファイルにエクスポートします。

  3. ftpなどの転送ツールを使用して本番ホストからテスト・ホストに.dmpファイルを転送します。

  4. テスト・データベースで、Oracle Data Pumpを使用して、STSを.dmpファイルからステージング表にインポートします。

  5. DBMS_SQLTUNE.UNPACK_STGTAB_SQLSETまたはDBMS_SQLSET.UNPACK_STGTABを使用して、STSをステージング表からアンパックします。

24.6.1.2 CON_DBIDの値が異なる場合にSQLチューニング・セットを転送するための基本ステップ

STSを転送する際、ソース・データベースと宛先データベースのcon_dbidが異なる場合は、STSの各SQL文のcon_dbidを再マップする必要があります。

con_dbidの値に違いが出る状況には、次のようなものがあります。

  • 単一インスタンス・データベースで、インスタンスが再起動された場合

  • Oracle RACデータベースのインスタンスが異なる場合

  • PDBが異なる場合

  • 一方がCDB以外で、もう一方がCDBの場合

再マップの基本ステップは次のとおりです。

  1. DBMS_SQLTUNE.PACK_STGTAB_SQLSETまたはDBMS_SQLSET.PACK_STGTABを使用してSTSをステージング表にパックします。

  2. DBMS_SQLTUNE.REMAP_STGTAB_SQLSETまたはDBMS_SQLSET.REMAP_STGTABを使用して、ステージング表内の各con_dbidを再マップします。

  3. STSをエクスポートします。

  4. 転送先のCDBでSTSをアンパックします。

例24-1 CDB以外からCDBへSTSを転送する際のCON_DBIDの再マップ

この例では、STS_for_transportという名前のSTSをCDB以外からCDBへ転送しようとしています。CDBではないソースでは、DBMS_SQLTUNE.PACK_STGTAB_SQLSETプロシージャを使用して、ソース・ステージング表src_stg_tblに、すでにSTSをパックしてあります。宛先CDBのコンテナIDは12345です。

CDBではないソースで、次のコマンドを実行します。

VARIABLE con_dbid_src NUMBER;

EXEC SELECT UNIQUE con_dbid INTO :con_dbid_src FROM src_stg_tbl;

BEGIN
  DBMS_SQLTUNE.REMAP_STGTAB_SQLSET (
    staging_table_name   => 'src_stg_tbl'
,   staging_schema_owner => 'dba1'
,   old_sqlset_name      => 'STS_for_transport'
,   old_con_dbid         => :con_dbid_src
,   new_con_dbid         => 12345);
END;

これで、ステージング表のコンテンツをエクスポートし、通常の転送手順で続行できます。

関連項目:

REMAP_STGTAB_SQLSETについて学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください

24.6.2 DBMS_SQLTUNEを使用したSQLチューニング・セットの転送

SQLチューニング・セットを転送するには、DBMS_SQLTUNEまたはDBMS_SQLSETパッケージの3つのサブプログラムを使用します。

次の表に、SQLチューニング・セットの転送に関連するプロシージャの説明を示します。

表24-6 SQLチューニング・セットを転送するためのプロシージャ

DBMS_SQLTUNEプロシージャ 同等のDBMS_SQLSETプロシージャ 説明

CREATE_STGTAB_SQLSET

CREATE_STGTAB

エクスポートされたSQLチューニング・セットを保持するステージング表を作成します。

PACK_STGTAB_SQLSET

PACK_STGTAB

ステージング表にSQLチューニング・セットを移入します。

UNPACK_STGTAB_SQLSET

UNPACK_STGTAB

SQLチューニング・セットをステージング表からデータベースにコピーします。

前提条件

このチュートリアルでは、次のことが前提となっています。

  • 現在のリリースで作成した本番データベースに、低下したSQLを含むSTSが存在する場合。

  • Oracle Database 11gリリース2 (11.2)で作成したリモートのテスト用データベースでSQLパフォーマンス・アナライザの試行を実行します。

  • STSを本番データベースからテスト用データベースにコピーして、SQLパフォーマンス・アナライザの試行で回帰をチューニングする場合。

  • Oracle Database Pumpを使用して、データベース・ホスト間でSQLチューニング・セットを転送する場合。

  • DBMS_SQLSETのかわりにDBMS_SQLTUNEを使用します。

STSを転送するには:

  1. SQL*PlusまたはSQL Developerで、管理者権限を持つユーザーとしてデータベースにログインします。

  2. CREATE_STGTAB_SQLSETプロシージャを使用して、エクスポートされたSQLチューニング・セットを保持するステージング表を作成します。

    次の例では、dba1my_11g_staging_tableを作成し、ステージング表の形式を11.2に指定します。

    BEGIN
      DBMS_SQLTUNE.CREATE_STGTAB_SQLSET ( 
        table_name  => 'my_10g_staging_table'
    ,   schema_name => 'dba1'
    ,   db_version  => DBMS_SQLTUNE.STS_STGTAB_11_2_VERSION 
    );
    END;
    /
    
  3. PACK_STGTAB_SQLSETプロシージャを使用して、ステージング表にSQLチューニング・セットを移入します。

    次の例では、dba1.my_11g_staging_tableに、hrが所有するSTS my_stsを移入します。

    BEGIN
      DBMS_SQLTUNE.PACK_STGTAB_SQLSET (      
        sqlset_name         => 'sqlt_wkld_sts'
    ,   sqlset_owner        => 'sh'
    ,   staging_table_name  => 'my_11g_staging_table'
    ,   staging_schema_owner => 'dba1'
    ,   db_version          => DBMS_SQLTUNE.STS_STGTAB_11_2_VERSION 
    );
    END;
    / 
    
  4. 必要な場合は、「CON_DBIDの値が異なる場合にSQLチューニング・セットを転送するための基本ステップ」の説明に従って、STSの各文のコンテナID値を再マップします。

  5. Oracle Data Pumpを使用して、ステージング表のコンテンツをエクスポートします。

    たとえば、オペレーティング・システム・プロンプトでexpdpコマンドを実行します。

    expdp dba1 DIRECTORY=dpump_dir1 DUMPFILE=sts.dmp TABLES=my_11g_staging_table
    
  6. dumpファイルをテスト・データベースのホストに転送します。

  7. 管理者としてテスト・ホストにログインし、Oracle Data Pumpを使用してステージング表の内容をインポートします。

    たとえば、オペレーティング・システム・プロンプトでimpdpコマンドを実行します。

    impdp dba1 DIRECTORY=dpump_dir1 DUMPFILE=sts.dmp TABLES=my_11g_staging_table 
    
  8. テスト・データベースで、UNPACK_STGTAB_SQLSETプロシージャを使用してステージング表からデータベースにSQLチューニング・セットをコピーします。

    次の例は、SQLチューニング・セットをアンパックする方法を示しています。

    BEGIN
      DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET (
        sqlset_name        => '%'
    ,   replace            => true
    ,   staging_table_name => 'my_11g_staging_table');
    END;
    /

関連項目:

DBMS_SQLTUNE.UNPACK_STGTAB_SQLSETについてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください

24.7 DROP_SQLSETを使用したSQLチューニング・セットの削除

データベースからSTSを削除するには、DBMS_SQLTUNEまたはDBMS_SQLSETパッケージのDROP_SQLSETプロシージャを使用します。

前提条件

削除するSTSがチューニング・タスクによって現在使用されていないことを確認します。既存のチューニング・タスクがこのSTSを使用している場合は、STSを削除する前に、そのタスクを削除します。削除しないと、データベースからORA-13757エラーが発行されます。

前提条件

このチュートリアルでは、次のことが前提となっています。

  • SQLT_WKLD_STSという名前のSTSを削除します。

  • DBMS_SQLTUNEのかわりにDBMS_SQLSETを使用します。

STSを削除するには:

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. DBMS_SQLSET.DROP_SQLSETプロシージャを使用します。

    たとえば、次のPL/SQLプログラムを実行します。

    BEGIN
      DBMS_SQLSET.DROP_SQLSET( sqlset_name => 'SQLT_WKLD_STS' );
    END;
    /
    
  3. オプションで、STSが削除されたことを確認します。

    次の例では、現行のユーザーによって所有されているSQLT_WKLD_STSという名前のSQLチューニング・セットの数をカウントします(出力例も示します)。

    SELECT COUNT(*) 
    FROM   USER_SQLSET 
    WHERE  NAME = 'SQLT_WKLD_STS';
    
      COUNT(*)
    ----------
             0

関連項目:

DBMS_SQLSETのSTSプロシージャについて学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。