我需要一个可以告诉我我缺少的人。
我在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的结果会转到同一个表(更新部分)。
但我现在跑了两个小时,现在还在跑...
我的问题:我从未见过如此耗时的查询。没关系?我错过了什么?
谢谢!,新年快乐! d:
答案 0 :(得分: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
显然,我的解释以及真正发生的事情并不匹配(至少我希望如此)。
答案 1 :(得分:1)
如果不能将表格设计或编程更改为选项,那么一个简单的解决方案就是在函数中使用的字段上创建覆盖索引。
像
这样的东西CREATE INDEX IX_TABLE_ID_1_ID_2_VALUE ON dbo.Table (id_1, id_2) INCLUDE (Value)
答案 2 :(得分: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秒。