彙集索引和非彙集索引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