SQL Server從入門到精通(六)

哈嘍

太長時間沒有更新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 (數據庫名,表名|視圖名,索引名)

記得點贊加關注偶
在這裏插入圖片描述

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