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列,它可以提供它。
这个解决方案有问题吗?
答案 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
我对它进行了测试,结果相同。