Sql server 将5.3M记录插入临时表需要很长时间

Sql server 将5.3M记录插入临时表需要很长时间,sql-server,temp-tables,Sql Server,Temp Tables,我正在将5308194条记录插入到这个#Temp表中,大约需要8秒,我认为不需要那么多时间 有没有更好的方法,或者批量插入,在插入之前创建临时表 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') 聚集索引 CREATE UNIQ

我正在将5308194条记录插入到这个
#Temp
表中,大约需要8秒,我认为不需要那么多时间

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

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')
聚集索引

CREATE UNIQUE CLUSTERED INDEX [IdX_vwGuidelineLog] 
ON [dbo].[vwGuidelineLog] ([GuidelineLogID] ASC)
日志日期的索引:

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

GuidelineLinkId
上没有索引不会有帮助,因为这意味着数据引擎需要扫描整个表。考虑到您有5308194行符合要求
GuidelineLinkId
不为空,且logDate>=“2017-10-01”和logDate 我个人会考虑在那个列上添加一个索引(很可能有一个<代码>在其他列中包含< /代码>)。也许:

Dan关于更改视图
IDX\U GuidelineLogDate
的建议可能也是一个好主意:

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

在这里,
vwGuidelineLog
的DDL将非常重要(我假设它是一个视图,基于它的名称)嗯,什么是硬盘?RAM?你是对的,它可以运行得更快-在一台配备了所有SSD或类似设备的服务器上。否则,对不起,你知道,这并没有那么糟糕。我希望将
CustomerID
作为视图索引中的一个包含列来提高性能。另外,你忘了包含视图的聚集索引DDL。是否有<代码>索引在
GuidelineLinkId
表上
GuidelineLog
?那么我可以删除视图上的索引吗?@Jefferson
IDX\u GuidelineLogDate
是您视图上的索引之一。我不认为我可以在表和视图上都有GuidelineLogID。因此[dbo].[vwGuidelineLog]上的[IDX\u vwGuidelineLog]和dbo.GuidelineLog.IDX_GuidelineLinkId.噢,对不起,你是说聚集索引,我错过了,对不起。问题是
视图
上的那个没有帮助,因为
视图
仍然需要过滤。
CREATE NONCLUSTERED INDEX IDX_GuidelineLinkId
    ON dbo.GuidelineLog (GuidelineLinkId ASC)
    INCLUDE (GuidelineLogID, LogDate,LogDate, FileName, CustomerID, CountryId);
ALTER INDEX [IDX_GuidelineLogDate]
    ON [dbo].[vwGuidelineLog] ([LogDate] ASC)
    INCLUDE (CustomerID);