为什么通过实体框架

时间:2017-09-12 08:40:33

标签: c# sql-server entity-framework indexing

我编写了一个服务,每晚将超过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

我得到了以下结果: Result of the Query

现在我的问题是,为什么Index2被创建超过1次? 我预计表2中只有一行带有一个索引(IX_Index2)。

1 个答案:

答案 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