哈嘍
太長時間沒有更新SQL Server是不是大家把以前學的知識都給忘記了,忘記了就趕緊回顧學習
往期精選
SQL Server從入門到精通(一)
SQL Server從入門到精通(二)
SQL Server從入門到精通(二)精講
SQL Server從入門到精通(三)
SQL Server從入門到精通(四)
SQL Server從入門到精通(五)
目錄
一、索引的概述
二、索引的類型
三、索引的創建和使用
四、查詢中的執行計劃
五、索引使用中的維護
好了今天我們就正式進入SOL Server的學習
一、索引的概述
1.索引:是SQL 編排數據的內部方法,爲SQL Server提供了一種方法來編排查詢數據
2.索引的分類:
(1)聚集索引:正文內容本身就是一種按照一定規則排列的目錄稱爲“聚集索引”,例如新華字典裏面的所有字按照abcd排列
(2)非聚集索引:目錄純粹是目錄,正文純粹是正文的排序,例如:新華字典裏按照偏旁查詢字,偏旁在一個空間,字在一個空間
3.作用:大大提高數據庫的檢索速度,改善數據庫性能
4.建立索引的原則:
1.每個表只能創建一個聚集索引
2.每個表最多可以創建249個非聚集索引
3.在經常查詢的字段上建立索引
4.text,image,bit數據類型的列上不要建立索引
5.外鍵列可以建立索引
6.主鍵列必須建立索引
7.重複值比較多,查詢較少的列上不要建立索引
二、索引的類型
文字多主要是讓大家理解,省略一點總感覺怪怪滴
1.聚集索引和非聚集索引
行的物理存儲順序與索引順序完全相同,每個表只允許建立一個聚集索引。而非聚集索引不改變表中數據行的物理存儲順序。
使用聚集索引檢索數據要比非聚集索引快。SQL Server 爲主鍵約束建立的索引爲聚集索引,但這一默認設置可以使用 NONCLUSTERED 關鍵字改變。同樣,默認情況下,SQL Server 爲 UIQUE 約束所建立的索引爲非聚集索引,這一默認設置可以使用 CLUSTERED 關鍵字改變。
在 CREATE INDEX 語句中,使用CLUSTERED 選項可以建立聚集索引。
聚集索引可以使用 NONCLUSTERED 關鍵字改變爲非聚集索引。
一個表最多可以建立 249 個非聚集索引。
2.主鍵索引和非主鍵索引
表定義主鍵時自動創建主鍵索引,並且會自動創建聚集索引。
非主鍵索引是在非主鍵的屬性列上創建的索引,這些索引一般都是非聚集索引,除非主鍵索引通過 NONCLUSTERED 關鍵字改變爲非聚集索引,纔可以在某個非主鍵列上創建聚集索引。
3.惟一索引和非惟一索引
惟一索引可以確保索引列中不包含重複值。
如果某列包含多行 NULL 值,不能在該列上創建惟一索引。
在 CREATE TABLE 或 ALTER TABLE 語句中設置 PRIMARY KEY 約束或 UNIQUE
約束時,SQL Server 自動爲這些約束創建惟一索引;在 CREATE INDEX 語句中使用 UNIQUE
選項也可創建惟一索引。
4.單列索引
單列索引是指對錶中單個列建立索引。多數情況下,單列索引是創建索引首選考慮的索
引。因爲單列索引代價相對較小,而對數據庫查詢效能提高很大。
5.單列索引和複合索引
單列索引是指對錶中單個列建立索引。
而一個索引中包含了一個以上的列稱爲複合索引,最多可以有 16 個列複合到一個索引中,並且這些列必須位於同一個表中,複合的多列索引允許某一列具有相同的值。
複合索引值的最大長度爲 900 個字節。
例如,不可定義爲
char(300)、char(300)和 char(301)的三個列上創建單個索引,因爲總寬度超過了 900 字節。
在使用複合索引檢索時,把被索引的列作爲一個單位。複合索引中的列順序可以和表中
的列順序不同。在複合索引中應該首先定義最可能具有惟一性的屬性列。
三、索引的創建和使用
索引的創建
使用T—SQL 語句創建索引
USE xmgl
GO --創建索引
IF EXISTS(SELECT* FROM sysindexes WHERE name='emp_id')--創建索引之前要判斷是否存在索引
DROP INDEX UserInfo.emp_id--表名.索引名
GO--先判斷索引是否存在存在則刪除 GO 批處理
CREATE NONCLUSTERED INDEX emp_id-- NONCLUSTERED 非聚集索引 INDEX代表創建的是索引
ON 員工表(員工號)--ON代表在哪個表哪個列(索引關鍵字)
WITH FILLFACTOR =80 --代表填充因子爲80
GO
重命名 索引名這裏小編順帶擴展一下
修改表名
--修改表名
EXEC sp_rename @objname = '舊錶名', @newname = '新表名'
EXEC sp_rename '舊錶名', '新表名'
exec sp_rename @objname='emp_id',@newname='員工表_員工號',@objtype='index'--修改索引名的方法一
GO
exec sp_rename'emp_id','員工表_員工號','index' --修改索引名的方法二
GO
修改字段名
--修改列名
EXEC sp_rename @objname = '表名.舊列名', @newname = '新列名', @objtype = 'column'
EXEC sp_rename '表名.舊列名', '新列名', 'column'
--例1 把表TABLE的列tid改爲id
EXEC sp_rename @objname = 'TABLE.tid', @newname = 'id', @objtype = 'column'
--例2(簡寫)把表TABLE的列tid改爲id
EXEC sp_rename 'TABLE.tid', @newname = 'id', @objtype = 'column'
修改索引名
--修改索引名
EXEC sp_rename @objname = '表名.舊索引名', @newname = '新索引名', @objtype = 'index'
EXEC sp_rename '表名.舊索引名', '新索引名', 'index'
--例1 把表TABLE的列tid改爲id
EXEC sp_rename @objname = 'TABLE.IDX_TYPE_CODE', @newname = 'IDX_CODE', @objtype = 'index'
--例2(簡寫)把表TABLE的索引IDX_TYPE_CODE改爲IDX_CODE
EXEC sp_rename 'TABLE.IDX_TYPE_CODE', 'IDX_CODE', 'index'
刪除索引
語法
--聲明數據庫引用
use 數據庫名;
go
--刪除索引
if exists(select * from sysindexes where name=索引名稱)
drop index 索引名稱 on 表名;
go
示例:
--聲明數據庫引用
use testss;
go
--刪除索引
if exists(select * from sysindexes where name='pathxmlindex')
drop index pathxmlindex on test1;
go
索引的使用## 標題
四、查詢中的執行計劃
索引和爲索引執行計劃比較
區別是,
有索引的:一般是索引掃描或聚集索引掃描 (seek)
沒有索引的:是表掃描(sacn)
現在查詢分析器已經很智能了,某些表有索引的情況下,也不是一定使用索引,它會判斷io、預讀,來自動的使用表掃描和索引掃描。
1.檢測堆結構
2.檢測聚集索引
3.檢測非聚集索引
數據查詢方式
這裏就大家來看這幾張圖的講解吧,小編自己說也說不清楚
五、索引使用中的維護
創建了索引就要維護,來保證索引的統計信息是有效的,這樣才能提高查找速度
維護索引的統計信息
--顯示指定索引的統計信息。
USE教學管理
GO
DBCC SHOW STATISTICS(學生表備份, CLID X學生表備份身份)
--顯示學生表_備份上CLID X_學生表_備份_身份索引的統計信息
GO
---更新指定表的索引統計信息。
USE教學管理
GO
UPDATE STATISTICS 學生表 --更新學生表的所有索引的統計GO
--對指定數據庫中所有表的索引統計進行更新。
USE教學管理
GO
EXECUTE sp_updatestats
維護索引鎖片
索引碎片類型
內部碎片:當索引頁裏還有空間可以利用,出現的碎片是內部碎片
外部碎片:當數據頁的邏輯順序和物理順序不匹配,或者一個表的存儲區不連續,出現的碎片是外部碎片
索引碎片的檢測
語法DBCC SHOWCONTING 命令查看索引碎片
語法格式:
DBCC SHOWCONTING(表名,索引名)
例題
USE 教學管理
GO
DBCC SHOWCONTING(學生表_備份)
重新和整理索引
(1)DROP INDEX 和CREATE INDEX
(2)DBCC DBREINDEX在一次操作裏重建一個表上的所有索引,但重建索引時表不可用
(3)DBCC INDEXDEFRAG刪除索引碎片,提高索引掃描性能
格式;
DBCC INDEXDEFRAG (數據庫名,表名|視圖名,索引名)
記得點贊加關注偶