C# SQLServer2008R2:我该怎么做;暂停“;服务器写入时的聚集索引?

C# SQLServer2008R2:我该怎么做;暂停“;服务器写入时的聚集索引?,c#,sql,sql-server-2008,sql-server-2008-r2,C#,Sql,Sql Server 2008,Sql Server 2008 R2,我想知道在写入批量数据时是否可以“暂停”聚集索引 原因是: 如果在“DateTime”上有聚集索引,则批量插入速度很慢(10000行/秒) 如果在“DateTime”上有一个非活动的聚集索引,则批量插入速度很快(180000行/秒) 我不介意在夜间重建聚集索引,例如从凌晨1点到凌晨6点。您不能禁用聚集索引而仍然使用表。 由于聚集索引是表,禁用它意味着您无法访问任何数据 除删除或重建聚集索引外,无法访问已禁用聚集索引的数据行 你可以 禁用任何非聚集索引并在夜间重建它们。这将大有帮助 删除所

我想知道在写入批量数据时是否可以“暂停”聚集索引

原因是:

  • 如果在“DateTime”上有聚集索引,则批量插入速度很慢(10000行/秒)
  • 如果在“DateTime”上有一个非活动的聚集索引,则批量插入速度很快(180000行/秒)
我不介意在夜间重建聚集索引,例如从凌晨1点到凌晨6点。

您不能禁用聚集索引而仍然使用表。

由于聚集索引是表,禁用它意味着您无法访问任何数据

除删除或重建聚集索引外,无法访问已禁用聚集索引的数据行

你可以

  • 禁用任何非聚集索引并在夜间重建它们。这将大有帮助
  • 删除
    所有索引(包括聚集索引)并插入,然后
    创建
    它们。不过,这将使该表基本上无法使用
我的首选解决方案稍微复杂一点:

  • 插入到与目标表具有相同聚集索引键的暂存表中
  • 隔夜将
    从暂存插入目标,然后根据需要更新索引

Quote:“删除所有索引(包括聚集索引)和insert,然后隔夜创建它们。这将使表基本上无法使用。”。不太正确-我使用水平分区来解决这个问题:按日期时间分区,对2亿行的查询在5秒钟内完成。@Gravitas分区是一个完全不同的动物,您在OP中没有提到。但是,是的,这是一个解决方法(也是分区的优点之一)。作为旁白-是否可以暂停非聚集索引?@gravias-nope。聚集索引就是表。它只是一个通过聚集索引键对数据页进行物理排序的框架。如果您“禁用”或“忽略”它,则引擎不知道将数据放在何处!在没有聚集索引的表中,您将有一个RID(行ID)指向,但在聚集表中,它需要按聚集键。如果不保持这一点,那么就无法阅读或书写任何东西。想象一下一本电话簿,你不确定其中任何人的名字是否确实正确,以获得一个想法。