SQLSERVER聚集索引和主鍵的誤區

2022-01-11 21:17:40 字數 1764 閱讀 4032

很多人會把primary key和聚集索引搞混起來,或者認為這是同乙個東西。這個概念是非常錯誤的。

主鍵是乙個約束(constraint),他依附在乙個索引上,這個索引可以是聚集索引,也可以是非聚集索引。

所以在乙個(或一組)欄位上有主鍵,只能說明他上面有個索引,但不一定就是聚集索引。

例如下面:

1

use[

pratice]2

go3create

table

#temppkcl4(

5 id int

primary

keyclustered

--聚集索引6)

789--

-------------------------------

10use

[pratice]11

go12

create

table

#temppkncl

13(

14 id int

primary

keynonclustered

--非聚集索引15)

1617

18drop

table

[#temppkcl]19

drop

table

[#temppkncl

]

如果不加nonclusteredclustered關鍵字,預設建的是聚集索引

而乙個聚集索引裡,是可以有重複值的。只要他沒有被同時設為主鍵,但是主鍵不能有重複值(不管依附在聚集索引上還是非聚集索引上)

強調這一點,是因為有些人覺得自己的**上設定了主鍵,就認為**上有聚集索引,按照b-樹的方式管理了。

如果沒有指定主鍵是個聚集索引,可能**還是會以堆的方式管理,效率低下

關於排序和重複值

排序:建立復合索引的時候會指定多個字段,那麼這個索引順序是按哪個字段順序排序呢?

是按照索引上的第乙個字段排序

下面這個索引的排序順序是以id這個字段排序的

1

create

index temppkncl_id_ncl on

[dbo

].[temppkncl

]([id

],[a

],[c

])

重複值:如果對多列定義了 primary key 約束,則一列中的值可能會重複,但來自 primary key 約束定義中所有列的任何值組合必須唯一。

如下圖所示,purchasing.productvendor 表中的 productid 和 vendorid 列構成了針對此表的復合 primary key 約束。

這確保了 productid 和 vendorid 的組合是唯一的

意思是說,如果是復合主鍵,那麼如果productid列有重複,但是 productid 和 vendorid 的組合是唯一的

言下之意:

(1)主鍵不是復合主鍵

(2)主鍵建立在productid欄位上

(3)productid欄位有重複值

那麼主鍵建立肯定會失敗

SQL Server 聚集索引和非聚集索引的區別

非聚集索引和聚集索引的區別 不在不會詳細說明非聚集索引和聚集索引的結構有什麼不一樣,因為這種東西網上已經說的很多了。乙個表一旦建立了聚集索引,那麼那張表就是一張被b樹重新組織過的表。而沒聚集索引表就是乙個堆表。什麼是b樹,什麼是堆表就不解釋了。小弟對,非聚集索引狀況下 和 聚集索引狀況下的 常量繫結...

SQL Server 聚集索引和非聚集索引的區別

聚集索引 物理儲存按照索引排序 非聚集索引 物理儲存不按照索引排序 優勢與缺點 聚集索引 插入資料時速度要慢 時間花費在 物理儲存的排序 上,也就是首先要找到位置然後插入 查詢資料比非聚集資料的速度快 漢語字典的正文本身就是乙個聚集索引。比如,我們要查 安 字,就會很自然地翻開字典的前幾頁,因為 安...

sqlserver 聚集索引 非聚集索引

聚集索引是一種對磁碟上實際資料重新組織以按指定的一列或者多列值排序。像我們用到的漢語字典,就是乙個聚集索引。換句話說就是聚集索引會改變資料庫表中資料的存放順序。非聚集索引不會重新組織表中的資料,而是對每一行儲存索引列值並用乙個指標指向資料所在的頁面。乙個值指向多行等於該值的資料 sqlserver預...