Geo*_*ge2 28 sql-server heap clustered-index sql-server-2008
我正在使用SQL Server 2008.我知道如果表没有聚簇索引,那么它被称为堆,否则存储模型称为聚簇索引(B-Tree).
我想了解更多关于堆存储的确切含义,它看起来是什么以及它是否被组织为"堆"数据结构(例如最小堆,最大堆).有推荐的读数吗?我想要更多内部,但不是太深.:-)
乔治,提前谢谢
Qua*_*noi 38
堆存储与这些堆无关.
堆只是意味着记录本身没有被排序(即没有相互链接).
插入记录时,它只会插入数据库找到的空闲空间.
如果在HEAP表上创建辅助索引,则RID(一种指向存储空间的物理指针)将用作行指针.
聚集索引意味着记录是a的一部分B-Tree.插入记录时,B-Tree需要重新链接.
如果在聚簇表上创建辅助索引,则聚簇索引键的值将用作行指针.
这意味着聚簇索引应该是唯一的.如果聚簇索引不是唯一的,则会将一个特殊的隐藏列uniquifier附加到索引键上,使其成为唯一(并且大小更大).
还值得注意的是,在列上创建二级索引会使值或聚簇索引的键成为secondayry索引键的一部分.
CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)
CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)
Run Code Online (Sandbox Code Playgroud)
索引IX_mytable_5678实际上是以下列的索引:
col5
col6
col7
col8
col1
col2
col3
col4
Run Code Online (Sandbox Code Playgroud)
这还有一个副作用:
DESC在群集表中的单个列索引条件有意义在SQL Server这个指数:
CREATE INDEX IX_mytable ON mytable (col1)
Run Code Online (Sandbox Code Playgroud)
可以在这样的查询中使用:
SELECT TOP 100 *
FROM mytable
ORDER BY
col1, id
Run Code Online (Sandbox Code Playgroud)
,而这一个:
CREATE INDEX IX_mytable ON mytable (col1 DESC)
Run Code Online (Sandbox Code Playgroud)
可以在这样的查询中使用:
SELECT TOP 100 *
FROM mytable
ORDER BY
col1, id DESC
Run Code Online (Sandbox Code Playgroud)
mar*_*c_s 11
堆只是没有聚类键的表 - 没有强制执行某个物理订单的键.
我不建议在任何时候使用堆 - 除非您临时使用表来批量加载外部文件,然后将这些行分发到其他表.
在其他所有情况下,我强烈建议使用群集密钥.默认情况下,SQL Server将使用主键作为群集键 - 在大多数情况下,这是一个不错的选择.除非您使用GUID(UNIQUEIDENTIFIER)作为主键,在这种情况下使用它作为您的群集键是一个可怕的想法.
请参阅Kimberly Tripp的优秀博客文章GUIDs作为主要和/或群集密钥和聚集索引辩论继续为优秀的解释,为什么你应该总是有一个群集密钥,以及为什么GUID是一个可怕的群集密钥.
我的建议是:
INT IDENTITY作为主键,让SQL Server也将其作为集群密钥INT IDENTITY- 如果没有其他列可以使用,我甚至会为此目的创建一个单独的INT列渣