2016-09-15 4 views
0

私は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月にレコードを複製します時間の半分しかかかりません。私は実行計画から見ることができますが、コストは同じであり、並列化はありません。何が大きな違いにつながりますか?前もって感謝します。

+2

1つはすべての行の検索を行います。もう1つはありません – JamieD77

+0

関数はすべての行のクライアントテーブルのタイムゾーン情報を検索することを意味しますか? – Jaaaaaaay

+1

はい.. 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

答えて

0

スカラー関数を使用すると、1つの列を持つテーブルを返すinline TVFにあなたの機能を変更する場合には、非常にあなたのクエリをスピードアップすることができ、可能な場合1は、避けなければならない何か...

です。

これを試してみてください。どちらの関数も同じことを行うように見えるが、インラインTVFは、はるかに良い行い...

CREATE FUNCTION dbo.TestScalar() 
RETURNS VARCHAR(100) 
AS 
BEGIN 
    RETURN 'test'; 
END 
GO 

CREATE FUNCTION dbo.TestInlineTVF() 
RETURNS TABLE 
AS 
    RETURN SELECT 'test' AS Result; 
GO 

SELECT dbo.TestScalar(); 

SELECT Result FROM TestInlineTVF(); 
GO 

DROP FUNCTION dbo.TestInlineTVF; 
DROP FUNCTION dbo.TestScalar; 
0

(あなたが関数のコードを含めることはできますか?)

それはだ場合SELECT <return> FROM table WHERE cols = @params次に、返される行ごとにそのクエリを実行しているので、関数をスキップしてメインクエリの結合としてテーブルを追加するほうがよいでしょう。

関連する問題