2

マルチステップ テーブル値関数内に以下のような sql があります。理解しやすいように、クエリを少し短くしました。

CREATE FUNCTION [dbo].[fn_ph] 
(
    -- Add the parameters for the function here
    @pAsOfDate date,
    @pAccountId nvarchar(15)
)
RETURNS @HH TABLE 
(
    -- Add the column definitions for the TABLE variable here
    AsOfDate date,
    AccountId nvarchar(15), 
    LongName varchar(100),
    ShortName varchar(100)
)
AS

BEGIN

declare @longOrShortIndicator int
select @longOrShortIndicator = COUNT(distinct LongOrShortIndicator) from table1 a


select a.*,
 case 
    when a.SecType='CASH' and @longOrShortIndicator > 1 then 'C'
    else a.LongOrShortIndicator
 end as LongOrShortIndicator
from Table1 a

END

表現when a.SecType='CASH' and @longOrShortIndicator > 1 then 'C'がボトルネックです。

@longOrShortIndicator > 1クエリを削除すると、高速に実行されます

関数の外でクエリを実行すると、高速に返されます...

ローカル変数がクエリ全体を遅くしているのはなぜですか? どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

1

このリストには、戻りテーブルである @HH で何をしたいかは示されていませんが、@longOrShortIndicator では、明らかに table1 の行をカウントしています。たとえば、リターンテーブルのすべての行に対して何度も実行している場合、実際には遅く、デススターでも遅くなります。

于 2012-04-30T21:49:57.920 に答える
0

ここで推測: @LongOrShortIndicator 変数をクエリから IF ステートメントに移動してみてください。

declare @longOrShortIndicator int
select @longOrShortIndicator = COUNT(distinct LongOrShortIndicator) from table1 a

IF @longOrShortIndicator > 1 BEGIN
    select a.*,
        CASE when a.SecType='CASH' then 'C'
        else a.LongOrShortIndicator
        end as LongOrShortIndicator
    from Table1 a
END ELSE BEGIN
    select a.*, a.LongOrShortIndicator
    from Table1 a
END
于 2012-05-01T03:18:55.470 に答える