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 - 确定

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

返回 100 - 确定

在这一点上一切似乎都很好,但我的表几乎有一百万行...... SKU 的结果进入同一张表(更新部分)。

但是我现在运行了两个小时,并且仍在运行...

我的问题:我从未见过如此耗时的查询。没关系?我错过了什么?

谢谢!,新年快乐!丁:

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 回答