听说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
好像组合查询时,只能用到第一个索引
#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'
#9
好象是,2005以后的不清楚。
#10
学习
#11
复合索引只针对你查询列为a,b,c且条件为a的情况下效果最明显
语句1能利用到索引
2,3貌似不行
语句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);
这个新的索引技术并不能实现楼主上面写的功能.
该索引包含键列和非键列
例如
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
不知道你的用到这个复合索引是什么样的概念..
使用索引可以分两种.一种是索引扫描.一种是索引查找.
显然索引查找比索引扫描快很多.
能不能使用上这个复合索引..
如果不考虑数据密度,数据分布,以及列覆盖性(因为你是SELECT *,而不是具体哪些列)等因素
1.是可以使用上索引查找.
2.3.可能会用上索引扫描.然后通过bookmark找到不在这个索引上的其它列的数据.
但也可能会用不上.如果优化器认为这样的成本很高.那就直接在表里扫描.
所以考虑的因素比较多.
#14
顶
#15
从实现来看,按a,b,c建立的索引,order by b、order by c是很难使用的
#1
二话不说,抢沙发先
#2
如果我没记错的话应该只有第一个能用到索引
具体看计划
具体看计划
#3
先学习
#4
好像组合查询时,只能用到第一个索引
#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
好象是,2005以后的不清楚。
#10
学习
#11
复合索引只针对你查询列为a,b,c且条件为a的情况下效果最明显
语句1能利用到索引
2,3貌似不行
语句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);
这个新的索引技术并不能实现楼主上面写的功能.
该索引包含键列和非键列
例如
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
不知道你的用到这个复合索引是什么样的概念..
使用索引可以分两种.一种是索引扫描.一种是索引查找.
显然索引查找比索引扫描快很多.
能不能使用上这个复合索引..
如果不考虑数据密度,数据分布,以及列覆盖性(因为你是SELECT *,而不是具体哪些列)等因素
1.是可以使用上索引查找.
2.3.可能会用上索引扫描.然后通过bookmark找到不在这个索引上的其它列的数据.
但也可能会用不上.如果优化器认为这样的成本很高.那就直接在表里扫描.
所以考虑的因素比较多.
#14
顶
#15
从实现来看,按a,b,c建立的索引,order by b、order by c是很难使用的