0

全て、

最初に値が設定されている変数を使用することと、クエリで定数として値を実際に使用することの間で、パフォーマンスの観点からクエリを実行すると、非常に奇妙な動作が見られます。

私が見ているのはそれです

DECLARE @ID BIGINT
SET @ID = 5
SELECT * FROM tblEmployee WHERE ID = @ID

私が実行するときよりもはるかに速く実行されます

SELECT * FROM tblEmployee WHERE ID = 5

これは明らかに実際のクエリのより単純なバージョンですが、この動作を説明するクエリを解析する方法でSQLServer2005の既知の問題を知っている人はいますか。私の元のクエリは、2つのアプローチの間で13秒から8分になります。

ありがとう、Ashish

4

4 に答える 4

1

本当にそうですか?

SQL Serverはパラメータが何であるかを事前に知らないため、通常、パラメータ化されたクエリは遅くなります。定数はすぐに最適化できます。

ただし、データ型についてここで注意すべきことが1つあります。これは何をするのでしょうか。

SELECT * FROM tblEmployee WHERE ID = CAST(5 as bigint)

また、実行順序を逆にします。先日奇妙なことがあり、順番を変えると計画が変わりました。

別の方法として、IDをマスクして「パラメータスニッフィング」を削除すると、最初のクエリに影響します。そして違いは?

DECLARE @ID BIGINT
SET @ID = 5
DECLARE @MaskedID BIGINT
SET @MaskedID = @ID
SELECT * FROM tblEmployee WHERE ID = @MaskedID 

最後に、各クエリにOPTION(RECOMPILE)を追加します。これは、プランが破棄されて再利用されないため、コンパイルが異なることを意味します。

于 2010-11-05T16:20:13.483 に答える
1

それぞれのクエリプランを確認しましたか?パフォーマンスの問題を分析しようとするとき、それは常に私が最初にすることです。

于 2010-11-05T16:53:17.613 に答える
0

値がキャッシュされると、あるアプローチが別のアプローチよりも高速であるという不当な結論を導き出す可能性があります。この違いは常にありますか?

于 2010-11-05T16:05:29.077 に答える
0

私が理解していることから、それはキャッシュされたクエリプランと関係があります。

Select * from A Where B = @Cを実行すると、@ Cの値に関係なく、1つのクエリプランになります。したがって、@ Cに異なる値を指定して10xを実行する場合、それは単一のクエリプランです。

実行する場合:

Select * from A Where B = 1 it creates a query plan
Select * from A Where B = 2 creates another
Select * from A Where B = 3 creates another

これはすべて、メモリを消費することです。

Googleクエリプランのキャッシュとリテラル。詳細な説明が表示されると思います。

于 2013-07-26T18:27:04.897 に答える