パフォーマンス・チューニング
この項では、MongoDBのためのOracle Database APIを使用する場合のパフォーマンスを分析および改善するための手法の概要を示します。補足的なガイダンスについては、「索引」の項を参照してください。
$nativeヒント
$nativeヒントを使用して、MongoDBのためのOracle Database APIによって生成されたSQLにヒントを追加します。findやaggregateなどのヒントを適用する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>はHIGH、MEDIUM、LOW、TPまたはTPURGENTです。接続ユーザーには、CS_SESSIONでEXECUTEが必要です。権限が付与されていない場合、コマンドはデフォルトの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コマンドを明示的にモニターするには、$nativeをMONITORヒントと組み合せます:
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);