usr*_*usr 11 sql-server database-design primary-key clustered-index sql-server-2008
通常,通过设置主键在SQL Server Management Studio中创建聚簇索引,但是我最近关于PK < - >聚簇索引(Microsoft SQL Server 2008主键的含义)的问题表明没有必要设置PK和聚集索引是相等的.
那么我们应该如何选择聚簇索引呢?我们有以下示例:
create table Customers(ID int,...)create table Orders(ID int,CustomerID int)
我们通常会在两个ID列上创建PK/CI,但我想为CustomerID中的Orders创建它.那是最好的选择吗?
CLUSTERED
索引的最佳候选者是您用来最常引用记录的关键.
通常,这是一个PRIMARY KEY
,因为它是在搜索和/或FOREIGN KEY
关系中使用的.
在您的情况下,Orders.ID
很可能会参与搜索和引用,因此它是作为聚类表达式的最佳候选者.
如果您创建CLUSTERED
索引Orders.CustomerID
,将发生以下事情:
CustomerID
不是唯一的.为了确保唯一性,将在每条记录中添加一个特殊的隐藏32-bit
列uniquifier
.
表格中的记录将根据这对列存储(CustomerID, uniquifier)
.
Order.ID
将创建辅助索引,并将其(CustomerID, uniquifier)
作为记录指针.
像这样的查询:
SELECT *
FROM Orders
WHERE ID = 1234567
Run Code Online (Sandbox Code Playgroud)
将不得不进行外部操作,Clustered Seek
因为并非所有列都存储在索引中ID
.要检索所有列,记录应首先位于群集表中.
此附加操作需要IndexDepth
尽可能多的页面读取Clustered Seek
,即IndexDepth
表格O(log(n))
中记录总数的简单描述.
归档时间: |
|
查看次数: |
8171 次 |
最近记录: |