Sql server 将5.3M记录插入临时表需要很长时间
我正在将5308194条记录插入到这个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
#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”和logDateIDX\U GuidelineLogDate
的建议可能也是一个好主意:
ALTER INDEX [IDX_GuidelineLogDate]
ON [dbo].[vwGuidelineLog] ([LogDate] ASC)
INCLUDE (CustomerID);
在这里,
vwGuidelineLog
的DDL将非常重要(我假设它是一个视图,基于它的名称)嗯,什么是硬盘?RAM?你是对的,它可以运行得更快-在一台配备了所有SSD或类似设备的服务器上。否则,对不起,你知道,这并没有那么糟糕。我希望将CustomerID
作为视图索引中的一个包含列来提高性能。另外,你忘了包含视图的聚集索引DDL。是否有<代码>索引在GuidelineLinkId
表上GuidelineLog
?那么我可以删除视图上的索引吗?@JeffersonIDX\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);