【发布时间】:2013-08-30 18:16:08
【问题描述】:
我正在将大量数据导入 SQL Server 数据库。源数据来自 PgSql(包括表 defs),我通过一些相当简单的正则表达式将其转换为 TSql。这会创建没有主键的表。
据我了解,缺少主键/聚簇索引意味着数据存储在堆中。
导入完成后,我按如下方式添加 PK:
ALTER TABLE someTable ADD CONSTRAINT PK_someTable PRIMARY KEY (id);
(注意缺少CLUSTERED 关键字)。现在发生了什么事?还是一堆?对主键查找有什么影响?这与添加标准索引真的有什么不同吗?
现在,改为按如下方式添加 PK:
ALTER TABLE someTable ADD CONSTRAINT PK_someTable PRIMARY KEY CLUSTERED (id);
我假设现在这会将表完全重组为基于行的结构,通过 PK 查找更有效,但插入特性不太理想。
我的假设正确吗?
如果我的导入按 PK 顺序插入数据,首先省略 PK 有什么好处吗?
【问题讨论】:
-
你想插入行然后你想添加PK吗?
-
我也可以,但考虑到数据量,我宁愿了解发生了什么,也不愿花 5-8 小时测试不同的场景。我可以在之前或之后添加键,但插入 将按 PK 顺序发生。
-
如果目标表是 HEAP,INSERT 应该更快。但是具有 PK(非集群)的 HEAP 表的整体(插入、更新、删除、选择)性能应该比集群表的性能差。看看这个SQL Server Best Practices Article。如果你导入大量数据,你应该看看table partitioning (SQL2005+)。
-
另见article。
标签: sql sql-server sql-server-2008 primary-key clustered-index