SQL Server 索引基礎知識(4)----主鍵與聚集索引_Mssql數據庫教程
推薦:SQL Server 2000 中使用正則表達式這兩天有個需求,需要在數據庫中判斷字符串的格式,于是從網上搜集了一些資料,整理了一下。 下面這個是一個自定義函數,用戶可以調用這個函數判斷指定的字符串是否符合正則表達式的規則. CREATE FUNCTION dbo.find_regular_expression ( @source varchar(50
有些人可能對主鍵和聚集索引有所混淆,其實這兩個是不同的概念,下面是一個簡單的描述。不想看繞口文字者,直接看兩者的對比表。尤其是最后一項的比較。
主鍵(PRIMARY KEY )
來自MSDN的描述:
表通常具有包含唯一標識表中每一行的值的一列或一組列。這樣的一列或多列稱為表的主鍵 (PK),用于強制表的實體完整性。在創建或修改表時,您可以通過定義 PRIMARY KEY 約束來創建主鍵。
一個表只能有一個 PRIMARY KEY 約束,并且 PRIMARY KEY 約束中的列不能接受空值。由于 PRIMARY KEY 約束可保證數據的唯一性,因此經常對標識列定義這種約束。
如果為表指定了 PRIMARY KEY 約束,則 SQL Server 2005 數據庫引擎 將通過為主鍵列創建唯一索引來強制數據的唯一性。當在查詢中使用主鍵時,此索引還可用來對數據進行快速訪問。因此,所選的主鍵必須遵守創建唯一索引的規則。
創建主鍵時,數據庫引擎 會自動創建唯一的索引來強制實施 PRIMARY KEY 約束的唯一性要求。如果表中不存在聚集索引或未顯式指定非聚集索引,則將創建唯一的聚集索引以強制實施 PRIMARY KEY 約束。
聚集索引
聚集索引基于數據行的鍵值在表內排序和存儲這些數據行。每個表只能有一個聚集索引,因為數據行本身只能按一個順序存儲。
每個表幾乎都對列定義聚集索引來實現下列功能:
- 可用于經常使用的查詢。
- 提供高度唯一性。
兩者的比較
下面是一個簡單的比較表
| 主鍵 | 聚集索引 | |
| 用途 | 強制表的實體完整性 | 對數據行的排序,方便查詢用 |
| 一個表多少個 | 一個表最多一個主鍵 | 一個表最多一個聚集索引 |
| 是否允許多個字段來定義 | 一個主鍵可以多個字段來定義 | 一個索引可以多個字段來定義 |
| 是否允許 null 數據行出現 | 如果要創建的數據列中數據存在null,無法建立主鍵。 創建表時指定的 PRIMARY KEY 約束列隱式轉換為 NOT NULL。 | 沒有限制建立聚集索引的列一定必須 not null . 也就是可以列的數據是 null 參看最后一項比較 |
| 是否要求數據必須唯一 | 要求數據必須唯一 | 數據即可以唯一,也可以不唯一。看你定義這個索引的 UNIQUE 設置。 (這一點需要看后面的一個比較,雖然你的數據列可能不唯一,但是系統會替你產生一個你看不到的唯一列) |
| 創建的邏輯 | 數據庫在創建主鍵同時,會自動建立一個唯一索引。 如果這個表之前沒有聚集索引,同時建立主鍵時候沒有強制指定使用非聚集索引,則建立主鍵時候,同時建立一個唯一的聚集索引 | 如果未使用 UNIQUE 屬性創建聚集索引,數據庫引擎 將向表自動添加一個四字節 uniqueifier 列。 必要時,數據庫引擎 將向行自動添加一個 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,用戶不能查看或訪問。 |
參考: CSDN 大力
簇集索引=聚集索引:
聚集索引確定表中數據的物理順序。聚集索引類似于電話簿,后者按姓氏排列數據。由于聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
聚集索引對于那些經常要搜索范圍值的列特別有效。使用聚集索引找到包含第一個值的行后,便可以確保包含后續索引值的行在物理相鄰。例如,如果應用程序執行的一個查詢經常檢索某一日期范圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然后檢索表中所有相鄰的行,直到到達結束日期。這樣有助于提高此類查詢的性能。同樣,如果對從表中檢索的數據進行排序時經常要用到某一列,則可以將該表在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節省成本。
非簇集索引:
非聚集索引與聚集索引一樣有 B 樹結構,但是有兩個重大差別:
數據行不按非聚集索引鍵的順序排序和存儲。
非聚集索引的葉層不包含數據頁。
相反,葉節點包含索引行。每個索引行包含非聚集鍵值以及一個或多個行定位器,這些行定位器指向有該鍵值的數據行(如果索引不唯一,則可能是多行)。
非聚集索引可以在有聚集索引的表、堆集或索引視圖上定義。在 Microsoft® SQL Server™ 2000 中,非聚集索引中的行定位器有兩種形式:
如果表是堆集(沒有聚集索引),行定位器就是指向行的指針。該指針用文件標識符 (ID)、頁碼和頁上的行數生成。整個指針稱為行 ID。
如果表沒有聚集索引,或者索引在索引視圖上,則行定位器就是行的聚集索引鍵。如果聚集索引不是唯一的索引,SQL Server 2000 將添加在內部生成的值以使重復的鍵唯一。用戶看不到這個值,它用于使非聚集索引內的鍵唯一。SQL Server 通過使用聚集索引鍵搜索聚集索引來檢索數據行,而聚集索引鍵存儲在非聚集索引的葉行內。
由于非聚集索引將聚集索引鍵作為其行指針存儲,因此使聚集索引鍵盡可能小很重要。如果表還有非聚集索引,請不要選擇大的列作為聚集索引的鍵。
唯一索引:
唯一索引可以確保索引列不包含重復的值。在多列唯一索引的情況下,該索引可以確保索引列中每個值組合都是唯一的。
唯一索引既是索引也是約束。
復合索引:
索引項是多個的就叫組合索引,也叫復合索引。
復合索引使用時需要注意索引項的次序。
分享:數據庫的分離及附加1、分離數據庫 exec sp_detach_db dataname --eg: dataname:要分離的數據庫名 2、附加數據庫 1 exec sp_attach_single_file_db newdataname,mdfPath /*eg: newdataname:要附加上的新數據庫名稱(可以是原來的) mdfPath='C:\Program Files\Microsoft SQL Serve
- sql 語句練習與答案
- 深入C++ string.find()函數的用法總結
- SQL Server中刪除重復數據的幾個方法
- sql刪除重復數據的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數據庫,提示 無法為該請求檢索數據 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數的用法實例詳解
- 相關鏈接:
- 教程說明:
Mssql數據庫教程-SQL Server 索引基礎知識(4)----主鍵與聚集索引
。