我需要在目前有超过400k行的表上计算一个列到指定日期的总计,并准备进一步增长。我发现SUM()
聚合函数对于我的目的来说太慢了,因为对于超过50k行的总和,我的速度不能超过1500ms。
请注意,以下代码是迄今为止我发现的最快的代码。值得注意的是,从CustRapport
过滤数据并将其存储在临时表中,使我的性能提高了3倍。我也尝试过索引,但它们通常会变慢。
CustRapport
和CustLeistung
是具有以下定义的视图:
ALTER VIEW [dbo].[CustLeistung] AS
SELECT TblLeistung.* FROM TblLeistung
WHERE WebKundeID IN (SELECT WebID FROM XBauAdmin.dbo.CustKunde)
ALTER VIEW [dbo].[CustRapport] AS
SELECT MainRapport.* FROM MainRapport
WHERE WebKundeID IN (SELECT WebID FROM XBauAdmin.dbo.CustKunde)
感谢您提供任何帮助或建议!
ALTER FUNCTION [dbo].[getBaustellenstunden]
(
@baustelleID int,
@datum date
)
RETURNS
@ret TABLE
(
Summe float
)
AS
BEGIN
declare @rapport table
(
id int null
)
INSERT INTO @rapport select WebSourceID from CustRapport
WHERE RapportBaustelleID = @baustelleID AND RapportDatum <= @datum
INSERT INTO @ret
SELECT SUM(LeistungArbeit)
FROM CustLeistung INNER JOIN @rapport as r ON LeistungRapportID = r.id
WHERE LeistungArbeit is not null
AND LeistungInventarID is null AND LeistungArbeit > 0
RETURN
END
执行计划:
答案 0 :(得分:1)
我可以提供一般性建议,直到您提供更多信息。
更新了我的查询,因为它是从视图中拉出来直接从表中拉出来的。
INSERT INTO @ret
SELECT
SUM(LeistungArbeit)
FROM (
SELECT DISTINCT WebID FROM XBauAdmin.dbo.CustKunde
) Web
INNER JOIN dbo.TblLeistung ON TblLeistung.WebKundeID=web.webID
INNER JOIN dbo.MainRapport ON MainRapport.WebKundeID=web.webID
AND TblLeistung.LeistungRapportID=MainRapport.WebSourceID
AND MainRapport.RapportBaustelleID = @baustelleID
AND MainRapport.RapportDatum <= @datum
WHERE TblLeistung.LeistungArbeit is not null
AND TblLeistung.LeistungInventarID is null
AND TblLeistung.LeistungArbeit > 0