にmax degree of parallelism
設定し2
、にcost threshold for parallelism
設定した4 vCPU VMでMicrosoft SQL Server 2016 SP2-CU6(13.0.5292.0)を実行しています50
。
朝、SELECT TOP 100クエリの推定実行プランを表示しようとすると、大量の待機が発生し、推定プランをレンダリングする操作に数分、多くの場合5〜7分の範囲で時間がかかります。繰り返しますが、これはクエリの実際の実行ではなく、推定実行プランを表示するプロセスです。
sp_WhoIsActive
PAGEIOLATCH_SH
待機またはLATCH_EX [ACCESS_METHODS_DATASET_PARENT]
待機のいずれかが表示され、操作中にポールランダルのWaitingTasks.sqlスクリプトを実行すると、待機が表示されるCXPACKET
ワーカースレッドでPAGEIOLATCH_SH
待機が表示されます。
*リソースの説明フィールド= exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
ワーカースレッドは、stats
テーブル全体をメモリに格納しているように見えます(Paul Randalのクエリから表示されるこれらのページ番号および後続のページ番号は、stats
テーブルのクラスタ化キーに戻ります)。プランが戻ってくるstats
と、さまざまなレコードが残っているだけでキャッシュからテーブルの大部分が失われた後でも(同様のクエリからのシーク操作のためにプルされたと仮定します)、基本的に1日の残りの時間は瞬時です。
クエリが実際にSCAN演算子を使用するプランで実行されている場合、この初期動作を期待しますが、上記のリンクされたプランに示されているように、SEEKオペレーターに到達するためだけに実行プランを評価するときにこれを行うのはなぜですか?ここでのパフォーマンスを向上させるために何ができますか(営業時間前にこのステートメントを実行してデータを適切にキャッシュする以外に)。一対のカバリングインデックスが有益であると考えていますが、実際に動作の変更を保証しますか?ここで、ストレージとメンテナンスウィンドウの制限内で作業する必要があります。クエリ自体はベンダーソリューションから生成されるため、この時点で他の提案(より良いインデックス付け以外)を歓迎します。