2012-10-18 93 views

回答

2

单个非聚集索引中有多个列之间的区别,有多个非聚集索引,每个非聚集索引都有一个单独的列?

考虑一个表T与clucstered PK Id柱,并且附加列ABC

ABC可以支持快速查询的查询,如单个非聚集索引:在这两个案件

WHERE A > @a 
WHERE A = @a AND @b1 < B AND B < @b2 
WHERE A = @a AND B = @b AND C < @c 

但不

WHERE B = @b 
WHERE C = @c 

,我们不能做任何不是表扫描更好

然而,如果我们有多个索引,IX_AA等:

WHERE A = @a 
WHERE B = @b 
WHERE C = @c 

都会受益于索引和复合查询,如

WHERE A = @a AND B = @b AND C < @c 

将有一个小的好处了。

0

SELECT查询那些会优化的不一样。

您不应该在不需要查询性能优化的情况下添加索引。

如果您有查询优化,那么您可以开始考虑添加对应于您要优化的查询的索引。

比方说,你有包含以下结构的一个表:

create table emp 
(
    id int identity primary key clustered, 
    name nvarchar(200), 
    dep_id int, 
    salary int 
); 

您的聚集索引(primary key clustered条款)将加快使用id列过滤查询查找和行数据检索像:

select id, name, dep_id, salary 
from emp 
where id = @id 

任何(唯一的)列的任何非聚集索引将加快查询(试验时他行数据检索)使用相同的列作为过滤器。

create index emp_name_idx on emp(name); 
-- will speed up look-up for 
select id, dep_id 
from emp 
where name = @name 

如果你也想使用相同的索引来加速该行的数据检索,将需要目前SELECT子句中的列添加到包括列。

create index emp_name_idx on emp(name) include(id, dep_id); 
-- will speed up look-up and data row retrieval for 
select id, dep_id 
from emp 
where name = @name 

含有倍数的列,因为它们出现在索引(只要过滤器是相等比较将加快查找使用以相同的顺序在第一n列的查询任何非聚集索引,所述当满足第一个不等式比较时,列优化条带将结束)。

create index emp_namesalary_idx on emp(dep_id, salary); 
-- will speed up look-up and data row retrieval for 
select id, dep_id 
from emp 
where dep_id = @dep_id 
    and salary > @salary 

对于单列索引,也优化行数据检索,使用include子句SELECT条款,是不是已经存在于索引列列表中指定的每个列。

请记住,对于添加到表中的每个索引,您还将为此表添加INSERT开销。因此,您应该始终在SELECT报表上的指数收益与INSERT报表亏损之间平衡表现。 还请记住,索引使用磁盘(和缓存)空间,这也应该在决策过程中计数。

+0

我有一吨的查询各做别的事情。 – user1662812

+0

然后,您可以优化这些中的每一个,最好只有资源密集型的,这取决于您插入的性能需求。如果您需要关于哪些索引可以加快哪些查询的建议,则应该开始阅读索引编制的基础知识。我会更新答案给一个简单的例子。 – Paciv