Sql 多个非聚集索引和性能?

Sql 多个非聚集索引和性能?,sql,sql-server,sql-server-2008,indexing,Sql,Sql Server,Sql Server 2008,Indexing,我在SQLServer中有一个表,它有700000条记录。但是,当我在where子句中使用3到4个条件进行简单的select查询时,需要花费45秒的时间。我已经有了2个非聚集索引和1个聚集索引。所以我想在这个表中再添加两个非聚集索引。这样,我的表将为我在查询的where子句中使用的所有列建立索引。我也这样做了,发现结果比前一次来得更快 拥有5到6个非聚集索引是否会损害数据库性能,或者不会产生太大影响 我的查询结构是 SELECT ( SOME COLUMNS) FROM MyTable WHE

我在SQLServer中有一个表,它有700000条记录。但是,当我在where子句中使用3到4个条件进行简单的select查询时,需要花费45秒的时间。我已经有了2个非聚集索引和1个聚集索引。所以我想在这个表中再添加两个非聚集索引。这样,我的表将为我在查询的where子句中使用的所有列建立索引。我也这样做了,发现结果比前一次来得更快

拥有5到6个非聚集索引是否会损害数据库性能,或者不会产生太大影响

我的查询结构是

SELECT ( SOME COLUMNS) FROM MyTable 
WHERE COL1 = @Id AND COL2 >= @SomeDate AND (NOT (COL3 = 1)) AND
(COL4 <= @SomeOtherDate)
从MyTable中选择(某些列)
其中COL1=@Id和COL2>=@SomeDate和(不是(COL3=1))和
(COL4这是您的问题:

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

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

视情况而定。有5-6个索引是可以的,只要它们是必要的。视情况而定意味着什么?如何?这就是我要问的。情况是什么?这是有争议的,取决于各种因素。答案就像@lad2025所说的“视情况而定”。我有多达5-10个索引的表,运行速度非常快。有关更多详细信息,请联机检查覆盖索引。当您对查询进行故障排除时,您还应该查看查询执行计划-该计划将告诉您资源的使用位置,并可以让您了解重点所在。更多索引很少会影响
SELECT
performance,因为如果不使用它们,它们会被忽略。它们确实会影响
INSERT
UPDATE
性能,因为它们需要在基础数据更改时更新。当然,它们也会占用存储空间。聚集索引仍然是B树索引,您的意思是聚集索引会比非聚集索引有所改进吗?一个表只能定义一个聚集索引(通常是主键)。行按照聚集索引进行物理排序。因此,不要在可修改列上定义它@GarethD我相信Gordon说得对。聚集索引只会为您节省几片叶子,因此只会带来一些细微的改进。这是一个好答案,但我相信COL1、COL3和Col4上的单独索引将是一个更好的方法(然而,聚集索引将被捕获三次)因为在现实世界中,我们对这些列使用了更多的查询(特别是日期).Ex:从col4=@somedate的表中选择x。不幸的是,SQL Server只保留复合索引中第一列的统计信息,因此应该明智地选择它。但是对于OP提到的查询,我认为这个解决方案是合适的。@AnujTripathi…您可能认为单独的索引会很有用,但复合索引是常见的好多了。
WHERE COL1 = @Id AND COL2 >= @SomeDate AND COL3 = 0 AND
      (COL4 <= @SomeOtherDate)