MSSQL 4 索引管理

2021-09-28 19:41:01 字數 4006 閱讀 9671

目錄

對於日常更新較少的表,應使用索引技術來減少返回查詢結果集而必須讀取的資料量(從而提高查詢效率)。

而如果表需要經常執行插入、刪除、修改操作,過多的索引則會導致過多的維護,即維護資料的同時,還需要維護索引。

1.索引基礎

索引是乙個單獨的物理資料儲存結構,其中包含由表或檢視中的一列或多列生成的鍵。

1.1 分類

索引的5種主要型別及其它:

每個表幾乎都對列定義聚集索引來實現下列功能:1)經常使用的查詢;2)高度唯一性;3)範圍查詢。— ???範圍查詢怎麼理解

通常,非聚集索引是為改善經常使用的、沒有建立聚集索引的查詢效能。

全文引擎基於要編制索引的文字中的各個標記來生成倒排、堆積且壓縮的索引結構。(資料列可以是char、varchar、nvarchar,以及格式化二進位制資料)

指定唯一索引前,唯一性首先必須是資料本身的特徵。

通過包含非鍵列,可以建立覆蓋更多查詢的非聚集索引。

與全表索引相比,設計良好的篩選索引可以提高查詢效能、減少索引維護開銷並可降低索引儲存開銷。

僅在資料操作語言語句對索引中的資料產生影響時,才對索引進行維護;篩選索引可以非常多,特別是其中包含很少受影響的資料時。

1.2 特徵

聚集 | 非聚集

唯一 | 非唯一

單列 | 多列

索引中的列是公升序 | 降序

非聚集索引是全表 | 篩選

1.3 索引設計注意事項

1.3.1 資料庫

1)可以使用資料庫引擎優化顧問來分析資料庫並生成索引建議。

2)對於不需要更新的表,大量索引有利於提公升查詢效能,優化器的選擇多。

3)乙個表中建有大量索引,會影響insert、update、delete語句的效能。

4)小表建立索引無意義。

5)檢視包含聚合、表聯接或聚合和聯接的組合時,檢視索引可以顯著提公升效能。

1.3.2 查詢

1)涵蓋索引1

可以提高查詢效能,eg.某錶的a,b,c列建立了組合索引,當對a,b列查詢時,只需從索引本身即可得到資料。

2)適量的為經常用於查詢中的謂詞和聯接條件的所有列建立非聚集索引。

3)將插入或修改盡可能多的行寫入單個語句。

1.3.3 資料列

1)聚集索引應當保持較短的索引鍵長度。

2)唯一列、非空列建立聚集索引更佳。

3)不應在頻繁更改的列上建立聚集索引。

4)多列索引,應考慮列的順序。用於(=>< between)搜尋條件的where子句或參與聯接的列應放最前面。

2. 建立索引

建立索引時,

2.1 最大索引限制

2.2 限制索引參與的資料型別

2.3 建立索引

create table tt

( id int primary key,

name char(20)

)go

create table customers

( id int not null,

name char(20))go

-- unique 指定唯一索引(可以包含clustered,如不包含預設為非聚集索引)

-- clustered 指定聚集索引

create unique clustered index ix_customers

on customers(id)

goinsert into customers

values

(3, 'kk'), (2, 'jj'), (1, 'zz')

goselect *

from customers

雖然插入是降序的,但由於建立的是聚集索引,表中的資料是按索引順序儲存的。

create index ix_document_title -- 非聚集索引

on document(title, revision)

include(filename) -- 非鍵列

goinsert into document

values

('a', 'b', 'ccc'), ('b', 'b', 'ddd')

goselect *

from document

go查詢中所有列都作為鍵列或蜚鍵列包含在索引中,查詢效率非常高。(直接在索引中找到)

3. 修改索引

3.1 修改屬性

-- 刪除約束

alter table table_name

drop constraint 約束名

[with(online = on) ]

3.2 重新命名
exec sp_rename 'name', 'new_name', 'index'
3.3 禁用索引

3.3.1 索引禁用與重啟

if object_id('ee', 'u') is not null

drop table ee

if object_id('tt', 'u') is not null

drop table tt

gocreate table ee

( id int primary key,

name varchar(20))go

create table tt

( x int constraint pk_tt primary key,

y int not null,

constraint fk_ee foreign key(y) references ee(id))go

-- 禁用

alter index pk_tt

on tt

disable

go----------------

-- 通過禁用primary key索引來禁用primary key約束

-- foreign key約束自動禁用,發出警告

warning: foreign key 'fk_ee' on table 'tt' referencing table 'ee' was disabled as a result of disabling the index 'pk_tt'.

-- 重啟

alter index pk_tt

on tt

rebuild -- 主鍵

goalter table tt

check constraint fk_ee -- 外來鍵

go-- 查詢索引狀態

select i.name

, i.is_disabled

from sys.indexes i

where i.object_id = object_id('tt')

-----

name | is_disable

pk_tt 1

3.3.2 重新組織和重新生成索引

對基礎資料執行insert、delete、update,資料庫引擎會自動維護索引。但時間久了,會形成大量索引碎片,並降低查詢效能。

就是傳統方式在多個列上建立的索引。區別於包含列索引,涵蓋索引的所有列都是鍵值。 ↩︎

MS SQL索引型別

一 索引的概念 索引就是加快檢索表中資料的方法。資料庫的索引類似於書籍的索引。在書籍中,索引允許使用者不必翻閱完整個書就能迅速地找到所需要的資訊。在資料庫中,索引也允許資料庫程式迅速地找到表中的資料,而不必掃瞄整個資料庫。二 索引的特點 1.索引可以加快資料庫的檢索速度 2.索引降低了資料庫插入 修...

MS SQL 索引設計的準則

ms sql 索引設計的準則 一.經常被用來搜尋資料記錄的字段 1.primary 約束所定義的作為主鍵的字段 自動建立 2.unique約束所定義的字段 自動建立 3.foreign key 約束所定義的作為外來鍵的字段 4.在查詢中用來連線表的字段 5.經常用來作為排序基準的字段 二.索引會占用...

MSSQL優化之索引優化

1。用count 統計比用count 字段 快。用count 主鍵 速度最快!2。select cid,title,cnt from table where cid 9999999 or riqi 2004 9 16 select cid,title,cnt from table where cid...