我正在使用SQL Server 2008构建一个Web应用程序,并且很难根据我们的用例提出最佳索引策略。例如,大多数表的结构类似于以下内容:
CREATE TABLE Jobs
(
Id int identity(0, 1) not null,
CmpyId int not null default (0),
StatusId int not null default (0),
Name nvarchar(100) null,
IsDeleted bit not null default (0),
CONSTRAINT [PK_dbo.Jobs]
PRIMARY KEY NONCLUSTERED (Id ASC))
CREATE CLUSTERED INDEX IX_Jobs_CmpyIdAndId
ON Jobs (CmpyId, Id)
CREATE INDEX IX_Jobs_CmpyIdAndStatusId
ON Jobs (CmpyId, StatusId)
在我们的应用程序中,用户被分成不同的公司,导致几乎所有查询看起来类似于以下内容:
SELECT *
FROM Jobs
WHERE CmpyId = @cmpyId AND ...
此外,StatusId
经常访问作业(已取消= -1,待定= 0,开启= 1,已分配= 2,已关闭= 3),类似于以下内容:
SELECT *
FROM Jobs
WHERE CmpyId = @cmpyId
AND StatusId >= 0
AND StatusId < 3
如上所示,我最好不要使用复合聚簇索引,还是应该仅在Id
字段上使用默认聚簇索引,并为CmpyId
创建单独的索引?
对于StatusId
列,假设过滤索引是可行的方法,我是否正确?
我也在考虑按CmpyId
或StatusId
对表进行分区,但不确定哪个最好(或者如果没有最好的分区)。
答案 0 :(得分:1)
这有点过早优化。您可以花费大量时间来担心哪一个会为您提供稍微快一点的数据库,但是当您在生产中工作时,您将最有可能优化索引。
SQL Server有跟踪功能,可以查看哪些查询的运行时间最长,占用时间最长。您可以在生产中测试不同的索引策略,几乎没有风险。最糟糕的是,你可以减慢你的申请速度。
我通常在主键上设置聚簇索引。并且非聚集在所有重要的列上。这适用于与SQL Server一起使用的JVM堆栈。如果没有数据可以看到它,你就不知道瓶颈会在哪里。