cod*_*iac 2 stored-procedures sql-server-2008
以下插入查询需要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));
Run Code Online (Sandbox Code Playgroud)
以下是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;
Run Code Online (Sandbox Code Playgroud)
涉及的字段(查询表中有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
Run Code Online (Sandbox Code Playgroud)
这个片段对我来说很突出:
90%的成本转到聚集索引插入
考虑到这一点,我可以想到两件事要尝试:
这两者的目标是减少插入期间重新分页数据和索引的需要.
在第一种情况下,您在创建时在每个页面中保留空白空间,这样当您插入记录时,您不需要经常拆分或创建新页面.
在第二种情况下,不能将ORDER BY与作为插入的一部分的SELECT命令一起使用...但是您可以通过该SELECT命令中的表上的索引来影响顺序.目标是通过按顺序提供数据,您将在插入数据时按顺序一次在一个页面中工作,而不是跳转并可能需要反复重建同一页面.