SQL Server 創建索引(index)

来源:https://www.cnblogs.com/liujianshe1990-/archive/2019/11/04/11791973.html
-Advertisement-
Play Games

索引的簡介: 索引分為聚集索引和非聚集索引,資料庫中的索引類似於一本書的目錄,在一本書中通過目錄可以快速找到你想要的信息,而不需要讀完全書。 索引主要目的是提高了SQL Server系統的性能,加快數據的查詢速度與減少系統的響應時間 。 但是索引對於提高查詢性能也不是萬能的,也不是建立越多的索引就越 ...


索引的簡介:

索引分為聚集索引和非聚集索引,資料庫中的索引類似於一本書的目錄,在一本書中通過目錄可以快速找到你想要的信息,而不需要讀完全書。

索引主要目的是提高了SQL Server系統的性能,加快數據的查詢速度與減少系統的響應時間 。

但是索引對於提高查詢性能也不是萬能的,也不是建立越多的索引就越好。索引建少了,用 WHERE 子句找數據效率低,不利於查找數據。索引建多了,不利於新增、修改和刪除等操作,因為做這些操作時,SQL SERVER 除了要更新數據表本身,還要連帶立即更新所有的相關索引,而且過多的索引也會浪費硬碟空間。

 

索引的分類:

索引就類似於中文字典前面的目錄,按照拼音或部首都可以很快的定位到所要查找的字。

唯一索引(UNIQUE):每一行的索引值都是唯一的(創建了唯一約束,系統將自動創建唯一索引)

主鍵索引:當創建表時指定的主鍵列,會自動創建主鍵索引,並且擁有唯一的特性。

聚集索引(CLUSTERED):聚集索引就相當於使用字典的拼音查找,因為聚集索引存儲記錄是物理上連續存在的,即拼音 a 過了後面肯定是 b 一樣。

非聚集索引(NONCLUSTERED):非聚集索引就相當於使用字典的部首查找,非聚集索引是邏輯上的連續,物理存儲並不連續。

PS:聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個。

 

什麼情況下使用索引:

 

語法:

複製代碼
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name   
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )   
    [ WITH <backward_compatible_index_option> [ ,...n ] ]  
    [ ON { filegroup_name | "default" } ]  
  
<object> ::=  
{  
    [ database_name. [ owner_name ] . | owner_name. ]   
    table_or_view_name  
}  
  
<backward_compatible_index_option> ::=  
{   
    PAD_INDEX  
  | FILLFACTOR = fillfactor  
  | SORT_IN_TEMPDB  
  | IGNORE_DUP_KEY  
  | STATISTICS_NORECOMPUTE   
  | DROP_EXISTING   
}  
複製代碼

參數:

UNIQUE:為表或視圖創建唯一索引。 唯一索引不允許兩行具有相同的索引鍵值。 視圖的聚集索引必須唯一。如果要建唯一索引的列有重覆值,必須先刪除重覆值。

CLUSTERED:表示指定創建的索引為聚集索引。創建索引時,鍵值的邏輯順序決定表中對應行的物理順序。 聚集索引的底層(或稱葉級別)包含該表的實際數據行。

NONCLUSTERED:表示指定創建的索引為非聚集索引。創建一個指定表的邏輯排序的索引。 對於非聚集索引,數據行的物理排序獨立於索引排序。

index_name:表示指定所創建的索引的名稱。

database_name:表示指定的資料庫的名稱。

owner_name:表示指定所有者。

table:表示指定創建索引的表的名稱。

view:表示指定創建索引的視圖的名稱。

column:索引所基於的一列或多列。 指定兩個或多個列名,可為指定列的組合值創建組合索引。

[ ASC | DESC]:表示指定特定索引列的升序或降序排序方向。 預設值為 ASC。

on filegroup_name:為指定文件組創建指定索引。 如果未指定位置且表或視圖尚未分區,則索引將與基礎表或視圖使用相同的文件組。 該文件組必須已存在。

on default:為預設文件組創建指定索引。

PAD_INDEX = {ON |OFF }:指定是否索引填充。預設為 OFF。

  ON 通過指定的可用空間的百分比fillfactor應用於索引中間級別頁。

  OFF 或 fillfactor 未指定,考慮到中間級頁上的鍵集,將中間級頁填充到接近其容量的程度,以留出足夠的空間,使之至少能夠容納索引的最大的一行。

  PAD_INDEX 選項只有在指定了 FILLFACTOR 時才有用,因為 PAD_INDEX 使用由 FILLFACTOR 指定的百分比。

FILLFACTOR = fillfactor:用於指定在創建索引時,每個索引頁的數據占索引頁大小的百分比,fillfactor 的值為1到100。

