gpt4 book ai didi

sql-server-2008 - 加快 SQL Server 2008 插入查询

转载 作者:行者123 更新时间:2023-12-04 07:09:10 28 4
gpt4 key购买 nike

下面的插入查询需要 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()...不同排序的成本是 85%(如果删除成本是 80% 哈希匹配(聚合))

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

最佳答案

这段代码让我印象深刻:

90% of the cost goes to a clustered index insert

考虑到这一点,我可以想到要尝试的两件事:

  1. 更改 Fill Factor为目标表在每一页中留出一些空白空间用于传入数据。
    或者:
  2. 在插入前对数据进行排序,使其与主键顺序相匹配。

这两者的目标是减少在插入期间重新分页数据和索引的需要。

在第一种情况下,您在创建时在每个页面中保留空白空间,这样当您插入记录时,您不需要经常拆分或创建新页面。

在第二种情况下,您不能将 ORDER BY 与作为插入的一部分的 SELECT 命令一起使用...但您可以通过该 SELECT 命令中表的索引影响顺序。目标是通过按顺序提供数据,您将在插入数据时按顺序一次在一个页面中工作,而不是四处跳动并可能需要一遍又一遍地重建同一页面。

关于sql-server-2008 - 加快 SQL Server 2008 插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19283044/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com