SQL Server索引策略

时间:2016-01-17 01:59:19

标签: sql-server indexing partitioning clustered-index

我正在使用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列,假设过滤索引是可行的方法,我是否正确?

我也在考虑按CmpyIdStatusId对表进行分区,但不确定哪个最好(或者如果没有最好的分区)。

1 个答案:

答案 0 :(得分:1)

这有点过早优化。您可以花费大量时间来担心哪一个会为您提供稍微快一点的数据库,但是当您在生产中工作时,您将最有可能优化索引。

SQL Server有跟踪功能,可以查看哪些查询的运行时间最长,占用时间最长。您可以在生产中测试不同的索引策略,几乎没有风险。最糟糕的是,你可以减慢你的申请速度。

我通常在主键上设置聚簇索引。并且非聚集在所有重要的列上。这适用于与SQL Server一起使用的JVM堆栈。如果没有数据可以看到它,你就不知道瓶颈会在哪里。