首页 > 解决方案 > 将 5.3M 记录插入临时表需要很长时间

问题描述

我在这个#Temp表中插入了 5308194 条记录,它大约需要 8 秒,我认为它不应该花那么多时间

有没有更好的方法来做到这一点,或者可能是 BULK Insert,在插入之前创建临时表?

SELECT g.CustomerId, g.LogDate
INTO #Temp
FROM vwGuidelineLog g --nolock
WHERE g.LogDate >= '2017-10-01' 
  AND g.LogDate < DATEADD(DAY, 1, '2018-09-30')

DDL

CREATE VIEW [dbo].[vwGuidelineLog]
WITH SCHEMABINDING 
AS
    SELECT        
        GuidelineLogID, LogDate, FileName, CustomerID, GuidelineLinkId, CountryId
    FROM            
        dbo.GuidelineLog
    WHERE        
        (GuidelineLinkId IS NOT NULL)

聚集索引

CREATE UNIQUE CLUSTERED INDEX [IdX_vwGuidelineLog] 
ON [dbo].[vwGuidelineLog] ([GuidelineLogID] ASC)

索引LogDate

CREATE NONCLUSTERED INDEX [IDX_GuidelineLogDate] 
ON [dbo].[vwGuidelineLog] ([LogDate] ASC)

标签: sql-servertemp-tables

解决方案


没有索引GuidelineLinkId不会有帮助,因为这意味着数据引擎需要扫描整个表。考虑到您有 5,308,194 行满足要求GuidelineLinkIdIS NOT NULL AND logDate >= '2017-10-01' 和 LogDate < dateadd(day, 1, '2018-09-30'` 我猜你有更多的行超过 530 万。(所以要检查很多)。

我个人会考虑在该列上添加一个索引(可能INCLUDE在其他列上添加一个索引)。也许:

CREATE NONCLUSTERED INDEX IDX_GuidelineLinkId
    ON dbo.GuidelineLog (GuidelineLinkId ASC)
    INCLUDE (GuidelineLogID, LogDate,LogDate, FileName, CustomerID, CountryId);

丹关于改变观点的建议IDX_GuidelineLogDate也可能是一个好主意:

ALTER INDEX [IDX_GuidelineLogDate]
    ON [dbo].[vwGuidelineLog] ([LogDate] ASC)
    INCLUDE (CustomerID);

推荐阅读