SQL Server 索引知識匯總(最新整理)
摘要
本文對SQLServer中的索引進行一個知識總結。
一、堆表(Heap)
未創(chuàng)建聚集索引的表稱為堆表,數(shù)據(jù)無序追加,無統(tǒng)一排序。
- 優(yōu)勢:寫入極快,適合日志、流水表等持續(xù)大批量寫入場景
- 缺點:無索引時查詢必須全表掃描,數(shù)據(jù)量越大成本越高
-- 創(chuàng)建堆表(無聚集索引)
CREATE TABLE TestData (
TestId integer, TestName varchar(255), TestDate date,
TestType integer, TestData1 integer, TestData2 varchar(100),
TestData3 XML, TestData4 varbinary(max), TestData4_FileType varchar(3)
);
ALTER TABLE TestData REBUILD; -- 重建堆表
DROP TABLE TestData; -- 刪除表二、聚集索引(Clustered Index)
B+樹結構,索引鍵與完整行數(shù)據(jù)存儲在葉子節(jié)點。一張表最多1個聚集索引,創(chuàng)建后不再為堆表。
- 優(yōu)勢:WHERE條件含索引鍵時直接定位整行,無需回表;ORDER BY與索引鍵一致時省去排序開銷
- 缺點:DML維護成本高——鍵值更新會觸發(fā)頁拆分/遷移,INSERT/DELETE也有額外開銷
CREATE CLUSTERED INDEX IX_TestData_TestId ON dbo.TestData (TestId); ALTER INDEX IX_TestData_TestId ON TestData REBUILD WITH (ONLINE = ON); -- 在線重建 DROP INDEX IX_TestData_TestId ON TestData WITH (ONLINE = ON); -- 在線刪除
三、非聚集索引(Non-Clustered Index)
B+樹結構,葉子節(jié)點不存完整行,僅存行定位指針(指向聚集索引鍵或堆表的RID)。
- 優(yōu)勢:可建多個索引適配不同查詢;DML維護開銷低于聚集索引
- 缺點:增刪改仍需維護所有非聚集索引;索引越多寫入越慢,需權衡查詢與寫入性能
CREATE INDEX IX_TestData_TestDate ON dbo.TestData (TestDate); ALTER INDEX IX_TestData_TestDate ON TestData REBUILD WITH (ONLINE = ON); DROP INDEX IX_TestData_TestDate ON TestData;
四、列存儲索引(Column Store Index)
按列存儲的特殊索引,分為聚集列存儲與非聚集列存儲兩種。
- 優(yōu)勢:專為DW/大寬表/海量事實表設計,聚合分析性能提升最高100倍,高壓縮算法存儲占用最高減少90%
- 缺點:不支持 varchar(max)/nvarchar(max)/XML/text/image/CLR 類型;開啟復制/CDC的表無法使用;DML寫入開銷遠高于行式索引
-- 創(chuàng)建聚集列存儲索引
CREATE CLUSTERED COLUMNSTORE INDEX CIX_TestData_TestType ON dbo.TestData (TestType)
WITH (DATA_COMPRESSION = COLUMNSTORE);
DROP INDEX CIX_TestData_TestType;五、XML 索引
專用于 XML 類型字段,分為主XML索引和二級XML索引(PATH/VALUE/PROPERTY),前置要求:表必須有主鍵聚集索引。
- 優(yōu)勢:避免每次查詢加載解析完整XML文檔,適合大XML字段局部讀取
- 缺點:磁盤占用極高(XML每個標簽生成多條索引記錄);XML更新時同步維護帶來寫入損耗
CREATE PRIMARY XML INDEX PXML_TestData_TestData3 ON TestData (TestData3);
CREATE XML INDEX XMLPATH_TestData_TestData3 ON TestData (TestData3)
USING XML INDEX PXML_TestData_TestData3 FOR PATH;
CREATE XML INDEX XMLPROPERTY_TestData_TestData3 ON TestData (TestData3)
USING XML INDEX PXML_TestData_TestData3 FOR PROPERTY;
CREATE XML INDEX XMLVALUE_TestData_TestData3 ON TestData (TestData3)
USING XML INDEX PXML_TestData_TestData3 FOR VALUE;六、全文索引(Full-Text Index)
將文本拆分為分詞(Token)構建索引,索引文件獨立存放于全文目錄,不混存于數(shù)據(jù)文件。
- 優(yōu)勢:支持大文本/二進制字段檢索(char/varchar/nvarchar/text/XML/varbinary(max)/FILESTREAM);支持精確短語、前綴模糊、變形檢索、鄰近詞、同義詞、加權權重等高級檢索
- 缺點:全文檢索由獨立 MSFTESQL 服務執(zhí)行,會與 SQL Server 爭搶內(nèi)存/IO 資源
CREATE FULLTEXT CATALOG fulltextCatalog AS DEFAULT;
CREATE FULLTEXT INDEX ON dbo.TestData (TestData4 TYPE COLUMN TestData4_FileType)
KEY INDEX PK_TestData WITH STOPLIST = SYSTEM;
ALTER FULLTEXT CATALOG fulltextCatalog REBUILD;
DROP FULLTEXT INDEX ON dbo.TestData;七、索引衍生變體
1. 包含列索引(Included Columns)
非聚集索引擴展:將指定字段存入葉子節(jié)點,實現(xiàn)"類聚集索引"效果,免去回表。支持 text/ntext/image 外的絕大多數(shù)類型。
CREATE NONCLUSTERED INDEX IX_TestData_TestDate_incTestData3 ON TestData (TestDate)
INCLUDE (TestData3);
2. 函數(shù)索引(基于計算列)
SQL Server 不直接支持函數(shù)索引,通過持久化計算列模擬實現(xiàn)。
ALTER TABLE TestData ADD TestDatePlus7Days AS DATEADD(DAY, 7, TestDate) PERSISTED; CREATE NONCLUSTERED INDEX IX_TestData_TestDate_Plus7Days ON TestData (TestDatePlus7Days);
3. 篩選索引(Filtered Index)
帶 WHERE 條件的非聚集索引,縮小索引體積、降低維護成本。僅當查詢條件與索引 WHERE 完全匹配時優(yōu)化器才會選用。
CREATE INDEX IX_TestData_TestDate_TestTypeEq1 ON TestData (TestDate) WHERE TestType = 1;
4. 覆蓋索引(Covering Index)
設計思路:查詢所有字段要么是索引鍵,要么在 INCLUDE 中,完全消除回表,性能最優(yōu)。
CREATE INDEX IX_TestData_TestDate_TestType_AllData ON TestData (TestDate, TestType)
INCLUDE (TestData1, TestData2, TestData3, TestData4);
-- 該查詢完全走索引,無需訪問原表
SELECT TestData1, TestData2, TestData3, TestData4
FROM TestData
WHERE TestDate > CURRENT_TIMESTAMP - 1 AND TestType = 1;到此這篇關于SQL Server 索引知識匯總的文章就介紹到這了,更多相關SQL Server 索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何在navicat中利用sql語句建表+添加數(shù)據(jù)
這篇文章主要給大家介紹了關于如何在navicat中利用sql語句建表+添加數(shù)據(jù)的相關資料,Navicat是一套快速,專為簡化數(shù)據(jù)庫的管理及降低系統(tǒng)管理成本而設,它的設計符合數(shù)據(jù)庫管理員、開發(fā)人員及中小企業(yè)的需要,需要的朋友可以參考下2023-10-10
ODBC連接數(shù)據(jù)庫以SQLserver為例圖文詳解
開放數(shù)據(jù)庫互連(ODBC)是微軟提出的數(shù)據(jù)庫訪問接口標準,開放數(shù)據(jù)庫互連定義了訪問數(shù)據(jù)庫的API一個規(guī)范,這些API獨立于不同廠商的DBMS,也獨立于具體的編程語言,下面這篇文章主要給大家介紹了關于ODBC連接數(shù)據(jù)庫以SQLserver為例的相關資料,需要的朋友可以參考下2023-05-05
SQL 面試題:窗口函數(shù)的價值,不只在于“寫法高級”
窗口函數(shù)的核心價值在于?保留明細行的同時完成分組聚合計算?,解決“既要分組統(tǒng)計,又要展示原始行”的矛盾,而非單純追求語法復雜度 ,??本文介紹SQL面試題:窗口函數(shù)的價值,不只在于“寫法高級”,感興趣的朋友跟隨小編一起看看吧2026-07-07

