【问题标题】:Multiple Non-Clustered index and performance?多个非聚集索引和性能?
【发布时间】:2015-10-08 11:30:41
【问题描述】:

我在 SQL Server 中有一个包含 700 000 条记录的表。但是,当我在 where 子句中使用 3 到 4 个条件进行简单的选择查询时,最多需要 45 秒。我已经有 2 个非聚集索引和 1 个聚集索引。所以我想在该表中再添加 2 个非聚集索引。通过这样做,我的表将具有我在查询的 where 子句中使用的所有列的索引。我也这样做了,发现结果比以前的要快得多。

可以有 5 到 6 个非聚集索引会损害数据库性能还是影响不大?

我的查询结构是

SELECT ( SOME COLUMNS) FROM MyTable 
WHERE COL1 = @Id AND COL2 >= @SomeDate AND (NOT (COL3 = 1)) AND
(COL4 <= @SomeOtherDate)

表格有 35 列。

【问题讨论】:

  • 视情况而定。只要有必要,就有 5-6 个索引是可以的。
  • 取决于手段?如何 ?这就是我要问的。有哪些情况?
  • 因此,这是有争议的,取决于各种因素。答案就像@lad2025 说“这取决于”。我有多达 5-10 个索引的表,它的运行速度非常快。更多详细信息,请在线查看覆盖指数。
  • 当您对查询进行故障排除时,您还应该查看查询执行计划 - 这将告诉您资源被花费在哪里,并且可以让您了解应该关注的地方。
  • 更多索引很少会损害SELECT 的性能,因为如果不使用它们就会被忽略。它们确实会影响INSERTUPDATE 的性能,因为它们需要在基础数据更改时进行更新。当然,它们也会占用存储空间。

标签: sql sql-server sql-server-2008 indexing


【解决方案1】:

这是您的查询:

SELECT ( SOME COLUMNS)
FROM MyTable 
WHERE COL1 = @Id AND COL2 >= @SomeDate AND (NOT (COL3 = 1)) AND
      (COL4 <= @SomeOtherDate)

很遗憾,您的查询只能直接使用此子句中的两列。我建议使用以下 composite 索引:(col1, col2, col3, col4)。该索引涵盖了where 子句,但只能直接用于前两个条件。

聚簇索引可能比非聚簇 B 树索引略有改进。

注意如果col3 只取值0 和1,那么你应该写where 的情况:

WHERE COL1 = @Id AND COL2 >= @SomeDate AND COL3 = 0 AND
      (COL4 <= @SomeOtherDate)

并使用(col1, col3, col2, col4)(col1, col3, col4, col2)

【讨论】:

  • 聚集索引仍然是B树索引,你的意思是聚集索引会比非聚集索引有所改进吗?
  • 一张表只能定义一个聚集索引(通常是主键)。这些行按照聚集索引进行物理排序。所以不要在可修改的列上定义它。
  • @GarethD 我相信戈登说得对。聚集索引只会为您节省一些叶子,因此只会有微小的改进。
  • 这是一个很好的答案,但我相信 COL1、COL3 和 Col4 上的单独索引将是更好的方法(但是,聚集索引将被捕获 3 次),因为在现实世界中,我们对这些使用更多查询列(特别是日期)。例如:从 col4 = @somedate 的表中选择 x。不幸的是,SQL Server 只保留复合索引中第一列的统计信息,因此应该明智地选择它。但是对于OP提到的查询,我认为这个解决方案是合适的。
  • @AnujTripathi 。 . .您可能认为单独的索引会很有用,但复合索引通常更好。
猜你喜欢
  • 2011-10-12
  • 2016-09-05
  • 2013-08-07
  • 2023-03-23
  • 2011-07-02
  • 2011-03-24
  • 2014-11-04
  • 2021-01-14
相关资源
最近更新 更多