可能性のある説明は、SQL Server 2014 Enterprise Edition(64ビット)で、ここでin the commentSQL Serverクエリ最適化 - 単純なクエリで予期しない遅さ
である - 私は、ビューから読み取るしようとしています。標準クエリには、このようにORDER BY
とOFFSET-FETCH
句が含まれています。
アプローチ1
SELECT
*
FROM Metadata
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
OFFSET 150000 ROWS
FETCH NEXT 40 ROWS ONLY
しかし、この非常に単純なクエリは、同じ結果を返す次のクエリよりも(顕著150Kのような多数の行をスキップする)ほぼ9倍遅い行います。私は主キーを最初に読み取り、次いでWHERE...IN
機能
アプローチ2
SELECT
*
FROM Metadata
WHERE NewsId IN (
SELECT
NewsId
FROM Metadata
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
OFFSET 150000 ROWS
FETCH NEXT 40 ROWS ONLY
)
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
ベンチマーキング、これら2つのショーこの差
のパラメータとしてそれを使用しています。この場合(40 row(s) affected)
SQL Server Execution Times:
CPU time = 14748 ms, elapsed time = 3329 ms.
(40 row(s) affected)
SQL Server Execution Times:
CPU time = 3828 ms, elapsed time = 469 ms.
私はプライマリキーのインデックスがPubilshDate
で、そのフラグメントはイオンは非常に低いです。私もデータベーステーブルに対して同様のクエリを実行しようとしましたが、すべてのケースで2番目のアプローチは大きなパフォーマンス向上をもたらします。また、SQL Server 2012でこれをテストしました。
何が起こっているのか説明できますか?
スキーマ
アプローチ1:実行計画
アプローチ2:実行プラン(左部分)
アプローチ2:実行計画(右部分)
最初のアプローチを実行して** ** IDのみの列を選択すると、どうなりますか? '*'アスタリスクは、列全体を強制的にスキャンするので、アスタリスクはクエリの速度を遅くするものと思われます。 – sagi
インデックス化された列( 'Id')のみを検索するよりもずっと高速です(ほとんど9回、言います)。困ったことは、2番目のクエリでは、WHERE-IN句を使用しても同じ量のデータを読み込んでいますが、時間はかかりません。シーンの後ろで何が起こっていますか? – undefined
クエリプランとテーブルスキーマを含めることはできますか? –