sql-server - 如果聚集索引是表数据,怎么可能不唯一呢?

标签 sql-server sql-server-2008

我正在搜索如何将从一个文件组移动到另一个文件组,并且我对为什么我发现的大多数回复都涉及有些疑问>聚集索引,考虑到我的问题与表有关。

然后我查看了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/

相关文章:

java - 如何在Java中批量执行一组 'select count(*)'查询?

sql-server - 在 MS SQL 下使用关联迁移时的问题

sql - 为什么比较在 CONVERT 中不起作用?

mysql - SQL/如何更新sql中1列的多个值,具体取决于她的值和另一列的值

sql-server-2008 - SQL Server 中 IST 中的日期

sql-server - MS SQL Server 中是否有等效于 ConvertTimeFromUtc 的东西?

sql - 如何在sql中使用带有select top的max函数

.net - 列出 2 个日期时间中的可用时间

sql - 重新创建一组表同时保持它们可用的最佳实践?

sql-server - Oracle 和 SQL Server 的最大表注释长度