私はSQL Server 2008を使用しています。クライアントのタイムゾーンを取得し、datetimeをクライアントタイムゾーンとして出力するスカラー値関数があります。私はストアドプロシージャのselectステートメントでそれを使用しています。私は、関数を使用するかどうかがパフォーマンスに大きな違いをもたらすことに気がつきました。実行計画をチェックし、 "統計時間、IO on"を使ってストアドプロシージャを実行して、違いを確認しました。スカラ値は、パフォーマンスに大きな違いをもたらすselect関数です。
例えば、これは、タイムゾーンの調整とクエリです:上記のコード
Declare @ClientID int
Select @ClientID = 123
select
abt.someID, myDB..adjustTimeZone(@ClientID, abt.dtDate)
from
aBigTable as abt
where
abt.dtDate > '2016-08-01'
and abt.dtDate < '2016-08-30'
さは約16kのレコードを返し、最後まで16秒かかります。 、上記のコード
Declare @ClientID int, @ZoneHourChange int
select @ClientID = 123
select @ZoneHourChange = (select hourOffSet from Client
where ClientID = @ClientID)
select
abt.someID, DateADD(hour, @ZoneHourChange, abt.dtDate)
from
aBigTable as abt
where
abt.dtDate > '2016-09-01'
and abt.dtDate < '2016-09-30'
も16kのレコードを返します。
は、私はただのキャッシングで、その後、私は以下のクエリのように、タイムゾーンを調整する別の方法を使用しているため、それがないことを確認するために9月にレコードを複製します時間の半分しかかかりません。私は実行計画から見ることができますが、コストは同じであり、並列化はありません。何が大きな違いにつながりますか?前もって感謝します。
1つはすべての行の検索を行います。もう1つはありません – JamieD77
関数はすべての行のクライアントテーブルのタイムゾーン情報を検索することを意味しますか? – Jaaaaaaay
はい.. http://www.databasejournal.com/features/mssql/article.php/3845381/T-SQL-Best-Practices-150-Don146t-Use-Scalar-Value-Functions-in-Column-List- or-WHERE-Clauses.htm – JamieD77