--测试表及数据CREATE TABLE tb(Col varchar(10))INSERT tb SELECT '12'UNION ALL SELECT 'aa'GO --观察Transact-SQL语句的执行计划,而不是执行SET SHOWPLAN_ALL ONGO SELECT * FROM tb WHERE ISNUMERIC(Col)=1 AND Col BETWEEN 1 AND 100GO SET SHOWPLAN_ALL OFFGO --建立索引CREATE INDEX IDX_tb_Col ON tb(Col)GO SET SHOWPLAN_ALL ONGO SELECT * FROM tb WHERE ISNUMERIC(Col)=1 AND Col BETWEEN 1 AND 100GO SET SHOWPLAN_ALL OFFGO --删除测试DROP TABLE tb 索引影响查询条件顺序的实例
速度快慢是针对具体某一个查询来讲的 比如生产信息表有100W记录,一个这样的查询select * from 生产信息表 where 生产时间 between 'xx' and 'yy' 当然是给生产时间加一个索引最快。 如果是select * from 生产信息表 where 生产时间 between 'xx' and 'yy' and 产品名称='aa' and 生产线='bb' 那么ID一般建为聚集索引,生产时间,产品名称,生产线这三个字段建一个复合索引最好。
---使用索引优化数据库查询效率 1.不宜创建索引的情形 (1)经常插入,修改和删除的表 (2)数据量比较小的表,因为查询优化器在搜索索引时所花费的时间可能会大于遍历全表的数据所需要的时间2.适合创建索引的情形 (1)为where子句中出现的列创建索引 (2)创建组合索引 (3)为group by 子句中出现的列创建索引3.聚集索引的设计原则 (1)该列的数值是唯一的或者很少有重复的记录 (2)经常使用between ...and..按顺序查询的列 (3)定义identity的唯一列. (4)经常用于对数据进行排序的列.---无法使用索引的select语句 1.对索引列使用了函数,如: select * from tb where max(id)=1002.对索引列使用了'%xx',如: select * from tb where id like '%1' 需要注意的不是所有使用like关键字的select 语句都无法使用索引,比如 select * from tb where id like '1%'就可以使用索引3.在where子句中对列进行类型转换(其实也是使用到了函数)4.在组合索引的第1列不是使用最多的列,如在下面3个查询语句中建立组合索引,按顺序包含col2,col1,id列; select * from tb where id='1' and col1='aa' select id,sum(col1) from tb group by id select * from tb where id='2' and col2='bb' 则第一句和第二句无法使用到索引 所以需要注意组合索引的顺序5.在where 子句中使用in关键字的某些句子 当在in关键字后面使用嵌套的select语句,将无法使用在该列上定义的索引 如: select * from ta where id in (select id from tb where ....)--这样可以用到索引 select * from tb where id in('1','2')
索引影响查询条件顺序的实例
表和索引体系结构 一节相关内容搞明白,这里不好贴帮助内容,贴了也不会有链接的内容,你自己慢慢研究下:
规划和体系结构(数据库引擎) SQL Server 数据库中的对象存储为 8 KB 页的集合。本节说明如何组织、存储和访问表和索引页。本节内容
主题 说明
表组织和索引组织
说明如何组织表和索引页。
堆结构
说明如何将数据行存储在堆中,以及如何对其进行访问和维护。
聚集索引结构
说明如何将数据行存储在聚集索引中,以及如何对其进行访问和维护。
非聚集索引结构
说明如何将索引行存储在非聚集索引中,以及如何对其进行访问和维护。
0.0032035 8.07E-05 0.0032842
0.003125 0.0001592 0.0032842
--第一列是无所因,第二列是有索引!
比如生产信息表有100W记录,一个这样的查询select * from 生产信息表 where 生产时间 between 'xx' and 'yy'
当然是给生产时间加一个索引最快。
如果是select * from 生产信息表 where 生产时间 between 'xx' and 'yy' and 产品名称='aa' and 生产线='bb'
那么ID一般建为聚集索引,生产时间,产品名称,生产线这三个字段建一个复合索引最好。
关建是要明白该查询使用的io越少越好,具体到sql server就是读取的page越小越好
说到底还是要明白索引的结构和数据存储的方式.
可能是其中一项,或者其中两项,或者全部,应该怎么弄既然这样,就一个字段一个索引
至于哪个聚集,现在看不到ID字段的用法,可以把聚集建在生产时间字段
如果id有用,比如删除和更新时往往是根据id删除更新的,那就应该把聚集放在id,其他需要查询的全部放非聚集索引这说法也有点原则性,可能有些特殊情况是需要根据情况调整的。
1.不宜创建索引的情形
(1)经常插入,修改和删除的表
(2)数据量比较小的表,因为查询优化器在搜索索引时所花费的时间可能会大于遍历全表的数据所需要的时间2.适合创建索引的情形
(1)为where子句中出现的列创建索引
(2)创建组合索引
(3)为group by 子句中出现的列创建索引3.聚集索引的设计原则
(1)该列的数值是唯一的或者很少有重复的记录
(2)经常使用between ...and..按顺序查询的列
(3)定义identity的唯一列.
(4)经常用于对数据进行排序的列.---无法使用索引的select语句
1.对索引列使用了函数,如:
select * from tb where max(id)=1002.对索引列使用了'%xx',如:
select * from tb where id like '%1'
需要注意的不是所有使用like关键字的select 语句都无法使用索引,比如
select * from tb where id like '1%'就可以使用索引3.在where子句中对列进行类型转换(其实也是使用到了函数)4.在组合索引的第1列不是使用最多的列,如在下面3个查询语句中建立组合索引,按顺序包含col2,col1,id列;
select * from tb where id='1' and col1='aa'
select id,sum(col1) from tb group by id
select * from tb where id='2' and col2='bb'
则第一句和第二句无法使用到索引 所以需要注意组合索引的顺序5.在where 子句中使用in关键字的某些句子
当在in关键字后面使用嵌套的select语句,将无法使用在该列上定义的索引
如:
select
*
from
ta
where
id
in
(select id from tb where ....)--这样可以用到索引
select * from tb where id in('1','2')
1、往往删除、更新操作会根据自增列,而这部分对性能要求是很高的
2、自增列有一些特性是适合聚集索引的,它往往很短(smallint、int、bigint),它一般不允许更改,它都是后添加的(不容易引起页分裂)当然经常见到无1列出用途的自增列,但是因为难以找到(有时间字段的可以用时间字段)其他合适字段,id用作聚集也是很合适的,因为非聚集索引依赖聚集索引。