C# 为什么在SQL中通过实体框架多次创建索引

C# 为什么在SQL中通过实体框架多次创建索引,c#,sql-server,entity-framework,indexing,C#,Sql Server,Entity Framework,Indexing,我编写了一个服务,它每天晚上将960000多行导入SQL数据库。该数据将在数小时后用于其他操作。 该应用程序是一个.Net应用程序,上面有实体框架。正在使用EntityFramework BulkExtensions进行导入 在3-4次导入之后,我收到TimeoutException 我公司的一些专家审查了我的全部代码。从代码方面看,一切似乎都很好 现在我来看看SQL Server。它正在运行SQL Server 2014 Professional 运行查询后: SELECT OBJECT_NA

我编写了一个服务,它每天晚上将960000多行导入SQL数据库。该数据将在数小时后用于其他操作。 该应用程序是一个.Net应用程序,上面有实体框架。正在使用EntityFramework BulkExtensions进行导入

在3-4次导入之后,我收到TimeoutException

我公司的一些专家审查了我的全部代码。从代码方面看,一切似乎都很好

现在我来看看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被创建了不止一次?
我希望表2只包含一个索引(IX_Index2)的一行。

恐怕这并不能直接回答这个问题

不管您上面的查询如何,您可能需要考虑在数据加载之前删除或禁用索引,然后在数据加载之后重建/启用它。这可能会更有效,因为在导入数据时,索引将得到更新

提供一些简单的代码,向您展示如何在尚未执行此操作的情况下执行此操作:

要在索引中禁用,请发出ALTER index命令

ALTER INDEX IX_IndexName ON Schema.TableName DISABLE; GO
DROP INDEX IndexName ON Schema.TableName; GO
如果要重新启用索引,则需要重新生成它,因为 无ALTER INDEX…ENABLE命令。重建工作如下所示:

ALTER INDEX IX_IndexName ON Schema.TableName REBUILD; GO
要删除聚集索引或非聚集索引,请发出drop index命令

ALTER INDEX IX_IndexName ON Schema.TableName DISABLE; GO
DROP INDEX IndexName ON Schema.TableName; GO

我认为您误解了输出-:“对于一个索引,每个分区中的B-树的每个级别都返回一行。”-但是您的输出中没有包含任何允许您区分这些行的内容。如果您怀疑索引是问题所在,那么在导入之前简单地删除索引是否可行,并且一旦完成就重新创建-假设您在需要记录之前有几个小时的时间?@RichardDavis是否有可能通过实体框架删除或禁用索引?什么是表和索引DDL?超时总是客户端的,超时设置是什么,加载了多少行?谢谢您的快速回答。但是您知道吗,是否可以通过实体框架禁用索引?我认为问题是,当我从代码运行查询时,我会再次得到TimeoutExceptions,因为在SQL Server上禁用或重建索引需要1分钟以上。如果您正在加载该数据规模,您可能希望将超时设置为
0
(无限制),关于EF中的索引,我自己没有这样做,但这可能会有所帮助:,否则,您应该能够执行自定义sql来完成此任务。