SQL実行プランのTOPオペレーションはなぜですか


9

しばらく探してみたところ、答えが見つからなかったためこの質問を投稿し、似たような質問/回答があった場合は謝罪することにしました。

同じように設定された2つのSQLサーバーで以下のクエリを実行すると、パフォーマンスに影響する異なる実行プランが発生するため、原因を特定する必要があります。

クエリ:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

サーバーAの実行計画 サーバーB

サーバーBの実行計画 サーバーB http://s2.postimg.org/z9fjrfv4n/server_B.png

サーバーBの実際の実行計画ではTOPの物理演算があり、その理由を理解しようとしていることがわかります。両方のクエリは、インデックスシークで同じインデックスを使用します。

サーバーAとサーバーBの詳細は次のとおりです

サーバーAとBは両方とも

Windows Server 2008 R2 Standard Service Pack 1

24GB RAM

64ビットオペレーティングシステム

SELECT SERVERPROPERTY( 'ProductVersion'))を使用して取得したSQL Server 2012のバージョン

サーバーA SQLバージョン11.0.3000.0

サーバーB SQLバージョン11.0.5058.0

私たちが試したこと

  1. プロシージャキャッシュのクリア
  2. インデックスの再構築
  3. 統計の更新
  4. 行カウントを0に設定 行数を使って行く

サーバーBの実行プランにTOPがあるのはなぜですか?この単純なクエリの例では実際の問題はありませんが、大きなクエリではTOPのコストが上昇し、パフォーマンスに影響が出ます。これをデバッグする助けがあれば大歓迎ですし、私たちはあなたが助ける必要があるかもしれない追加の情報を得ることができます。


TOPオペレータは、非ゼロ示唆SET ROWCOUNT以前にその接続上で実行されました。実行後、再度お試しくださいSET ROWCOUNT 0;。また、投稿したSQLバージョンはSQL 2008 R2ではありません。SELECT SERVERPROPERTY('ProductVersion');2つのサーバーで実行して、実際のSQL Serverのバージョンを取得します。
Dan Guzman

提供された選択クエリを使用して、SQLバージョンで元の投稿を更新しました。SQLがインストールされているサーバーはWindows 2008 R2サーバーですが、SQLサーバーは2012です。以前に別のメンバーによって提案され、その後削除されたため、実行計画を変更せずにROWCOUNTを0に設定してみました。更新された質問を見る
Arthur Yegiazaryan 2015年

GO行カウント行の後にaを置くことができますか。Top演算子のプロパティも投稿できますか?
Rob Farley

RobがGOとプロパティをTOPから元の投稿に追加しました
Arthur Yegiazaryan 2015年

回答:


12

2つのサーバーでデータベースの互換性レベルが同じであることを確認します。SQL Server 2012インスタンスでクイックテストを実行したところ、互換性レベルが100以下の場合にTOP演算子が導入されました。特に理由がない限り、SQL Server 2012インスタンスでは互換性レベル110(SQL Server 2012)を使用するのが最適です。


2

ROWCOUNTの値があると思います。行う:

SET ROWCOUNT 0

...オフにします。


1
SET ROWCOUNT 0は、TOPを実行プランから削除しませんでした
Arthur Yegiazaryan 2015年

1
@Arthurそれはあなたの場合の解決策ではありませんでしたが、それは将来の読者のための行動の理由になるかもしれません。(申し訳ありません、ロブ、私はあなたの投稿の削除を取り消すことにしました。これは実際に同じ症状の問題である可能性があるためです。)
アーロンバートランド

アーロン、同意し、持ち帰ってくれてありがとう。私にとっては解決策ではありませんが、他の人のための解決策になる可能性があります。
Arthur Yegiazaryan 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.