【发布时间】:2013-10-17 11:05:32
【问题描述】:
以下插入查询需要 7 秒才能运行,并且由于它在循环中运行多次,所以时间加起来。我需要帮助来加快速度,90% 的成本用于聚集索引插入,10% 用于 FN_qryPSLA() 的表扫描。
INSERT INTO tblTPS (fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA, fldBA)
SELECT fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA, 1 AS fldBA
FROM FN_qryPSLA()
WHERE (((fldPK)= 37923 ) AND ((fldMN)<>-254));
下面是FN_qryPSLA()... Distinct Sort 的成本是 85%(如果去掉,成本是 80% Hash Match (Aggregate))
FUNCTION [dbo].[FN_qryPSLA](@PK INT)
RETURNS @tmpTblPSLA TABLE (
fldPK BIGINT NOT NULL,
fldDTA DATETIME NULL,
fldCI FLOAT NULL,
fldMN FLOAT NULL,
fldMDN FLOAT NULL,
fldIQ FLOAT NULL,
fldSD FLOAT NULL,
fldNDS BIGINT NULL,
fldNIN BIGINT NULL,
fldNL BIGINT NULL,
fldMin FLOAT NULL,
fldMax FLOAT NULL,
fldUNC VARCHAR(5) NULL,
fldAVA TINYINT NULL
)
AS
BEGIN
WITH gDPS AS
(SELECT fldPK, Max(fldDTA) AS fldDTA
FROM tblAPS
GROUP BY fldPK)
SELECT fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA
FROM tblAPS INNER JOIN getDPS ON (tblAPS.fldDTA = gDPS.fldDTA) AND (tblAPS.fldPK = gDPS.fldPK)
GROUP BY fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA
HAVING tblAPS.fldMN<>-254
ORDER BY tblAPS.fldPK, tblAPS.fldCI;
RETURN;
END;
涉及的字段(正在查询的表中的 200 万条记录)fldPSD 上的聚集索引...
fldPK BIGINT NOT NULL,
fldDTA DATETIME NULL,
fldCI FLOAT NULL,
fldMN FLOAT NULL,
fldMDN FLOAT NULL,
fldIQ FLOAT NULL,
fldSD FLOAT NULL,
fldNDS BIGINT NULL,
fldNIN BIGINT NULL,
fldNL BIGINT NULL,
fldMin FLOAT NULL,
fldMax FLOAT NULL,
fldUNC VARCHAR(5) NULL,
fldAVA TINYINT NULL
【问题讨论】:
-
向我们展示
FN_qryPSLA()的完整定义。您保留了定义的标头,这恰好对于此类性能问题非常重要。 -
@RBarryYoung 我编辑了帖子以包含其余功能。
-
我最终得到了建议这个索引的 SQL...CREATE NONCLUSTERED INDEX [$fldPKMdnInd] ON [dbo].[tblAPS] ([fldPK],[fldMDN]) INCLUDE ([fldDTA],[ fldCI],[fldMDN],[fldIQ],[fldSD],[fldNDS],[fldNIN],[fldNL],[fldMin],[fldMax],[fldUNC],[fldAVA]) 去
-
这是我要查看的内容:“以下插入查询需要 7 秒才能运行,并且由于它在循环中运行多次,因此时间会增加。 " 循环在 SQL 中不是可取的东西,因为它们是查询/集合的解构部分,通常可以更快更简单。
标签: sql-server-2008 stored-procedures