SORT_IN_TEMPDB = {ON |OFF }:用於指定創建索引時的中間排序結果將存儲在 tempdb 資料庫中。 預設為 OFF。

  ON 用於生成索引的中間排序結果存儲在tempdb。 這可能會降低僅當創建索引所需的時間tempdb位於不同的與用戶資料庫的磁碟集。 

  OFF 中間排序結果與索引存儲在同一資料庫中。

IGNORE_DUP_KEY = {ON |OFF }:指定在插入操作嘗試向唯一索引插入重覆鍵值時的錯誤響應。預設為 OFF。

  ON 向唯一索引插入重覆鍵值時將出現警告消息。 只有違反唯一性約束的行才會失敗。

  OFF 向唯一索引插入重覆鍵值時將出現錯誤消息。 整個 INSERT 操作將被回滾。

STATISTICS_NORECOMPUTE = {ON |OFF}:用於指定過期的索引統計是否自動重新計算。 預設為 OFF。

  ON 不會自動重新計算過時的統計信息。

  OFF 啟用統計信息自動更新功能。

DROP_EXISTING = {ON |OFF }:表示如果這個索引還在表上就 drop 掉然後在 create 一個新的。 預設為 OFF。

  ON 指定要刪除並重新生成現有索引,其必須具有相同名稱作為參數 index_name。

  OFF 指定不刪除和重新生成現有的索引。 如果指定的索引名稱已經存在,SQL Server 將顯示一個錯誤。

ONLINE = {ON |OFF}:表示建立索引時是否允許正常訪問,即是否對錶進行鎖定。預設為 OFF。

  ON 它將強製表對於一般的訪問保持有效,並且不創建任何阻止用戶使用索引和/表的鎖。

  OFF 對索引操作將對錶進行表鎖,以便對錶進行完全和有效的訪問。

例子:

創建唯一聚集索引:

複製代碼
-- 創建唯一聚集索引
create unique clustered        --表示創建唯一聚集索引
index UQ_Clu_StuNo        --索引名稱
on Student(S_StuNo)        --數據表名稱(建立索引的列名)
with 
(
    pad_index=on,    --表示使用填充
    fillfactor=50,    --表示填充因數為50%
    ignore_dup_key=on,    --表示向唯一索引插入重覆值會忽略重覆值
    statistics_norecompute=off    --表示啟用統計信息自動更新功能
)
複製代碼

創建唯一非聚集索引:

複製代碼
-- 創建唯一非聚集索引
create unique nonclustered        --表示創建唯一非聚集索引
index UQ_NonClu_StuNo        --索引名稱
on Student(S_StuNo)        --數據表名稱(建立索引的列名)
with 
(
    pad_index=on,    --表示使用填充
    fillfactor=50,    --表示填充因數為50%
    ignore_dup_key=on,    --表示向唯一索引插入重覆值會忽略重覆值
    statistics_norecompute=off    --表示啟用統計信息自動更新功能
)
複製代碼 複製代碼
--創建聚集索引
create clustered index Clu_Index
on Student(S_StuNo)
with (drop_existing=on)    

--創建非聚集索引
create nonclustered index NonClu_Index
on Student(S_StuNo)
with (drop_existing=on)    

--創建唯一索引
create unique index NonClu_Index
on Student(S_StuNo)
with (drop_existing=on)    
複製代碼

PS:當 create index 時,如果未指定 clustered 和 nonclustered,那麼預設為 nonclustered。

創建非聚集複合索引:

--創建非聚集複合索引
create nonclustered index Index_StuNo_SName
on Student(S_StuNo,S_Name)
with(drop_existing=on)
--創建非聚集複合索引,未指定預設為非聚集索引
create index Index_StuNo_SName
on Student(S_StuNo,S_Name)
with(drop_existing=on)

在 CREATE INDEX 語句中使用 INCLUDE 子句,可以在創建索引時定義包含的非鍵列(即覆蓋索引),其語法結構如下:

CREATE NONCLUSTERED INDEX 索引名
ON { 表名| 視圖名 } ( 列名 [ ASC | DESC ] [ ,...n ] )
INCLUDE (<列名1>, <列名2>, [,… n])
複製代碼
--創建非聚集覆蓋索引
create nonclustered index NonClu_Index
on Student(S_StuNo)
include (S_Name,S_Height)
with(drop_existing=on)

--創建非聚集覆蓋索引,未指定預設為非聚集索引
create index NonClu_Index
on Student(S_StuNo)
include (S_Name,S_Height)
with(drop_existing=on)
複製代碼

PS:聚集索引不能創建包含非鍵列的索引。

創建篩選索引:

複製代碼
--創建非聚集篩選索引
create nonclustered index Index_StuNo_SName
on Student(S_StuNo)
where S_StuNo >= 001 and S_StuNo <= 020
with(drop_existing=on)

