SQl淺談 索引

来源:http://www.cnblogs.com/LoveSuk/archive/2016/08/03/5732691.html
-Advertisement-
Play Games

1、索引的工作原理 我給大家推薦一個別人的總結。 http://blog.csdn.net/NightManHAHA/article/details/5648579 2、索引的設計原則 對於一張表來說,索引的有無和建立什麼樣的索引,要取決與where字句和Join表達式中。 一般來說建立索引的原則包 ...


1、索引的工作原理

我給大家推薦一個別人的總結。

http://blog.csdn.net/NightManHAHA/article/details/5648579

2、索引的設計原則

對於一張表來說,索引的有無和建立什麼樣的索引,要取決與where字句和Join表達式中。

一般來說建立索引的原則包括以下內容:

主鍵列:系統一般會自動建立聚集索引。

非主鍵列:有大量重覆值並且經常進行條件查詢、排序、分組的列,或者經常頻繁訪問的列,考慮建立聚集索引。

如果在一個經常做插入操作的表中建立索引,應使用fillfactor(填充因數)來減少頁分裂,同時提高併發度降低死鎖的發生。如果在表為只讀表,填充因數可設為100。

另外我們在選擇索引鍵的時候,儘量採用小數據類型(最好是整數)的列作為索引鍵,這樣每個索引頁能儘可能多的容納索引鍵和指針,用整數的好處是因為整數的訪問速度最快。

3、使用索引的註意事項

動作描述 使用聚集索引 使用非聚集索引
 外鍵列
 主鍵列
 列經常被分組排序(order by)
 返回某範圍內的數據(BETWEEN、>、>=、< 和 <=)  
 小數目的不同值  
 大數目的不同值  
 頻繁更新的列  
 頻繁修改索引列  
 一個或極少不同值    

4、索引的分類

按存儲結構區分

“聚集索引(又稱聚類索引,簇集索引)”,“分聚集索引(非聚類索引,非簇集索引)”

聚集索引

每個表只能有一個聚集索引,預設情況下主鍵預設就是聚集索引。聚集索引確定表中數據的物理順序。就好比字典中按拼音查找一樣。

定義聚集索引時使用的列越少越好。

