【问题标题】:Adding SQL Server Index On Boolean Column For Perfomance在布尔列上添加 SQL Server 索引以提高性能
【发布时间】:2014-03-26 13:58:55
【问题描述】:

我在一个繁重的存储过程中有一个条件语句。 25% 的行有一个 Visible=1 标准,但其余的没有,也没有在 Web 应用程序中使用,只是它被处理的一个参考。为该列添加索引是否有益?

WHERE 
   ev.Visible = 1 AND
   (@StartDate IS NULL OR @StartDate <= ev.StartDate) 

【问题讨论】:

  • 这是你可以自己测试的东西。我们没有您的数据集。您在寻找什么究竟
  • 我想知道这样做是不是一种不好的做法,如果不是,是的,我会试一试。
  • 好吧,您不想为每个查询添加索引。如果您发现查询没有以最佳方式执行,它被频繁使用,它可能从索引中受益,那么我不明白为什么不这样做。
  • 不同意@FreshPrinceOfSO 的观点,如果不了解您的情况,很难给出索引建议。索引是有益的,但也有与之相关的成本。这完全取决于此查询的运行频率以及在该表上建立索引的额外INSERT/UPDATE/DELETE 成本。
  • 这还取决于AND 之后的内容。您可能会从另一个索引或复合索引(包括 Visible 列)或部分索引或复合和部分索引中受益更多。

标签: sql sql-server stored-procedures indexing


【解决方案1】:

可能的最佳做法是测试您的实际数据并根据您的发现做出决定。

25% 的选择性对于较大的体积不是很好。对您的数据进行测试以进行验证。您可能会进行需要其他索引的其他类型的搜索。

有几个选项可以更好地处理这种情况:

  • 根据那些 WHERE 子句中的其他谓词,您可能需要考虑使用过滤索引。 CREATE INDEX [IX_Post_Startdate] ON dbo.Posts(StartDate) WHERE VISIBLE = 1。这将为基于 startDate 搜索的其他查询提供支持。
  • 如果 ALL 您的查询使用相同的模式(Visible = 1 AND ...),那么分区可能是一个好方法。
    • 分区是一项企业功能,因此如果您不使用该版本,则可以通过将“不可见”行移动到某种存档表来手动对数据进行分区。
  • 如果您只有很少的 INSERT/UPDATE/DELETE 和很多 SELECT 语句,那么使用索引视图可能是一个很好的解决方案。

【讨论】:

  • “SQL Server 将只使用一个索引” 来源?
  • 每个表每个查询是的。它将在非聚集索引中进行索引查找,然后在聚集索引中查找。它不会使用额外的索引。看看能不能找到出处。
  • 我的措辞不好,删除了错误的陈述
猜你喜欢
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2010-11-08
相关资源
最近更新 更多