SQL Server Identity主键vs无身份性能 - 在主键中使用公式

时间:2013-01-19 17:05:19

标签: sql-server performance primary-key identity uniqueidentifier

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列,它可以提供它。

这个解决方案有问题吗?

2 个答案:

答案 0 :(得分:3)

将我的脚趾浸入深水中:

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

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

你提到过滤,但是加入呢?

答案 1 :(得分:0)

你的解决方案都是一样的:

1)具有4列

的组合PK

2)BIGINT <{1}}列(无论身份与否)PK

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

SET STATISTICS IO ON
SET STATISTICS TIME ON

我对它进行了测试,结果相同。