操作拒否フィルターによる低速クエリのブロック
バージョン8.0の新機能。
操作によって過剰なワークロードが発生するのを防ぐために、そのクエリシェイプに関連付けられているすべての操作を一時的に拒否できます。 そのためには、 setQuerySettings
を使用して、操作のクエリシェイプのreject
フィールドをtrue
に設定します。 拒否されたクエリシェイプは、操作拒否フィルターとも呼ばれます。
クエリオプティマイザは、クエリ設定中にクエリ設定を追加入力として使用し、クエリを実行するために選択されたプランに影響します。
このページの手順では、サンプル コレクションを作成し、操作拒否フィルターを使用してクエリシェイプをブロックします。
このタスクについて
アプリケーションのクエリが非効率的であるため、クラスターの過剰なワークロードがあるとします。 クエリが過剰なクラスター リソースを消費するのを防ぐには、 操作拒否フィルター を使用して、クエリおよび同様のクエリの実行をブロックします。
始める前に
非効率的なクエリを識別するには、次のようなさまざまな方法を使用します。
手順
サンプル コレクションを作成する
実行:
// 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" ) } ] )
操作拒否フィルターを追加する
これらのフィールドを使用して操作拒否フィルターを追加するには、次の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, ... }
(任意)explain コマンドを使用して設定を確認します
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 }, ... } ] } }
(任意)操作拒否フィルターを削除します
次の例では、 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" } } )
次のステップ
操作拒否フィルターを使用して非効率的な操作をブロックすると、クラスターのパフォーマンスは非効率的なクエリが導入される前の状態に戻ります。 次のステップ:
クエリのパフォーマンスの問題を解決します。 これにはインデックスまたはクエリの書き換えが必要になる場合があります。
更新されたアプリケーションを配置します。
削除されていないクエリ設定を再度有効にするには、 setQuerySettings
を使用し、 reject
フィールドをfalse
に設定します。