哈喽
太長時間沒有更新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 (資料庫名,表名|視圖名,索引名)
記得點贊加關注偶