我正在搜索如何将表
从一个文件组
移动到另一个文件组
,并且我对为什么我发现的大多数回复都涉及有些疑问>聚集索引
,考虑到我的问题与表有关。
然后我查看了How I can move table to another filegroup? ,并且它说聚集索引是表数据,这解释了使用CREATE CLUSTERED INDEX
重新创建聚集索引的原因。
但在同一问题中,它说如果我的聚集索引是唯一的,则执行其他操作。
我的问题:我假设当我在数据库上创建表时,会为该表创建聚集索引。那么它怎么能不独特呢?
谢谢。
最佳答案
如果你有一个 int 数组,并且在其中存储数字 1
两次 - 该数组怎么可能不是唯一的?! (让你思考的问题。它显然可能不是唯一的。)唯一性是对数据的约束。从根本上讲,没有什么可以阻止您创建所有列中具有相同值的多行。
在堆中,这根本不是物理问题。内部行标识符是它在磁盘上的位置。
在基于 b 树的索引(“聚集索引”)中,物理数据结构确实需要唯一性。请注意,逻辑结构(表)没有。这是一个 body 问题。这是一个实现细节。 SQL Server 通过在内部附加一个包含向上计数的序列号的键列来实现此目的。这消除了记录的歧义。您可以通过使用相同的非唯一键创建超过 2^32 行来观察此效果。您将收到一个错误。
因此表中有一个您无法访问的隐藏列。它的正式名称是“uniqueifier”。在内部,它用于完成 CI key 以使其唯一。它在通常使用唯一 CI key 的任何地方存储和使用:在 CI 中、在非唯一 NCI 中、在锁哈希中和在查询计划中。
关于sql-server - 如果聚集索引是表数据,怎么可能不唯一呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133494/