聚集索引和非聚集索引
在SQL Server數(shù)據(jù)庫中,索引分為聚集索引和非聚集索引。聚集索引是一張表只能有一個(gè)的索引,默認(rèn)情況下表的主鍵就是聚集索引,也可以將非主鍵列設(shè)置為聚集索引。聚集索引會(huì)按照索引列的規(guī)則對(duì)數(shù)據(jù)進(jìn)行排列
在SQL Server數(shù)據(jù)庫中,索引分為聚集索引和非聚集索引。聚集索引是一張表只能有一個(gè)的索引,默認(rèn)情況下表的主鍵就是聚集索引,也可以將非主鍵列設(shè)置為聚集索引。聚集索引會(huì)按照索引列的規(guī)則對(duì)數(shù)據(jù)進(jìn)行排列存儲(chǔ)。而非聚集索引是一張表可以有多個(gè)的索引,物理數(shù)據(jù)存儲(chǔ)不會(huì)強(qiáng)制按照非聚集索引的順序排列。一個(gè)索引最多可以有16個(gè)索引列,但是一張表最好不要超過5個(gè)索引。每當(dāng)表的數(shù)據(jù)發(fā)生變化(增、刪、改),每個(gè)索引都需要按照規(guī)則更新索引位置。
新建一張不帶主鍵的表
使用以下SQL語句可以創(chuàng)建一張名為IndexTable的測(cè)試表,該表不包含主鍵:
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)會(huì)將主鍵列設(shè)置為聚集索引。
設(shè)置非聚集索引
可以使用以下SQL語句將IndexCol1列設(shè)置為非聚集索引:
CREATE NONCLUSTERED INDEX non_index_col1 ON IndexTable(IndexCol1);
插入測(cè)試數(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列');
刪除部分測(cè)試數(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)碎片率較高時(shí),可以考慮重建索引。
重建索引
在建立索引后,當(dāng)刪除數(shù)據(jù)時(shí),索引行的位置會(huì)被刪除,但索引中會(huì)留下空白。隨著時(shí)間的推移,索引中會(huì)積累很多空白,這就是索引碎片。此時(shí)可以通過重建索引來消除索引碎片。
可以使用以下SQL命令來重建索引:
DBCC DBREINDEX('IndexTable');