一般情况下,这两种索引在不同的查询条件下的查询速度是不同的,
下面简单地以"快"和"慢"来说明:第一: a b c分别建立索引时,
查询条件:仅为其中一个字段为条件时
如: where a[条件]
或 where b[条件]
或 where c[条件],快
查询条件:多个字段为条件时,慢(如:where a[条件], b[条件] )第二: abc建立一个复合索引时,
查询条件: where a[条件]
或 where a[条件], b[条件]
或 where a[条件], b[条件], c[条件],快
其余条件时,慢
下面简单地以"快"和"慢"来说明:第一: a b c分别建立索引时,
查询条件:仅为其中一个字段为条件时
如: where a[条件]
或 where b[条件]
或 where c[条件],快
查询条件:多个字段为条件时,慢(如:where a[条件], b[条件] )第二: abc建立一个复合索引时,
查询条件: where a[条件]
或 where a[条件], b[条件]
或 where a[条件], b[条件], c[条件],快
其余条件时,慢
解决方案 »
- 请教!SQL server数据库的核心内容有哪些?
- SQL安装问题。
- 在Sql数据库中能够不看代码,找到视图中都用了哪些表吗?
- Analysis Services服务器无法登陆 ,无法连接。 127.0.0.1:2383 (System)
- 请问高手们,在WINGDOW2000下的sql数据库怎样才能导入WINGDOWXP下的SQL数据库里面
- 修改字符串里的某一个字符 SQL
- 请问 如何金修改 SQL server的@@servername
- 请教关于触发器
- 怎样才能自动将.sql脚本文件自动发送到查询分析器中自动运行
- 兄弟们,请问哪里有金碟K/3总帐系统下载?高分送上?
- 请高手修改一条SQL 语句 急需!!!!
- 〓〓〓急救...SqlServer2K的DBO权限死活不能写入和修改,读取却正常〓〓〓
第一: a b c分别建立索引时,
查询条件:多个字段为条件时,慢(如:where a[条件], b[条件] )
为什么慢,比不建索引还慢吗 !!第二: abc建立一个复合索引时,
查询条件: where a[条件]
或 where a[条件], b[条件]
或 where a[条件], b[条件], c[条件],快
这个又为什么要快,,快的原理是什么,,,那么这样where b[条件], c[条件],会快吗??
当建立单独的a索引的时候,where a条件的执行速度为va,where a条件,b条件的速度为vab
建立复合ab索引的时候,where a条件的执行速度为v1a,where a条件,b条件的速度为v1ab
那么有如下比较:va>v1a
vab<v1ab!!!仔细体会其区别,呵呵
其次是从左最大匹配的索引,
再次是每个条件的独立索引。
不建索引或者不是从左开始的复合索引将得不到优化。比如条件是a=1 and b=1 and c=1,建立bc的索引的话,不会有任何作用^)^
而同样的条件,建立a,ab,abc的索引,将使用abc索引优化;没有abc的时候,SQL就去找ab,再找a。以b,c开头的索引,是不会被使用的
关于查询速度能否加快,其实是查询是否符合优化条件的问题.
楼上说得对,优化器对SQL语句优化是有条件的,因此在建立数据库时,应考滤条件查询的SQL语句而建立好相应的索引.
建立索引并非多而全为最好,数据量很大时,若没有适当的索引,查询速度相差是非常大的.
还有两个疑问,
1,优化器是怎样选择索引的(原则),比如有了a,ab,abc三个索引,她为什么不选择bc,或者ac
2,在进行索引查询时候,,索引叶层有什么多,,,系统是怎样确定最终的定位的(也就索引的路径)
(a int,
b int,
c int,
degist varchar(20))insert into test_index
select 1,2,3,'aa'
union
select 2,3,3,'aab'
union
select 3,4,3,'aac'
union
select 4,2,3,'aad'
union
select 5,2,3,'aae'
如果有下面的SQL:select a,b,c
from test_index
where a=1 and b=4 and c=3最好的索引建立方式是:create index abc on test_index(a,b,c)为什么呢?这是因为你的select谓词中需要abc,而如果能在一个索引中找到所有abc的信息,那么优化器将选择这条索引。那么a、b、c字段在建立索引的时候的顺序有什么影响呢?注意!这一点比较容易误解!
在上面的场景中
create index abc on test_index(a,b,c)
要比
create index bac on test_index(b,a,c)好。
为什么呢?这不是where后面的顺序决定的,而是表中的记录形态决定的。注意a的值是高基数度(重复值比率最低)的,当a作为索引的头
会对Btree的构建非常有利。但是如果你做实验会发现,如果首先建立了abc,然后建立了bac那么在执行计划中会选择bac索引。但是将索引的建立顺序反过来,
它就会选择abc。个人感觉这是优化器的智力问题,我们不能强求。
如果没有abc和bac索引的话,而是建立了:create index bc on test_index(b,c)那么执行计划会首先在索引中找到bc的信息,因为bc索引中没有a的信息所以要定位到表中找到a的信息,一起返回。如果已经有了abc或者bac,优化器正常情况下不会使用bc索引。因为abc和bac已经达到了索引覆盖的目的了!只建立c的索引,情况和bc类似,你可以自己做实验观察。
2,在进行索引查询时候,,索引叶层有什么多,,,系统是怎样确定最终的定位的(也就索引的路径)解答:如何对Btree进行遍历那是具体算法问题。你可以参考:http://www.leftworld.net/wenzhang/show/1996.html但是SQL Server会作一定的改动和优化,你可以通过它看原理。
上面都是针对非聚集索引的情况说明的。关于索引的其他你可以参考:http://community.csdn.net/Expert/topic/4430/4430562.xml?temp=.6278192
------
(因为bc索引中没有a的信息所以要定位到表中找到a的信息,一起返回)这句怎么理解,
是不是以为要做表扫描,,bc索引无效了!!