【发布时间】:2013-04-22 15:40:24
【问题描述】:
我对索引列的顺序进行了一些研究,但不能 100% 确定,所以请多多包涵! 我有下表:
CREATE TABLE [Valuation]
(
[ValuationID] [int] IDENTITY(1, 1)
NOT NULL
CONSTRAINT [PK_Valuation] PRIMARY KEY ,
VersionID INT NOT NULL ,
AlphanumericIdentifier VARCHAR(255) NOT NULL,
...
other columns
...
)
我在这张表上对 VersionID 和 AlphanumericIdentifier 上的其他人做了很多连接,所以我在上面放了一个索引:
CREATE NONCLUSTERED INDEX [IX_Valuation] ON [dbo].[Valuation]
(
[VersionID] ASC,
[AlphanumericIdentifier] ASC
)
两个问题:
- 这些连接通常针对特定的 VersionID 完成,因此这是最具选择性的列,应该是索引中的第一个列 - 对吗?
- 插入总是针对单个版本完成,比上一个版本多 1 个。这应该可以减轻对插入的性能影响,因为插入的行是可以添加到索引末尾的“块”。对吗?
我很确定我在 1 上是对的,但在 2 上是正确的吗?
谢谢 乔
【问题讨论】:
-
您在使用身份列吗? VersionID + Alphenumericidentifier 的组合是否唯一?如果实际上不会使用它,也许您应该考虑两列上的 PK 而不是标识列上的 PK。
-
听起来
VersionID应该是PK(和身份) -
VersionID + Alphenumericidentifier 不是唯一的。它们应该与另一个 varchar 字段一起是唯一的,但由于涉及的风险,我无法在项目的这个阶段引入唯一索引。但是,如果我可以让时间倒流,这听起来是个好主意……另一个限制是我需要在文件中向第 3 方供应商发送一个唯一 ID。这将是多达 10+255+255=560 个字符,这可能会给他们带来问题。目前我们只是向他们发送一个 int PK,最多 10 个字符就可以了
-
永远不要为了时间而接受糟糕的设计。以后你只会花越来越多的时间去考虑它,而不是一发现问题就去纠正这艘船。
-
@AaronBertrand - 同意。源系统是一个数据库,但没有约束。我们可以而且应该在导入数据时强制执行约束,例如使用 max() 或 sum() 来处理欺骗。不久前我认为唯一索引在插入时的性能命中比非唯一索引更大,但进一步阅读表明命中可以忽略不计
标签: sql-server indexing