sql-server - 两种生成集群主键的方法有什么不同?
问题描述
我有一个表来制作集群主键。
CREATE TABLE dbo.SampleTable
(
C1 INT NOT NULL,
C2 INT NOT NULL )
第一种方法是使用聚集索引制作主键索引。
ALTER TABLE dbo.SampleTable ADD CONSTRAINT IDX_SampleTable PRIMARY KEY CLUSTERED (C1, C2)
第二种方式是CREATE CLUSTERED INDEX
在ADD CONSTRAINT PRIMARY KEY NONCLUSTERED
大约相同的列之后。
ALTER TABLE dbo.SampleTable ADD CONSTRAINT IDX_SampleTable PRIMARY KEY NONCLUSTERED (C1, C2)
CREATE CLUSTERED INDEX IDX_SampleTable2 ON dbo.SampleTable (C1 ,C2) -- Can not create Same Name With above Constraint Name
以上两种方法在性能上有区别吗?
有没有不推荐使用的方法?
解决方案
是,有一点不同。通过指定CLUSTERED
,您可以指示数据库以某种方式存储数据。基本上,它强制将后续索引存储在硬盘驱动器上的后续数据块上。
通过在第一条语句中创建聚集主键,表中的所有数据将始终具有唯一值,C1, C2
并且数据始终存储在后续数据块中。
在第二个示例中,您不CLUSTERED
通过主键强制执行此行为,而是通过单独的索引。尽管现在效果相同,但您可能会选择删除(或暂时禁用)索引,然后将不再保证以某种CLUSTERED
方式存储数据。
底线:实际上,这两个语句现在是相同的,但将来可能会有所不同,因为该CLUSTERED
属性没有集成在 PK 中,而是集成在单独的索引中。
推荐阅读
- python - 从 AWS 机密管理器中提取数据库详细信息会引发错误 - Python
- visual-studio-2017 - NuGet 包源可以作为设置从 Visual Studio 2017 导出吗?
- javascript - 将 laravel 变量传递给 Vue 前端
- javascript - 使用 babel 在构建过程中运行自定义函数
- asp.net-core - 访问通用的集线器集合
- json - 如何使用 Python 请求从 REST API 查询 JSON 格式的数据?
- omnet++ - 为什么 DemoSafetyMessage.h Veins5 中 getSenderSpeed() 的返回类型是 Coord&?
- reactjs - Redux MapDispatchToProps 不起作用
- macos - Eclipse RCP 应用程序无法在 MAC 中找到配套共享库
- reactjs - 动态向导反应