sql-server - 将 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)
解决方案
没有索引GuidelineLinkId
不会有帮助,因为这意味着数据引擎需要扫描整个表。考虑到您有 5,308,194 行满足要求GuidelineLinkId
IS 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);
推荐阅读
- mysql - 我真的需要关闭 MySql 服务器来设置全局变量 log_bin_trust_function_creators 吗?
- c# - 使用角度和半径在屏幕边缘查找点
- dart - 为什么属性在 dart 构造函数之前执行?
- laravel - 在laravel中计算两行的时间差
- android - 在回收站视图中删除子布局行
- azure - Azure Cosmos DB - 每个用户访问不同的数据 (SQL)
- typescript - 允许对象上的未知方法
- android - 为什么我不断收到“与服务器的连接不成功。(http://localhost:12896/)”?
- react-native - 我需要做什么才能运行 React Native CLi App?
- python - 加载预训练的 keras 模型以在谷歌云上继续训练