将 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);
我正在向这个 #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);