索引高手请进

时间:2023-01-23 14:42:20
表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 索引?
请问:这个新的索引技术怎么用及注意事项,最好还能给段代码.

15 个解决方案

#1


二话不说,抢沙发先

#2


如果我没记错的话应该只有第一个能用到索引
具体看计划

#3


先学习

#4


引用 2 楼 guguda2008 的回复:
如果我没记错的话应该只有第一个能用到索引
具体看计划

好像组合查询时,只能用到第一个索引

#5


05都会用到索引

#6


create table tb(a int, b int, c int)
create index idx_a on tb(a) include(b,c)
drop table tb

#7


--这样会用到覆盖索引
select a,b,c from tb where a='xxx'

#8


http://www.blue1000.com/bkhtml/2006-08/45511.htm另外,SQL SERVER 2005好像支持在线索引!去GOOGLE看一下

#9


引用 4 楼 sql77 的回复:
引用 2 楼 guguda2008 的回复:
 如果我没记错的话应该只有第一个能用到索引
 具体看计划

 好像组合查询时,只能用到第一个索引

好象是,2005以后的不清楚。

#10


学习

#11


复合索引只针对你查询列为a,b,c且条件为a的情况下效果最明显
语句1能利用到索引
2,3貌似不行

#12


楼主说的是带有包含性列的索引
这个新的索引技术并不能实现楼主上面写的功能.
该索引包含键列和非键列
例如
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);       
 

#13


引用楼主 zhangsong841 的回复:
表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 索引?
请问:这个新的索引技术怎么用及注意事项,最好还能给段代码.


不知道你的用到这个复合索引是什么样的概念..
使用索引可以分两种.一种是索引扫描.一种是索引查找.
显然索引查找比索引扫描快很多.

能不能使用上这个复合索引..
如果不考虑数据密度,数据分布,以及列覆盖性(因为你是SELECT *,而不是具体哪些列)等因素

1.是可以使用上索引查找.
2.3.可能会用上索引扫描.然后通过bookmark找到不在这个索引上的其它列的数据.
  但也可能会用不上.如果优化器认为这样的成本很高.那就直接在表里扫描.

所以考虑的因素比较多.

#14


#15


从实现来看,按a,b,c建立的索引,order by b、order by c是很难使用的

#1


二话不说,抢沙发先

#2


如果我没记错的话应该只有第一个能用到索引
具体看计划

#3


先学习

#4


引用 2 楼 guguda2008 的回复:
如果我没记错的话应该只有第一个能用到索引
具体看计划

好像组合查询时,只能用到第一个索引

#5


05都会用到索引

#6


create table tb(a int, b int, c int)
create index idx_a on tb(a) include(b,c)
drop table tb

#7


--这样会用到覆盖索引
select a,b,c from tb where a='xxx'

#8


http://www.blue1000.com/bkhtml/2006-08/45511.htm另外,SQL SERVER 2005好像支持在线索引!去GOOGLE看一下

#9


引用 4 楼 sql77 的回复:
引用 2 楼 guguda2008 的回复:
 如果我没记错的话应该只有第一个能用到索引
 具体看计划

 好像组合查询时,只能用到第一个索引

好象是,2005以后的不清楚。

#10


学习

#11


复合索引只针对你查询列为a,b,c且条件为a的情况下效果最明显
语句1能利用到索引
2,3貌似不行

#12


楼主说的是带有包含性列的索引
这个新的索引技术并不能实现楼主上面写的功能.
该索引包含键列和非键列
例如
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);       
 

#13


引用楼主 zhangsong841 的回复:
表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 索引?
请问:这个新的索引技术怎么用及注意事项,最好还能给段代码.


不知道你的用到这个复合索引是什么样的概念..
使用索引可以分两种.一种是索引扫描.一种是索引查找.
显然索引查找比索引扫描快很多.

能不能使用上这个复合索引..
如果不考虑数据密度,数据分布,以及列覆盖性(因为你是SELECT *,而不是具体哪些列)等因素

1.是可以使用上索引查找.
2.3.可能会用上索引扫描.然后通过bookmark找到不在这个索引上的其它列的数据.
  但也可能会用不上.如果优化器认为这样的成本很高.那就直接在表里扫描.

所以考虑的因素比较多.

#14


#15


从实现来看,按a,b,c建立的索引,order by b、order by c是很难使用的