我仍然是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的索引会单独帮助我更快地查询吗?
答案 0 :(得分:1)
如果您只选择第一个字段(ControlGroup),它是聚集索引的主要类型,您不需要索引其他字段。
如果您选择其他主键字段,那么在其他字段上添加单独的索引应该有助于此类选择。
通常,您应该索引SORT
和WHERE
子句中常用的字段。这当然是过度简化了。
有关优化(统计信息和查询分析器)的详细信息,请参阅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索引上的索引。