--創建非聚集篩選索引,未指定預設為非聚集索引
create index Index_StuNo_SName
on Student(S_StuNo)
where S_StuNo >= 001 and S_StuNo <= 020
with(drop_existing=on)
複製代碼

修改索引:

--修改索引語法
ALTER INDEX { 索引名| ALL }
ON <表名|視圖名>
{ REBUILD  | DISABLE  | REORGANIZE }[ ; ]

REBUILD:表示指定重新生成索引。

DISABLE:表示指定將索引標記為已禁用。

REORGANIZE:表示指定將重新組織的索引葉級。

--禁用名為 NonClu_Index 的索引
alter index NonClu_Index on Student disable

刪除和查看索引:

複製代碼
--查看指定表 Student 中的索引
exec sp_helpindex Student    

--刪除指定表 Student 中名為 Index_StuNo_SName 的索引
drop index Student.Index_StuNo_SName

--檢查表 Student 中索引 UQ_S_StuNo 的碎片信息
dbcc showcontig(Student,UQ_S_StuNo)

--整理 Test 資料庫中表 Student 的索引 UQ_S_StuNo 的碎片
dbcc indexdefrag(Test,Student,UQ_S_StuNo)

--更新表 Student 中的全部索引的統計信息
update statistics Student
複製代碼

 

索引定義原則:

避免對經常更新的表進行過多的索引,並且索引中的列儘可能少。而對經常用於查詢的欄位應該創建索引,但要避免添加不必要的欄位。

在條件表達式中經常用到的、不同值較多的列上建立索引,在不同值少的列上不要建立索引。

在頻繁進行排序或分組(即進行 GROUP BY 或 ORDER BY 操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。

在選擇索引鍵時,儘可能採用小數據類型的列作為鍵以使每個索引頁能容納儘可能多的索引鍵和指針,通過這種方式,可使一個查詢必需遍歷的索引頁面降低到最小,此外,儘可能的使用整數做為鍵值,因為整數的訪問速度最快。

 

參考:

http://www.cnblogs.com/knowledgesea/p/3672099.html

https://msdn.microsoft.com/zh-cn/library/ms188783.aspx


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 磁碟: 設備類型: 塊設備:block,磁碟 字元設備:char,鍵盤 brw-rw . 1 root disk 8, 0 Nov 3 09:42 sda 主設備號 次設備號查看硬碟類型: cat /sys/block/sda/queue/rotational0 --表示固態硬碟1 --表示機械硬碟 ...
  • [20191101]通過zsh計算sql語句的sql_id.txt1.簡單介紹以及測試使用zsh遇到的問題:--//前段時間寫的,鏈接http://blog.itpub.net/267265/viewspace-2659623/=>[20191011]通過bash計算sql語句的sql_id.txt ...
  • 前幾天,看到一個群友用WITH ROLLUP,由於沒用過,閑來無事測試一下。 一、概念: WITH CUBE:生成的結果集顯示了所選列中值的所有組合的聚合。 WITH ROLLUP:生成的結果集顯示了所選列中值的某一層次結構的聚合。 GROUPING:當行由 WITH CUBE或WITH ROLLU ...
  • 從這篇筆記開始,記錄一下表單生成器(Form Builder)相關的一些東西,網上關於他的介紹有很多,這裡就不解釋了。 開篇說一下如何存儲Form Builder生成的數據。🙂🙂🙂因為不同的表單有多少個表單項(也就是資料庫中的業務欄位)是不一樣的,也就是說傳統資料庫中的列是不固定的,那麼該如何 ...
  • 一.MySQL5.6與MySQL5.7安裝的區別 1、cmake的時候加入了boost 下載boost.org 2、初始化時 cd /application/mysql/bin/mysql 使用mysqld initialize 替代mysql_install_db,其它參數沒有變化: user= ...
  • 全局變數和局部變數 在伺服器啟動時,會將每個全局變數初始化為其預設值(可以通過命令行或選項文件中指定的選項更改這些預設值)。然後伺服器還為每個連接的客戶端維護一組會話變數,客戶端的會話變數在連接時使用相應全局變數的當前值初始化。 舉一個例子,在伺服器啟動時會初始化一個名為default_storag ...
  • MongoDB 是一個基於分散式文件存儲的資料庫。由 C++ 語言編寫,一般生產上建議以共用分片的形式來部署。 但是MongoDB官方也提供了其它語言的客戶端操作API。如下圖所示: 提供了C、C++、C#、.net、GO、java、Node.js、PHP、python、scala等各種語言的版本, ...
  • Mysql優化 一、存儲引擎 1.查看所有引擎 2.查看預設存儲引擎 3.MyISAM和InnoDB | 對比項 | MyISAM | InnoDB | | : : | : : | : : | | 主外鍵 | 不支持 | 支持 | | 事務 | 不支持 | 支持 | | 行表鎖 | 表鎖,即使操作一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...