将 5.3M 记录插入 temp table 需要很长时间

Inserting 5.3M record into temp table is taking a long time

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

有没有更好的方法,或者批量插入,在插入之前创建临时 table?

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)

GuidelineLinkId 上没有索引没有帮助,因为这意味着数据引擎需要扫描整个 table。考虑到您有 5,308,194 行满足 GuidelineLinkId IS NOT NULL AND logDate >= '2017-10-01' and LogDate < dateadd(day, 1, '2018-09-30'` 我猜你那里的行数比 5.3M 多很多。(因此需要检查的内容很多)。

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

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

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

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