汇集索引和非汇集索引sql
汇集索引: 表中各行的物理顺序和索引键值的逻辑顺序相同。一个表中只能有一个汇集索引。汇集索引一般能够加快update和delete的操做速度。只有表包含汇集索引时,表中的数据才按排序顺序存储,该表称为汇集表;若是表没有汇集索引,则其数据行存储在堆的无序结构中。数据库
非汇集索引:具备独立于数据行的结构。非汇集索引包含非汇集索引键值,而且每一个键值项都有指向包含该键值的数据行的指针。函数
...ui
一般状况下,只有当常常查询索引列中的数据时,才须要在表上建立索引。索引会占用磁盘空间,而且下降添加、删除和更新行的速度。spa
查看索引信息 设计
1.在左侧对象资源管理器中查看指针
2.exec sp_helpindex tableNamecode
建立索引 server
create [unique] [clustered | nonclustered] index indexName on{table | view }(columnName [asc | desc] [,...n])
修改索引对象
alter index {indexName | all} on <table | view> {rebuild | disable | reorganize} [;]
删除索引
drop index tableName.indexName
索引的设计
. 不宜建索引的情形:对于常常插入、修改、删除数据的表,不宜建立过多索引。由于当表中的数据发生变化时,索引都要作相应的调整。
. 适合建索引的情形:
1.为where子句中出现的列建立索引
2.若是where子句中涉及多个列,则能够建立由多列组成的组合索引
3.为group by 子句中出现的列建立索引
汇集索引的设计原则:
1.该列数值惟一,或不多重复,如自增列
2.常常使用between... and... 按顺序查询的列
3.常常用于对数据进行排序的列
4.汇集索引不适合对多个列建立组合索引
没法使用索引的查询语句
1.对索引列应用了函数,例如:
select * from order where abs(payment)>200
2.对索引列使用了like 而且通配符%在前,例如:
select * from order where username like '%l'
3.对索引列进行了类型转换
select * from order where cast(payment as decimal(18,2))>200
4.组合索引中的第一列未出如今where子句中
例如,组合索引中的列顺序为A、B、C,可是查询的where子句中引用到的列没有A,即便有B和C也不会使用到索引
5.在where子句中使用in关键字而且嵌套select子句,例如:
select * from order where orderid in(select orderid from orderinfo)
索引 碎片
每当插入、修改、和删除数据时,数据库引擎都会自动对索引进行维护,长此以往,会致使索引分散在数据库中,造成碎片。当碎片达到必定程度时,会下降查询效率。能够经过从新组织和从新生成索引来修复索引碎片
1.检测碎片
sys.dm_db_index_physical_stats( {databaseid}, {object_id}, {index_id}, {partition_number}, {mode | default} )
2.从新组织索引
经过对页进行物理从新排序,使其与叶节点的逻辑顺序相匹配,从而对索引进行叶级别的碎片整理
alter index indexName on table reorganize
3.从新生成索引
删除指定索引并建立一个新索引。此过程将删除索引的碎片并在链接页中对索引进行从新排序
alter index indexName on table rebuild