聚集索引和非聚集索引
在SQL Server數(shù)據(jù)庫中,索引分為聚集索引和非聚集索引。聚集索引是一張表只能有一個的索引,默認(rèn)情況下表的主鍵就是聚集索引,也可以將非主鍵列設(shè)置為聚集索引。聚集索引會按照索引列的規(guī)則對數(shù)據(jù)進(jìn)行排列
在SQL Server數(shù)據(jù)庫中,索引分為聚集索引和非聚集索引。聚集索引是一張表只能有一個的索引,默認(rèn)情況下表的主鍵就是聚集索引,也可以將非主鍵列設(shè)置為聚集索引。聚集索引會按照索引列的規(guī)則對數(shù)據(jù)進(jìn)行排列存儲。而非聚集索引是一張表可以有多個的索引,物理數(shù)據(jù)存儲不會強(qiáng)制按照非聚集索引的順序排列。一個索引最多可以有16個索引列,但是一張表最好不要超過5個索引。每當(dāng)表的數(shù)據(jù)發(fā)生變化(增、刪、改),每個索引都需要按照規(guī)則更新索引位置。
新建一張不帶主鍵的表
使用以下SQL語句可以創(chuàng)建一張名為IndexTable的測試表,該表不包含主鍵:
CREATE TABLE IndexTable(
Id varchar(36) NOT NULL,
IndexCol1 varchar(50) NULL,
IndexCol2 varchar(50) NULL,
IndexCol3 varchar(50) NULL
);
設(shè)置主鍵,查看聚集索引
要設(shè)置Id列為主鍵,可以使用以下SQL語句:
ALTER TABLE IndexTable ADD CONSTRAINT pk_Id PRIMARY KEY (Id);
設(shè)置完主鍵后,默認(rèn)會將主鍵列設(shè)置為聚集索引。
設(shè)置非聚集索引
可以使用以下SQL語句將IndexCol1列設(shè)置為非聚集索引:
CREATE NONCLUSTERED INDEX non_index_col1 ON IndexTable(IndexCol1);
插入測試數(shù)據(jù)
可以使用以下SQL語句插入5行記錄到IndexTable表中:
INSERT INTO IndexTable (Id, IndexCol1, IndexCol2, IndexCol3)
VALUES ('1', '第1行第1列', '第1行第2列', '第1行第3列'),
('2', '第2行第1列', '第2行第2列', '第2行第3列'),
('3', '第3行第1列', '第3行第2列', '第3行第3列'),
('4', '第4行第1列', '第4行第2列', '第4行第3列'),
('5', '第5行第1列', '第5行第2列', '第5行第3列');
刪除部分測試數(shù)據(jù)
可以使用以下SQL語句刪除IndexCol1為'第2行第1列'或'第4行第1列'的記錄:
DELETE FROM IndexTable WHERE IndexCol1 '第2行第1列' OR IndexCol1 '第4行第1列';
查看索引碎片比例
使用以下SQL命令可以查看IndexTable表的索引碎片率:
DBCC SHOWCONTIG('IndexTable');
當(dāng)碎片率較高時,可以考慮重建索引。
重建索引
在建立索引后,當(dāng)刪除數(shù)據(jù)時,索引行的位置會被刪除,但索引中會留下空白。隨著時間的推移,索引中會積累很多空白,這就是索引碎片。此時可以通過重建索引來消除索引碎片。
可以使用以下SQL命令來重建索引:
DBCC DBREINDEX('IndexTable');