パフォーマンス・チューニング

この項では、MongoDBのためのOracle Database APIを使用する場合のパフォーマンスを分析および改善するための手法の概要を示します。補足的なガイダンスについては、「索引」の項を参照してください。

$nativeヒント

$nativeヒントを使用して、MongoDBのためのOracle Database APIによって生成されたSQLにヒントを追加します。findaggregateなどのヒントを適用するMongoDBコマンドで、$nativeを使用します。ヒントを{"$native":<hint>}として指定します。<hint>は、生成された文に適用されるSQLヒントです。

例:

db.employees.aggregate(
  [{"$count":"cnt"}], 
  {"hint" : {"$native":"PARALLEL"}}
);

この例では、パラレル実行をリクエストするために、生成されたSQLにSQLヒントPARALLELが追加されます。

$serviceヒント

$serviceヒントは、Autonomous Databaseでのみ使用します。デフォルトでは、MongoDBコマンドはLOWコンシューマ・グループで実行されます。コマンドのコンシューマ・グループを切り替えるには、$serviceを指定します。内部的には、MongoDBのためのOracle Database APIによってCS_SESSION.SWITCH_SERVICE()が起動され、コンシューマ・グループが変更されます。ヒントを{"$service":<service_name>}として指定します。<service_name>HIGHMEDIUMLOWTPまたはTPURGENTです。接続ユーザーには、CS_SESSIONEXECUTEが必要です。権限が付与されていない場合、コマンドはデフォルトのLOWサービスで続行されます。

例:

db.employees.aggregate(
  [{"$count":"cnt"}], 
  {"hint" : {"$service":"HIGH"}}
);

この例では、コマンドを実行する前にコンシューマ・グループをHIGHに昇格します。

SQLモニタリング

SQLモニタリングでは、MongoDBのためのOracle Database APIによって発行されたSQLに関する詳細なインサイトが提供されます。モニタリング・レポートには、実行計画、I/O統計、期間および関連する診断が記載されます。SQL文は、実行時間が5秒を超えた場合、MONITORヒントが含まれている場合、またはパラレルに実行される場合にモニターされます。モニターされた文は、パフォーマンス・ハブに表示されます。

SQLモニタリングを使用する前に、ユーザーに必要なロールがあることを確認します:

grant select on "V$SQL" to your_user;
grant select on "V$SQL_MONITOR" to your_user;
grant advisor to your_user; 
grant execute on dbms_sql_monitor to your_user;

MongoDBコマンドを明示的にモニターするには、$nativeMONITORヒントと組み合せます:

db.employees.aggregate([{"$match" : {"name":"SMITH"}}], {"hint" :{"$native" : "MONITOR"}});

db.employees.find({"name" : "SMITH"}).hint({$native : "MONITOR"});

パフォーマンス・ハブにアクセスできる場合は、MONITORヒントで実行されたコマンドのモニタリング・レポートを探します。それ以外の場合は、次のようにmongoshからHTMLレポートを生成します。

実行された文のSQL_IDを確認します:

db.aggregate([{$sql:`
       select sql_fulltext, sql_id 
       from v$sql 
       where sql_text like '%MONITOR%' and
             sql_text not like '%v$sql%'
       order by last_active_time desc
       fetch first 1 rows only
   `}]);
 [
   {
     SQL_FULLTEXT: '...',
     SQL_ID: '6xy9y446n1ha6'
   }
 ]

HTML SQLモニタリング・レポートを生成します:

var html = 
   db.aggregate([{$sql:`
     select dbms_sql_monitor.report_sql_monitor(
       sql_id => '6xy9y446n1ha6',
       report_level => 'ALL',
       type => 'ACTIVE'
     ) as "html"
     from dual
   `}]).toArray()[0].html;

require('fs').writeFileSync('out.html', html);