在这种情况下,是否会创建索引

时间:2010-05-11 13:09:20

标签: sql-server-2005 indexing performance

我仍然是SQL-SERVER2005的学习用户。

这是我的表结构

CREATE TABLE [dbo].[Trn_PostingGroups](
[ControlGroup] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[PracticeCode] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[ScanDate] [smalldatetime] NULL,
[DepositDate] [smalldatetime] NULL,
[NameOfFile] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[DepositValue] [decimal](11, 2) NULL,
[RecordStatus] [char](1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT [PK_Trn_PostingGroups_1] PRIMARY KEY CLUSTERED 
(
    [ControlGroup] ASC,
    [PracticeCode] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

场景1 :假设我有这样的查询......

Select * from Trn_PostingGroups where PracticeCode = 'ABC'

练习代码上的索引会分别帮助我更快地查询吗?

场景2

Select * from Trn_PostingGroups 
where 
    ControlGroup = 12701 
    and PracticeCode = 'ABC'
    and NameOfFile = 'FileName1'

对NameOfFile的索引会单独帮助我更快地查询吗?

2 个答案:

答案 0 :(得分:1)

如果您只选择第一个字段(ControlGroup),它是聚集索引的主要类型,您不需要索引其他字段。

如果您选择其他主键字段,那么在其他字段上添加单独的索引应该有助于此类选择。

通常,您应该索引SORTWHERE子句中常用的字段。这当然是过度简化了。

有关优化(统计信息和查询分析器)的详细信息,请参阅this文章。

答案 1 :(得分:0)

每个查询每个表只能使用一个索引(除非您考虑自联接或CTE)。如果你有多个可以在同一个查询中的同一个表上使用,那么SQL Server将使用统计信息来确定哪个更好用。

在场景1中,如果仅在PracticeCode创建索引,通常会使用它,只要您有足够的行,表扫描成本更高,并且其中包含多种值的值柱。如果表中只有几行,则不会使用索引(只需查看它们就更快)。此外,如果该列中的大多数值相同,则不会使用索引。它不会在这个查询中使用PK,就像在电话簿中查找名字一样,你不能使用索引,因为它是最后的+名字。如果您从未单独搜索ControlGroup,则可以考虑将PK反转为PracticeCode+ControlGroup

在场景2中,如果NameOfFile上有索引,它可能会使用PK并忽略NameOfFile索引。除非你使NameOfFile索引唯一,然后它是一个折腾。您可能会尝试在ControlGroup + PracticeCode + NameOfFile上创建索引(除了PK)。如果每个ControlGroup + PracticeCode有很多文件,那么它可以选择PK索引上的索引。