聚集索引不適用於:頻繁更改的列(這將導致整行移動(因為 SQL Server 必須按物理順序保留行中的數據值。因為在大數據量事務處理系統中數據是易失的)

聚集索引的約束唯一性並不是指欄位也要是唯的。

創建聚集索引語法:create  CLUSTERED  Index  索引名稱 on 表名(需要創建索引列)

非聚集索引

一個表如果沒有聚集索引時,理論上可以建立249個非聚集索引。每個非聚集索引提供訪問數據的不同排序順序。

如果創建索引時不加索引關鍵字,預設創建的就是非聚集索引。

數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。就好比字典中按偏旁查找一樣。

創建非聚集索引語法:create NONCLUSTERED index 索引名 on 表名(創建索引列)

按數據唯一性區分:

“唯一索引”,“非唯一索引”

唯一鍵索引

建立唯一鍵約束(預設非聚集索引,實際上唯一鍵約束是用唯一索引來約束的)

創建唯一鍵約束,同時創建同名的唯一非聚集索引, 同時創建同名統計信息; 唯一鍵約束靠唯一索引來約束。

唯一鍵約束的索引不能像正常的索引使用太多的索引參數,因為唯一鍵約束與其索引同在。而單獨創建的唯一索引可以設置更多的參數。

創建唯一鍵約束語法:  alter TABLE 表名 add  constraint   索引名稱 unique(需要創建的列)(刪除唯一鍵索引的語句跟刪除主鍵聚集索引一樣)

唯一索引

唯一索索引跟唯一鍵約束的作用是一樣的,都是來檢測數據的唯一性。

不管是建立唯一索引還是唯一約束,被創建的列都不允許有重覆數據,重覆的NULL值也不可以。

唯一索引創建語法:CREATE unique index ix_RowID  on TABLE(RowID)刪除語句:drop index 索引名

唯一鍵索引與唯一索引對比

功能一樣,唯一鍵索引比唯一索引多驗證 unique key

唯一鍵索引沒有唯一索引靈活。

按鍵列個數區分:

“單列索引”,“多列索引”。

千萬數據量時。多列索引會比多個單列索引速度快很多。

索引視圖

索引視圖是具體化的視圖,它的結果集是經過計算的,並且存儲在資料庫中。

索引視圖更適合在OLAP(讀取較多,更新較少)的資料庫中使用,不適合在OLTP(記錄即時的增、刪、改、查)的資料庫中使用 。

一個標準視圖轉換為一個索引視圖必須遵守以下規則:  

1.視圖必須使用With Schemabinding選項來創建。如果創建視圖時沒有with Schemabinding,試圖創建視圖時就會報錯,因為該視圖未綁定到架構。註意: schemabinding建立索引的時候必須先創建唯一聚集索引。  

2.在這個視圖中不能使用其他視圖、導出表、行集函數或自查詢,也就是說只能使用表。

3.視圖只能鏈接同一個資料庫中的表並且鏈接表時只能使用INNER JOIN。 INNER JOIN前後不能使同一個表,不能使用LEFT(RIGHT) JOIN 或者 LEFT (RIGHT) OUTER JOIN 。

4.視圖不能包含UNION子句、TOP子句、ORDER BY子句、Having子句、Rollup子句、Cube子句、compute子句、Compute By子句或Distinct關鍵字。

5.視圖不允許使用某些集合函數,如:Count(*)可以使用count_big(*)代替、avg()、max()、min()、stdev()、stdevp()、var()或varp()等。

6.視圖不能使用Select * 這樣的語句,也就是說視圖的所有欄位都必須顯示指定。

7.視圖不能包含Text、ntext、image類型的列。

8.如果視圖包含一個Group By子句,那麼他必須在Select列中包含count_big(*)。

點陣圖索引(慎用

點陣圖索引適用於低基數的列,比如說“性別”列,數據倉庫中的維表的主鍵,等等。理論上來說,他們都適合應用點陣圖索引。但是這並不是使用點陣圖索引唯一的條件。濫用點陣圖索引會導致嚴重的錯誤,而且這些錯誤往往是很隱蔽的,不易被髮現的錯誤。

點陣圖索引的原理:

採用點陣圖索引,一個鍵指向多行,有時候是數以百計甚至更多。如果更新了一個點陣圖索引鍵,那麼這個鍵指向的數以百計的記錄會與你實際更新的那一行一同被鎖定。

5、索引的查找

資料庫中有一個名為sysindexes的系統表,專門管理索引。查看一張表的索引屬性,可以在查詢分析器中使用以下命令:select * from sysindexes where id=object_id(‘A);而要查看表的索引所占空間的大小,可以使用系統存儲過程命令:sp_spaceused A,其中參數A為被索引的表名。

6、索引語法

 [ UNIQUE ]唯一索引    [CLUSTERED]聚集索引   [NONCLUSTERED ] 非聚集索引

CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]

INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )

[with[PAD_INDEX][[,]FILLFACTOR=fillfactor]

[[,]IGNORE_DUP_KEY] //用於控制當往包含於一個唯一聚集索引中的列中插入重覆數據時SQL Server所作的反應。

[[,]DROP_EXISTING] //用於指定應刪除並重新創建已命名的先前存在的聚集索引或者非聚集索引。

[[,]STATISTICS_NORECOMPUTE]  //用於指定過期的索引統計不會自動重新計算。

[[,]SORT_IN_TEMPDB] //用於指定創建索引時的中間排序結果將存儲在 tempdb 資料庫中。

]

[ ON filegroup ] //用於指定存放索引的文件組。

 

CREATE INDEX命令創建索引各參數說明如下:

UNIQUE:用於指定為表或視圖創建唯一索引,即不允許存在索引值相同的兩行。

CLUSTERED:用於指定創建的索引為聚集索引。

NONCLUSTERED:用於指定創建的索引為非聚集索引。

index_name:用於指定所創建的索引的名稱。

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

view:用於指定創建索引的視圖的名稱。

ASC|DESC:用於指定具體某個索引列的升序或降序排序方向。

Column:用於指定被索引的列。

PAD_INDEX:用於指定索引中間級中每個頁(節點)上保持開放的空間。

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

7、示例

--表bigdata創建一個名為idx_mobiel的非聚集索引,索引欄位為mobiel

create index idx_mobiel

on bigdata(mobiel)

--表bigdata創建一個名為idx_id的唯一聚集索引,索引欄位為id

--要求成批插入數據時忽略重覆值,不重新計算統計信息,填充因數為40

create unique clustered index idx_id

on bigdata(id)

with pad_index,

fillfactor=40,

ignore_dup_key,

statistics_norecompute

8、清理索引

