我编写了一个服务,每晚将超过960.000行导入SQL数据库。这些数据将在几小时后用于其他操作。 该应用程序是一个.Net应用程序,其上有Entity Framework。正在使用EntityFramework BulkExtensions进行导入。
在3-4 Imports之后,我收到了TimeoutExceptions。
我公司的一些专家审查了我的整个代码。从Code-Side看,一切似乎都没问题。
现在我看一下SQL Server。它正在运行SQL Server 2014 Professional。
运行查询后:
SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(),
NULL,
NULL,
NULL,
'DETAILED') indexstats
INNER JOIN sys.indexes i ON i.OBJECT_ID = indexstats.OBJECT_ID
WHERE indexstats.avg_fragmentation_in_percent > 30
AND i.index_id = indexstats.index_id
现在我的问题是,为什么Index2被创建超过1次? 我预计表2中只有一行带有一个索引(IX_Index2)。
答案 0 :(得分:2)
我不敢直接回答这个问题。
无论您的上述查询如何,您可能需要考虑在数据加载之前删除或禁用索引,然后在数据加载后重建/启用它。这将可能更高效,否则索引将在导入数据时更新。
This article提供了一些简单的代码,告诉您如何执行此操作,如果您还没有这样做:
要在索引中禁用,请发出ALTER INDEX命令。
ALTER INDEX IX_IndexName ON Schema.TableName DISABLE; GO
如果要重新启用索引,则需要重建它 - 有 没有ALTER INDEX ... ENABLE命令。重建工作如下:
ALTER INDEX IX_IndexName ON Schema.TableName REBUILD; GO
要删除聚簇索引或非聚簇索引,请发出DROP INDEX命令。
DROP INDEX IndexName ON Schema.TableName; GO