SQL検疫
このブログ投稿では、SQL検疫の概念を紹介しています。 Oracle®ResourceManagerを使用すると、CPUやI/Oなどのリソースの使用を規制および制限できます。最も興味深い事実は、定義されたしきい値を超える長時間実行クエリの実行を防ぐことができるということです。
SQL検疫とは何ですか?
検疫とは隔離を意味します。 SQL検疫は、暴走クエリのオーバーヘッドを排除するために使用できるバージョン19cの機能です。暴走クエリは、リソースまたはランタイムの制限を超え、リソース、CPU、およびIOの多くを使用するため、ResourceManagerによって終了されるクエリです。
この機能は、Exadata(Oracle Database Enterprise Edition onEngineered Systems)およびDBCS / ExaCS(Oracle Database Exadata Cloud Service)でのみ使用できます。これをテストするために、次のコマンドを使用してアンダースコアパラメータを設定し、データベースをバウンスしました。
システムセットの変更"_exadata_feature_on"=true scope =spfile;
長時間実行されるクエリはどうですか?
データベースリソースマネージャー(DBRM)は、IOやCPUなどの特定のリソース使用率のしきい値を超えるSQLステートメントを終了できるようにするバックグラウンドプロセスです。また、実行時の最大しきい値を超えるクエリを終了することもできます。
マークされたSQL実行プランと制限を超えるSQLステートメントは隔離されます。これは、同じSQLが同じ実行プランを使用して再度実行されると、SQLステートメントが終了し、次のエラーが発生することを意味します。
エラー:ORA-56955:隔離されたプランが使用されました。
これらのエラーが発生すると、Object Quarantineはエラーの原因となったオブジェクトを分離し、それを監視してデータベースの他の部分への影響を確認します。
テーブルやインデックスではなく、セッション、プロセス、SGAトランザクション、ライブラリキャッシュなど、Oracleが隔離できるオブジェクトを参照しています。
次の例のように、指定された時間のしきい値より長く実行されるSQLクエリを終了またはキャンセルできるようになりました。
図1:暴走したSQLステートメント 画像ソース:https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf
https://dbaparadise.com/2020/01/everything-you-need-to-know-about-quarantined-objects/によると:隔離されたオブジェクトに関する情報を取得するには、 V $ QUARANTINE> およびV$ QUARANTINE_SUMMARY ビュー。オブジェクトのタイプ、オブジェクトのメモリアドレス、実際のORAエラー、およびエラーの日付と時刻を示します。
次の例に示すように、サーバーのCPU使用率は、実行時の暴走クエリの応答のように見えると想定できます。 3つのクエリが同時に実行され、CPUをその容量のほぼ100%まで使用していることがわかります。
図2:暴走SQLによって消費されるCPU 画像ソース:https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf
SQL検疫
SQL検疫を使用して、暴走クエリのオーバーヘッドを排除できます。 ResourceManagerがリソースまたは実行時の制限を超えるSQLステートメントを検出すると、ステートメントで使用されるSQL実行計画が隔離されます。
同じSQLプランを使用して同じSQLステートメントを実行すると、すぐに終了します。これにより、システムリソースの使用量を大幅に削減できます。次の図では、実行するクエリが少ない場合に使用率が高いことがわかります。ただし、実行前にそれらを終了することにより、隔離された後にシステムリソースを消費しなくなります。
図3:SQL検疫によって節約されたCPU 画像ソース:https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf
機能とその仕組みを確認しましょう。
まず、Exadataで作業しているときにデータベースを設定する必要があります。
alter system set "_exadata_feature_on" =true scope =spfile;すぐにシャットダウンします。スタートアップ;
次に、ResourceManagerをセットアップするために次の手順を完了する必要があります。
-
保留領域の作成:
begin dbms_resource_manager.create_pending_area();終わり; /
-
1つ以上のリソースコンシューマグループを作成します:
begin dbms_resource_manager.create_consumer_group(CONSUMER_GROUP =>'。SQL_LIMIT'、COMMENT =>'consumer group');終わり; /
-
リソース計画を作成する:
begin dbms_resource_manager.set_consumer_group_mapping(attribute =>'ORACLE_USER'、value =>'DBA1'、consumer_group =>'SQL_LIMIT'); dbms_resource_manager.create_plan(PLAN =>'NEW_PLAN'、COMMENT =>'合計実行時間を超えた後にステートメントを強制終了します');終わり; /
-
リソース計画ディレクティブを作成します。 CANCEL_SQLグループはデフォルトですでに存在します:
begin dbms_resource_manager.create_plan_directive(plan =>'NEW_PLAN'、group_or_subplan =>'SQL_LIMIT'、comment =>'合計実行時間を超えた後にステートメントを強制終了する'、switch_group =>'CANCEL_SQL'、switch_time => 10 switch_estimate => false);終わり; / begin dbms_resource_manager.create_plan_directive(PLAN =>'NEW_PLAN'、GROUP_OR_SUBPLAN =>'OTHER_GROUPS'、COMMENT =>'他の人を放っておく'、CPU_P1 => 100);終わり; /
-
計画、消費者グループ、および指令の保留領域を検証して送信します。
begin dbms_resource_manager.validate_pending_area();終わり; / dbms_resource_manager.submit_pending_area();を開始します。終わり; /
ここでは、助成金を割り当て、消費者グループをユーザーに割り当てる必要があります。
-
特権、役割、および割り当てられたユーザーの保留領域を作成します。
begin dbms_resource_manager.create_pending_area();終わり; /
-
リソースコンシューマグループの切り替え権限をユーザーまたはロールに付与します。
begin dbms_resource_manager_privs.grant_switch_consumer_group('DBA1'、'SQL_LIMIT'、false);終わり; /
-
ユーザーをリソースコンシューマーグループに割り当てます。
begin dbms_resource_manager.set_initial_consumer_group('DBA1'、'SQL_LIMIT');終わり; /
-
保留中の領域を検証して送信します。
begin dbms_resource_manager.validate_pending_area();終わり; / dbms_resource_manager.submit_pending_area();を開始します。終わり; /
-
ここで、プランを更新し、保留中の領域を再度送信する必要があります。
begindbms_resource_manager.clear_pending_area; dbms_resource_manager_create_pending_area; end; /begindbms_resource_manager.update_plan_directive(plan=>'NEW_PLAN'、group_or_subplan =>'SQL_LIMIT'、new_switch_elapsed_time => 10、new_switch_for_; end; / begin dbms_resource_manager.validate_pending_area(); dbms_resource_manager.submit_pending_area; end; /
上記の手順で、リソースマネージャーのセットアップが完了します。それらを完了した後、あなたがする必要があるのは、このプランをインスタンスに割り当てることだけです:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN =NEW_PLAN;
DBA1ユーザーでログインし、リソースプランで定義されている経過時間のしきい値である10秒を超えるクエリを発行します。
ステートメントはDBA1ユーザーとして実行する必要があり、DBA1はDBAビューにアクセスできる必要があります。
select a.owner_name、b.product_name、c.location、d.country_codefrom import_pr_table a、item_table b、locate_dealer_table c、country_table d; ERROR at line 1:ORA-00040:active timelimitexceeded-呼び出しが中止されました
この場合、ResourceManagerはORA-00040
で実行を終了したことに注意してください。 エラー。
ステートメントのSQL_IDを見つけることができますか? 3hdkutq4krg4c
です 。
SQL検疫を作成
DBMS_SQLQを使用できます 隔離する必要のあるSQLステートメントの実行計画の隔離構成を作成するパッケージ。
次の例に示すように、SQLテキストまたは隔離するステートメントのSQL_IDを使用できます。
CREATE_QUARANTINE_BY_SQL_IDまたはCREATE_QUARANTINE_BY_SQL_TEXTDECLAREquarantine_sqlVARCHAR2(30); BEGINquarantine_sql:=DBMS_SQLQ.CREATE_QUARANTINE_BY_SQL_ID(SQL_ID => '3hdkutq4krg4c'); END; /
この隔離構成を作成した後、 DBMS_SQLQ.ALTER_QUARANTINE を使用して、隔離しきい値を指定できます。 手順。
BEGIN DBMS_SQLQ.ALTER_QUARANTINE(QUARANTINE_NAME =>'SQL_QUARANTINE_3hdkutq4krg4c'、PARAMETER_NAME =>'ELAPSED_TIME'、PARAMETER_VALUE => '10'); END; /
DBA_SQL_QUARANTINEにクエリを実行できるようになりました どのSQLステートメントが隔離されているかを確認するために表示します。
SQL検疫が設定されていると、同じSQLステートメントを実行しようとしても実行されません。
select a.owner_name、b.product_name、c.location、d.country_code from import_pr_table a、item_table b、locate_dealer_table c、country_table d; ERROR at line 1:ORA-56955:quarantined plan used
>上記のエラーメッセージは、このステートメントに使用されたプランが隔離されたプランの一部であることを示しています。しきい値を超えたため、クエリをキャンセルしました。
V $ SQLをチェックした場合 ビューを見ると、2つの新しい列が表示されます: sql_quarantine およびavoided_executions :
select sql_quarantine、avoided_executions from v $ sql where sql_id ='3hdkutq4krg4c'; SQL> select sql_quarantine、avoided_executions 2 from v $ sql where sql_id ='3hdkutq4krg4c'; SQL_QUARANTINE AVOIDED_EXE ------ --------------- SQL_QUARANTINE_3hdkutq4krg4c 1
結論 SQL隔離機能は、コストのかかる隔離されたSQLステートメントの将来の実行を防ぐため、パフォーマンスの向上に役立ちます。
コメントや質問をするには、[フィードバック]タブを使用します。 セールスチャットをクリックすることもできます 今すぐチャットして会話を始めましょう。
-
ストレッチデータベース-理解を得る
こんにちは、みんな。私はここに、データベース(DB)をいくつかの方法で改善するのに役立つ非常にシンプルですが素晴らしいトピックを持っています—データベースのストレッチ!! それでは、始めましょう。 ストレッチデータベースとは何ですか? SQL 2016では、オンプレミスからAzurecloudにデータを拡張するのに役立つ機能が導入されました。この機能であるStretchDatabase(またはStretchDB)は、ローカルSQL Server上のウォーム(頻繁にアクセスされる)データを維持しながら、ローカルSQLServer®からAzure®にコールド(頻繁にアクセスされない)データを
-
SQLPolyBaseセットアップの問題
最近のブログ投稿「PolyBaseによる統合データプラットフォームとデータ仮想化:パート2」では、PolyBaseによるデータ仮想化のデモを提供しました。 外部ソースからデータをフェッチするようにSQLPolyBaseデモを設定しているときに、いくつかの問題に直面しました。私は問題をすばやく修正しましたが、同じ問題を抱えている人が誰でも恩恵を受けることができるように、それらを1か所にまとめて提示するのがよいと思いました。それでは、始めましょう。 最初の問題 エラー:PolyBaseは、マシンごとに1つのSQLServerインスタンスにのみインストールできます。 図1-最初の問題、エラ