2015-10-08 27 views
0
SELECT Col1 
FROM Tab1 
INNER JOIN Tab2 ON Tab1.Col2 = Tab2.Col2 
WHERE Tab1.Col3 = "some ID" 
GROUP BY Col1, Col4 
ORDER BY Col4 DESC 

为上述情况创建覆盖索引的一般方法是什么?什么是SQL Server子句的索引的一般顺序?

是不是像列从

  1. ORDER BY
  2. GROUP BY
  3. WHERE
  4. JOIN
  5. 选择

这就好比

INDEX (Col4, Col1, Col3, Col2) ? 

我用的是SQL Server 2000的

+0

对于'SELECT',你应该在'(Col3)'上有一个索引来处理'WHERE'子句 - 但对于'ORDER BY',你的索引应该在' (Col4)',对于GROUP BY,它应该在'(Col1,Col4)'上 - 简而言之:你将无法使用单个索引处理这个问题 –

+0

如果查询不覆盖索引经常使用? –

+0

当然可以 - 但是您将无法创建同时满足所有要求的覆盖指数..... –

回答

0

这是我发现通过测试

•首先应该是JOIN

Ø索引字段顺序应该是连接顺序[自下而上的反]

o如果JOIN ON PK,则不会使用您在表格上创建的任何开始PK字段的索引。服务器将只使用PK。

•然后WHERE

ö索引字段顺序应该是WHERE顺序[自下而上]

的反向•然后GROUP BY

•然后ORDER BY

•然后选择[如果进行覆盖指数]

同时也索引任何计算列

具有View/Sproc的部分索引不会加速。如果在多表查询中有很少的列在GROUP BY上编制索引,则索引会减慢它的速度。最初它使用PK,它很快。因此,不要打扰多表查询的部分索引

如果在View上执行了SQL语句,如果您为SQL语句编制索引,则不会有性能改进。该指数应基于以下观点:

Select * from Leasedetailsqry where status ='Active' And (territory LIKE 'Quebec') ORDER BY id

索引领地,地位是不给任何性能改进。你应该基于视图Leasedetailsqry

相关问题