Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / /

操作拒否フィルターによる低速クエリのブロック

項目一覧

  • このタスクについて
  • 始める前に
  • 手順
  • 次のステップ
  • 詳細

バージョン8.0の新機能

操作によって過剰なワークロードが発生するのを防ぐために、そのクエリシェイプに関連付けられているすべての操作を一時的に拒否できます。 そのためには、 setQuerySettingsを使用して、操作のクエリシェイプのrejectフィールドをtrueに設定します。 拒否されたクエリシェイプは、操作拒否フィルターとも呼ばれます。

クエリオプティマイザは、クエリ設定中にクエリ設定を追加入力として使用し、クエリを実行するために選択されたプランに影響します。

このページの手順では、サンプル コレクションを作成し、操作拒否フィルターを使用してクエリシェイプをブロックします。

アプリケーションのクエリが非効率的であるため、クラスターの過剰なワークロードがあるとします。 クエリが過剰なクラスター リソースを消費するのを防ぐには、 操作拒否フィルター を使用して、クエリおよび同様のクエリの実行をブロックします。

非効率的なクエリを識別するには、次のようなさまざまな方法を使用します。

  • Atlas モニタリング

  • Atlas alerts

  • Atlas クエリプロファイラー

  • 低速クエリ ログ

1

実行:

// Create pizzaOrders collection
db.pizzaOrders.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 19,
totalNumber: 10, orderDate: ISODate( "2023-03-13T08:14:30Z" ) },
{ _id: 1, type: "pepperoni", size: "medium", price: 20,
totalNumber: 20, orderDate: ISODate( "2023-03-13T09:13:24Z" ) },
{ _id: 2, type: "pepperoni", size: "large", price: 21,
totalNumber: 30, orderDate: ISODate( "2023-03-17T09:22:12Z" ) },
{ _id: 3, type: "cheese", size: "small", price: 12,
totalNumber: 15, orderDate: ISODate( "2023-03-13T11:21:39.736Z" ) },
{ _id: 4, type: "cheese", size: "medium", price: 13,
totalNumber: 50, orderDate: ISODate( "2024-01-12T21:23:13.331Z" ) },
{ _id: 5, type: "cheese", size: "large", price: 14,
totalNumber: 10, orderDate: ISODate( "2024-01-12T05:08:13Z" ) },
{ _id: 6, type: "vegan", size: "small", price: 17,
totalNumber: 10, orderDate: ISODate( "2023-01-13T05:08:13Z" ) },
{ _id: 7, type: "vegan", size: "medium", price: 18,
totalNumber: 10, orderDate: ISODate( "2023-01-13T05:10:13Z" ) }
] )
2

これらのフィールドを使用して操作拒否フィルターを追加するには、次のsetQuerySettingsコマンドを実行します。

  • find フィルターとソートを提供し、クエリシェイプを定義します。

  • $db クエリ設定用の データベースとともに使用します。

  • settings は、クエリシェイプを拒否します。

db.adminCommand( {
setQuerySettings: {
find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"
},
settings: {
reject: true
}
} )

次の切り捨てられた出力は、 queryShapeHashフィールド値とsettings rejectフィールドがtrueであることを示しています。

{
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1',
settings: { reject: true },
representativeQuery: {
find: 'pizzaOrders',
filter: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
sort: { totalNumber: 1 },
'$db': 'test'
},
ok: 1,
...
}
3

explainを実行します。

db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate(
"2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

次の切り捨てられた出力は、 querySettings rejectフィールドがtrueであることを示しています。

{
queryPlanner: {
winningPlan: {
stage: 'SINGLE_SHARD',
shards: [
{
explainVersion: '1',
...
namespace: 'test.pizzaOrders',
parsedQuery: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
querySettings: { reject: true },
...
}
]
}
}
4

次のクエリを実行してみてください。

db.pizzaOrders.find( { orderDate: {
$gt: ISODate("2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

次の出力は、クエリが拒否されたことを確認しています。

MongoServerError: Query rejected by admin query settings
5

次の例では、 removeQuerySettingsを使用して操作拒否フィルターを削除しています。このフィルターは、前述のステップ2に表示されている出力のqueryShapeHash値を使用して識別されます。

db.adminCommand( {
removeQuerySettings: "AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1"
} )

以下からqueryShapeHash値を取得することもできます。

クエリシェイプ を使用して操作拒否フィルターを削除することもできます。 例:

db.adminCommand( {
removeQuerySettings: {
find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"
}
} )
6

操作拒否フィルターが削除されるため、次のクエリはブロックされず、実行されるようになります。

db.pizzaOrders.find( { orderDate: {
$gt: ISODate("2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

操作拒否フィルターを使用して非効率的な操作をブロックすると、クラスターのパフォーマンスは非効率的なクエリが導入される前の状態に戻ります。 次のステップ:

  1. クエリのパフォーマンスの問題を解決します。 これにはインデックスまたはクエリの書き換えが必要になる場合があります。

  2. 更新されたアプリケーションを配置します。

削除されていないクエリ設定を再度有効にするには、 setQuerySettingsを使用し、 rejectフィールドをfalseに設定します。

戻る

出力