2

私に欠けているものを教えてくれる人が必要です。

SQL Server 2008 に次のスカラー関数があります。

ALTER function [dbo].[SKU](@id1 int, @id2 int)
returns int
begin
return (
 SELECT  SUM(Value)
 FROM Table
 where id_1 = @id1
 and id_2 = @id2)
end

そして、テーブルは次のようになります。

 id_1      id_2    Value
 1004       1       10
 1004       1       30
 1004       2       100
 1005       1       90
 1005       1       5
 1005       1       5

私が実行した場合:

select [dbo].[SKU](1004,1)

それは40を返します - それは大丈夫です

select [dbo].[SKU](1004,2)

100 を返します - OK

select [dbo].[SKU](1005,1)

100 を返します - OK

この時点ですべて問題ないように見えますが、私のテーブルにはほぼ 100 万行あります... SKU の結果は同じテーブル (更新部分) に送られます。

しかし、私はそれを2時間実行しましたが、まだ実行中です...

私の質問: 時間のかかるクエリなどは見たことがありません。大丈夫です?何か足りない?

ありがとう!そして明けましておめでとうございます!D:

4

3 に答える 3

1

これは答えとして解釈されるべきではなく、実際の問題にドリルダウンする試みです現在、これは私が実行されるアクションを解釈する方法としてです

初期テーブルから開始

 id_1      id_2    Value  Result
 1004       1       10    NULL
 1004       1       30    NULL
 1004       2       100   NULL
 1005       1       90    NULL
 1005       1       5     NULL
 1005       1       5     NULL

update table set result = dbo.SKU(1004, 2)この後

 id_1      id_2    Value  Result
 1004       1       10    40
 1004       1       30    40
 1004       2       100   40
 1005       1       90    40
 1005       1       5     40
 1005       1       5     40

update table set result = dbo.SKU(1004, 1)この後

 id_1      id_2    Value  Result
 1004       1       10    100
 1004       1       30    100
 1004       2       100   100
 1005       1       90    100
 1005       1       5     100
 1005       1       5     100

この後update table set result = dbo.SKU(1005, 1)(残り)になります

 id_1      id_2    Value  Result
 1004       1       10    100
 1004       1       30    100
 1004       2       100   100
 1005       1       90    100
 1005       1       5     100
 1005       1       5     100

そしてどういうわけかその後、結果はid_2で除算されます

 id_1      id_2    Value  Result
 1004       1       10    100
 1004       1       30    100
 1004       2       100   50
 1005       1       90    100
 1005       1       5     100
 1005       1       5     100

明らかに、私の解釈と実際に起こることは一致しません(少なくとも私はそう願っています)。

于 2011-12-29T03:04:05.170 に答える
1

テーブルの設計またはプログラミングを変更できない場合、簡単な解決策は、関数で使用しているフィールドにカバリング インデックスを作成することです。

何かのようなもの

CREATE INDEX IX_TABLE_ID_1_ID_2_VALUE ON dbo.Table (id_1, id_2) INCLUDE (Value)
于 2011-12-29T03:11:20.740 に答える
1

関数を使用する必要がない場合、これにより、必要なものが少し早く得られる可能性があります。

;with sumVal
as
(
select t1.id_1, t1.id_2, SUM(t1.value) [result]
from [table] t1
group by t1.id_1, t1.id_2
)

select t2.*, s.result
from sumVal s
left join [table] t2 on s.id_1 = t2.id_1 and s.id_2 = t2.id_2

私のテストでは、800,000 行を超える行で 5 秒未満で実行されました。

于 2011-12-29T21:50:41.560 に答える