先分析表的索引:當你發現,掃描密度行,最佳計數和實際計數的比例已經嚴重失調。邏輯掃描碎片占了非常大的百分比,每頁平均可用位元組數非常大時,就說明你的索引需要重新整理一下了。

當索引碎片太多的時候,就會很嚴重地影響到查詢的速度。檢查索引碎片 DBCC SHOWCONTIG(表)

這時候我們可以採取兩種方法來解決:

一種時整理索引碎片(DBCC INDEXDEFRAG),另一種是重建索引(DBCC DBREINDEX)

DBCC INDEXDEFRAG 只有在該命令正在運行時才可用。而且可以在不丟失已完成工作的情況下中斷該操作。這種方法的缺點是在重新組織數據方面沒有聚集索引的除去/重新創建操作有效。

重新創建聚集索引將對數據進行重新組織,其結果是使數據頁填滿。填滿程度可以使用 FILLFACTOR 選項進行配置。這種方法的缺點是索引在除去/重新創建周期內為離線狀態,並且操作屬原子級。如果中斷索引創建,則不會重新創建該索引。

也就是說,要想獲得好的效果,還是得用重建索引。

DBCC DBREINDEX(表,索引名,填充因數)

第一個參數,可以是表名,也可以是表ID。

第二個參數,如果是'',表示影響該表的所有索引。

第三個參數,填充因數,即索引頁的數據填充程度。如果是100(這裡是%),表示每一個索引頁都全部填滿,此時select效率最高,但以後要插入索引時,就得移動後面的所有頁,效率很低。如果是0,表示使用先前的填充因數值。

DBCC DBREINDEX(A,'',100)

9、管理索引

select * from sysindexes where id=object_id('A')// 查看A表的索引屬性

exec sp_spaceused A //查看表的索引所占空間的大小A為被索引的表名

 

--查看索引定義

Exec sp_helpindex A  

--將索引名由'id' 改為'idx'

Exec sp_rename A.id','idx' 

--刪除A表中的idx索引

drop index A.idx

--檢查A表中索引id的碎片信息

dbcc showcontig(A,id)

--整理test資料庫中A表的索引id上的碎片

dbcc indexdefrag(Test,A,id)

--更新A表中的全部索引的統計信息

update statistics A

 


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

-Advertisement-
Play Games
更多相關文章
  • 原來Activity和Fragment中實現同樣功能的上千行代碼竟然能簡化成100多行!!! 而且如果是Fragment,有一個XListView預設佈局,連layout都不再需要寫了!!! ...
  • MySQL線程池只在Percona,MariaDB,Oracle MySQL企業版中提供。Oracle MySQL社區版並不提供。 在傳統方式下,MySQL線程調度方式有兩種:每個連接一個線程(one-thread-per-connection)和所有連接一個線程(no-threads)。在實際生產 ...
  • 在分散式存儲系統中,系統可用性是最重要的指標之一,需要保證在機器發生故障時,系統可用性不受影響。本文主要介紹數據備份的方式,以及如何保證多個數據副本的一致性,在系統出現機器或網路故障時,如何保持系統的高可用性。 ...
  • 1. mysql最開始使用是沒有密碼的,要求輸入密碼時直接回車就可以,但是自己設置密碼後就要輸入密碼才能登陸。下麵就寫一下在知道舊密碼的情況下改密碼。 進入mysql系統:set password for root@localhost = password('newpassword');將root的 ...
  • Redis數據類型 官網說明文檔:http://www.redis.io/topics/data-types-intro Redis keys Redis keys are binary safe, this means that you can use any binary sequence as ...
  • 在sql命令中我們可以查詢到前數行的表,同時也可以將查詢結果輸出到txt文檔 語句:select * from tablename into outfile 'filename.txt'; 例如:select * from mytable limit 100 into outfile ‘1.txt’ ...
  • 1. 利用表分區 分區將數據在物理上分隔開,不同分區的數據可以制定保存在處於不同磁碟上的數據文件里。這樣,當對這個表進行查詢時,只需要在表分區中進行掃描,而不必進行全表掃描,明顯縮短了查詢時間,另外處於不同磁碟的分區也將對這個表的數據傳輸分散在不同的磁碟I/O,一個精心設置的分區可以將數據傳輸對磁碟 ...
  • 1.建表時定義主鍵 Create table 表名 ( Sno int identity(1,1), Sname nvarchar(20), --設置主鍵 Primary key (Sno) ) 2.添加主外鍵 添加主鍵 alter table 表名 add constraint PK_表名_Sno ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...