Sql server 仅更新表本身而不更新索引的SQL Server更新查询

Sql server 仅更新表本身而不更新索引的SQL Server更新查询,sql-server,indexing,Sql Server,Indexing,我需要编写一个只更新表而不更新索引的查询 因为我想更新一个int字段,并且不需要更新10个大索引如果int字段包含在任何索引定义中,那么它们也必须更新 出于明显的数据完整性原因,SQL Server不允许基表有一个值,索引有另一个值 如果int字段未包含在任何索引定义中,则只会更新表 您可以禁用索引,但重新启用索引需要重建整个索引。这取决于您真正想做什么 保持索引与表数据一致是关键。这就是SQL Server和符合ACID的RDBMS的工作方式 有些情况下,例如批量加载,您希望延迟此一致性。因此

我需要编写一个只更新表而不更新索引的查询
因为我想更新一个
int
字段,并且不需要更新10个大索引

如果
int
字段包含在任何索引定义中,那么它们也必须更新

出于明显的数据完整性原因,SQL Server不允许基表有一个值,索引有另一个值


如果
int
字段未包含在任何索引定义中,则只会更新表

您可以禁用索引,但重新启用索引需要重建整个索引。

这取决于您真正想做什么

保持索引与表数据一致是关键。这就是SQL Server和符合ACID的RDBMS的工作方式

有些情况下,例如批量加载,您希望延迟此一致性。因此,如果您有这个用例,请删除或禁用索引

如果禁用索引:

  • 它们将永远不会用于任何查询-
  • 所有相关的唯一和外键等也将被禁用
  • 它们没有得到维护
如果你把它们扔了,当然它们也不能用了

批量加载完成后,再次启用或创建索引/约束

如果这是您真正想要的,请阅读MSDN:

    • 也许正是您所寻找的


      这是SQL Server 2008的一项
      功能,允许您创建仅适用于列中某些值的索引。

      +1@SnowStorm:SQL Server不是dBase-您不能更新数据,但可以忽略索引…对于允许筛选索引的SQL2k8,这一点并不完全正确。不太相关。一般的观点是,如果基表中更新的值也存在于索引中,则两者都需要更新。同意,但您的回答是“SQL Server不允许基表中有一个值,索引中有另一个值”。由于筛选后的索引可能只包含表中值的子集,因此您的语句并不完全正确。也许我只是误读了你的意思。@croppycoding家伙:你太迂腐了。如果马丁加上“一行接一行”,这是可以的,但我希望这是显而易见的。看看这如何适用于OP的案例?您是否建议他们删除索引,并将其全部替换为与更新的“before”或“after”值都不匹配的筛选索引?我想还有另一个选择,但似乎除了在非常特殊的情况下,它不适合我。很难说为什么OP不想更新索引,因为它没有在问题中指定。只是把它作为一种可能实现他们真正想做的事情来提出。是的——实际上OP中的整个概念并没有真正意义。假设添加索引是因为它们对查询有用,那么为什么您希望它们是错误的呢!如果意图不明(询问),则应为注释。我对这个问题的看法是,OP关心写性能,因为内部索引维护。我假设OP有10个索引,他知道关于在一个表上建立索引的所有内容。@gbn事实证明,我的假设与你的不同。