8.索引的簡單介紹

--索引是一個單獨存儲在磁盤上,對數據庫表中一列或者多列的值迚行排序的一種數據庫結構。索引包含着對數據表裏所有記錄的引用指針
--分類:
--聚集索引 clustered index
--非聚集索引 nonclustered index
--聚集索引示意圖

--非聚集索引示意圖

--聚集索引
--聚集索引的索引頁面直接指向數據頁面,所以查找速度快,但每張表只能創建一個聚集索引,
--聚集索引需要至少相對於該表120%的附件空間,以存放該表的副本和索引中間頁
--非聚集索引
--每個索引中丌包含記錄的數據,是數據行的指針。每個表可以有多個非聚集索引。
--其他索引
--唯一索引 確保索引鍵不包含重複的鍵。
--包含列索引 非聚集索引,不僅包含鍵列,還包含非鍵列
--索引視圖        結果集保留在數據庫中,並建立了索引以供快速訪問的視圖
--全文索引        基於標記的索引,通過sqlserver的全文引擎服務創建,使用和維護,目的是爲了用戶提供在字符串數據中高效搜索複雜詞語
--空間索引        針對geometry數據類型的索引
--Xml        對xml數據類型的字段創建主索引,對xml數據的元素名,值,屬性和路徑進行創建索引

--索引的設計原則
--(1)選擇唯一性索引
--(2)爲經常需要排序、分組和聯合操作的字段建立索引
--(3)爲常作爲查詢條件的字段建立索引
--(4)限制索引的數目
--(5)儘量使用數據量少的索引

--創建索引
--語法
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]
INDEX index_name ON { table | view } ( column [ ASC | 
DESC ] [ ,...n ] )
[INCLUDE (column_name [ ,...n ])]
[with
[PAD_INDEX={ON|OFF}]
[[,]FILLFACTOR=fillfactor]
[[,]IGNORE_DUP_KEY={ON|OFF}]
[[,]DROP_EXISTING={ON|OFF}]
[[,]STATISTICS_NORECOMPUTE={ON|OFF}]
[[,]SORT_IN_TEMPDB={ON|OFF}]
]
[ ON filegroup ]
--UNIQUE:用於指定爲表或視圖創建唯一索引,即丌允許存在索引值相同的兩行。
-- CLUSTERED:用於指定創建的索引爲聚集索引。
-- NONCLUSTERED:用於指定創建的索引爲非聚集索引。
--index_name:用於指定所創建的索引的名稱。
-- table:用於指定創建索引的表的名稱。
-- view:用於指定創建索引的視圖的名稱。
-- ASC|DESC:用於指定具體某個索引列的升序或降序排序方向。
--Column:用於指定被索引的列。
--PAD_INDEX:用於指定索引中間級中每個頁(節點)上保持開放的空間。
--FILLFACTOR = fillfactor:用於指定在創建索引時,每個索引頁的數據佔索引頁大小的百分比,fillfactor的值爲1到100。 
--IGNORE_DUP_KEY:用於控制當往包含於一個唯一聚集索引中的列中揑入重複數據時SQL Server所作的反應。
--DROP_EXISTING:用於指定應刪除並重新創建已命名的先前存在的聚集索引或者非聚集索引。
--STATISTICS_NORECOMPUTE:用於指定過期的索引統計丌會自勱重新計算。
--SORT_IN_TEMPDB:用於指定創建索引時的中間排序結果將存儲在 tempdb數據庫中。
--ON filegroup:用於指定存放索引的文件組。

--創建非聚集索引(爲student表sname創建索引)
create nonclustered index index_student on student (sname asc)
--with(drop_existing=on)--如果已經存在同名索引則刪除,若無同名就不用了加
go
--用系統存儲過程查看索引信息
exec sp_helpindex[@objectname=] 'name'
--修改索引
--重新生成索引
alter index index_student on studnet rebuild
go
--重新組織索引
alter index index_student on studnet reorganize
go
--禁用索引
alter index index_student on student disable
go
--刪除索引
drop index student.index_student

--無論何時對基礎數據執行揑入、更新或刪除操作,SQL server數據庫引擎都會自勱維護索引。
--隨着時間的推移,這些修改可能會導致 中的信息分散在數據庫中(含有碎片)。
-- 可以通過重新組織或重新生成索引來修復索引碎片。
--維護索引的用戶必須是sysadmin固定服務器角色的成員,或者是db_ddladmin和db_owner固定數據庫角色的成員

--使用sql檢查碎片
select a.index_id,name,avg_fragmentation_in_percent
from sys.dm_db_index_physical_stats(db_id(N'databasename')),object_id(N'tablename')
as a join sys.indexses as b
on a.object_id=b.object_id and a.index_id=b.index_id

--重新生成碎片
alter index index_id on tablename rebuild
partition=all
with(pad_index=off,
statistics_norecompute=on,
allow_row_locks=on,
allow_page_locks=on,
ignore_dup_key=off,
online=off,
sort_in_tempdb=off
)

--重新生成表中的所有索引
alter index all on tablename
rebuild with(fillfactor=80,sort_in_tempdb=on,statistics_norecompute=on)
go

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章