表t上的字段a和字段b还有字段c上建一个复合索引,
听说sql2005有个新的索引技术,只要查询条件出现'字段b' or '字段c' or '字段a'就能用到这个复合索引,
如:
1,select * from t where a='xxx';
2,select * from t where b='xxx';
3,select * from t where c='xxx';
这三句都能用到该复合索引,不存在索引覆盖问题.
includ 索引?
请问:这个新的索引技术怎么用及注意事项,最好还能给段代码.
听说sql2005有个新的索引技术,只要查询条件出现'字段b' or '字段c' or '字段a'就能用到这个复合索引,
如:
1,select * from t where a='xxx';
2,select * from t where b='xxx';
3,select * from t where c='xxx';
这三句都能用到该复合索引,不存在索引覆盖问题.
includ 索引?
请问:这个新的索引技术怎么用及注意事项,最好还能给段代码.
create index idx_a on tb(a) include(b,c)
drop table tb
select a,b,c from tb where a='xxx'
语句1能利用到索引
2,3貌似不行
这个新的索引技术并不能实现楼主上面写的功能.
该索引包含键列和非键列
例如
USE AdventureWorks;
GO
SELECT City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
所以好的索引设计应该将 PostalCode 定义为键列并包含作为非键列的所有其他列。 下面的语句创建了一个覆盖查询的带有包含性列的索引。 USE AdventureWorks;
GO
CREATE INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE ( City, StateProvinceID);
不知道你的用到这个复合索引是什么样的概念..
使用索引可以分两种.一种是索引扫描.一种是索引查找.
显然索引查找比索引扫描快很多.能不能使用上这个复合索引..
如果不考虑数据密度,数据分布,以及列覆盖性(因为你是SELECT *,而不是具体哪些列)等因素1.是可以使用上索引查找.
2.3.可能会用上索引扫描.然后通过book找到不在这个索引上的其它列的数据.
但也可能会用不上.如果优化器认为这样的成本很高.那就直接在表里扫描.所以考虑的因素比较多.