4

Identity主键和普通主键在性能上有什么区别吗?

实际上,我想创建一个可能包含超过 500 万行的表。该表应在不到半秒的时间内返回具有超过 4 列的过滤条件的查询。

由于这 4 列(都是来自其他表的主键)都是数字并且它们的范围是有限的,所以我决定在主键中混合所有 4 列。

col1=500 | col2=500 | col3=900,000 | col4=9,000,000例如,列范围可以bigint是 9,223,372,036,854,775,807,所以如果我想在一个bigint主键中混合所有 4 列,它可以提供。

这个解决方案有什么问题吗?

4

2 回答 2

3

将我的脚趾浸入一些深水中:

约束(例如主键和外键)对有效性的影响大于性能;底层索引的布局和结构通常会对给定查询的执行效果产生更大的影响。当然,将 PRIMARY KEY 约束应用于表将在该表上构造一个 UNIQUE 索引,但该索引可能会或可能不会聚集(取决于它的创建方式和时间)。

如果 PRIMARY KEY 构建为 IDENTITY 列上的聚集索引(根据定义单调递增),那么您的聚集键将具有由标准 INSERT 操作产生的最小碎片;如果您在其他四列上构建它,并且数据以非单调方式插入,那么您可能会随着时间的推移看到大量碎片,这可能是由性能问题导致的。但是,如果您的数据总是要按顺序插入,这可能不是问题。

您提到了过滤,但是联接呢?

于 2013-01-19T20:45:43.863 回答
0

您的两个解决方案都是相同的:

PK1) 一个有 4 列的复合体

2)一BIGINT列(无论身份与否)是PK

用于索引的 Sql Server 机制对于两者都是相同的:数据将排序并保存在一个地方。您可以使用以下方式测试两者Statistics

SET STATISTICS IO ON
SET STATISTICS TIME ON

我测试了它,那些都是一样的。

于 2013-01-19T19:40:10.790 回答