Sql server SQLServer为一个结果的多个列编制索引

Sql server SQLServer为一个结果的多个列编制索引,sql-server,indexing,Sql Server,Indexing,我有一个大表(100000多行),其中有4列具有相同的概念值 假设一张记录代表了名字在a、B、C和D列的运动员之间的比赛。 A+B和C+D的比赛 当我查询该表中名为“DOE”的家伙参加的所有比赛时,我需要检查名称的4列值: 。。。其中(A列如“DOE%”或B列如“DOE%”或C列如“DOE%”或D列如“DOE%”) 和其他条件 由于表很大,我需要一种方法来索引所有这4列 我知道我可以创建一个二级表来存储每个球员的名字、位置a、B、C或D以及主表的RowID,但我想应该有更好的方法 SQLServ

我有一个大表(100000多行),其中有4列具有相同的概念值

假设一张记录代表了名字在a、B、C和D列的运动员之间的比赛。 A+B和C+D的比赛

当我查询该表中名为“DOE”的家伙参加的所有比赛时,我需要检查名称的4列值:

。。。其中(A列如“DOE%”或B列如“DOE%”或C列如“DOE%”或D列如“DOE%”) 和其他条件

由于表很大,我需要一种方法来索引所有这4列

我知道我可以创建一个二级表来存储每个球员的名字、位置a、B、C或D以及主表的RowID,但我想应该有更好的方法


SQLServer专家有什么线索吗?

只要在每列上放一个索引(总共4个索引)


这样,服务器可以查询每个索引,并根据条件将结果放在一起。这允许进行范围广泛的查询,并且仍然相当快。

只需在每列上放置一个索引(总共4个索引)


这样,服务器可以查询每个索引,并根据条件将结果放在一起。这允许进行范围广泛的查询,并且仍然相当快。

我会在每一列上放置一个索引,ID作为@ttoni所述的包含列,然后在ID上创建一个覆盖索引并包含4列,然后运行此查询:

declare @string varchar(50)
set @string='Karen'

select
    a.ID
    A,
    B,
    C,
    D
from dbo.Players a
    inner join
    (
        select
            ID
        from dbo.Players
        where A = @string

        union all
        select
            ID
        from dbo.Players
        where B = @string

        union all
        select
            ID
        from dbo.Players
        where C = @string

        union all
        select
            ID
        from dbo.Players
        where D = @string
    ) b
        on a.ID=b.ID
您可以使用like切换等号,然后只需将百分比添加到变量的末尾,如果这样做,sql server只需要多一点处理

以下是第一个索引:

CREATE NONCLUSTERED INDEX [IDX_A] ON [dbo].[Players] 
(
    [A] ASC
)
INCLUDE ( [ID]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
以下是覆盖指数:

CREATE NONCLUSTERED INDEX [IDX_All] ON [dbo].[Players] 
(
    [ID] ASC
)
INCLUDE ( [A],
[B],
[C],
[D]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

我会在每个列上放置一个索引,ID作为@ttoni所述的包含列,然后在ID上创建一个覆盖索引并包含4列,然后运行此查询:

declare @string varchar(50)
set @string='Karen'

select
    a.ID
    A,
    B,
    C,
    D
from dbo.Players a
    inner join
    (
        select
            ID
        from dbo.Players
        where A = @string

        union all
        select
            ID
        from dbo.Players
        where B = @string

        union all
        select
            ID
        from dbo.Players
        where C = @string

        union all
        select
            ID
        from dbo.Players
        where D = @string
    ) b
        on a.ID=b.ID
您可以使用like切换等号,然后只需将百分比添加到变量的末尾,如果这样做,sql server只需要多一点处理

以下是第一个索引:

CREATE NONCLUSTERED INDEX [IDX_A] ON [dbo].[Players] 
(
    [A] ASC
)
INCLUDE ( [ID]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
以下是覆盖指数:

CREATE NONCLUSTERED INDEX [IDX_All] ON [dbo].[Players] 
(
    [ID] ASC
)
INCLUDE ( [A],
[B],
[C],
[D]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
在关系数据库中,这是更好的方法。原因是,它使应用程序代码更简单,DBA功能更简单:

1) 索引问题?playerID上的索引

2) 询问?选择来自playerGames,其中playerId=X

3) 目前的设计只允许一个简单的查询,查找A、B、C或D位置的所有玩家,这仍然很容易:选择。。。。从…起位置class='A'

这就是为什么数据库专家经常试图指出,规范化并不是为了满足一些模糊的理论而做的琐事,但实际上规范化使整个系统更简单

在关系数据库中,这是更好的方法。原因是,它使应用程序代码更简单,DBA功能更简单:

1) 索引问题?playerID上的索引

2) 询问?选择来自playerGames,其中playerId=X

3) 目前的设计只允许一个简单的查询,查找A、B、C或D位置的所有玩家,这仍然很容易:选择。。。。从…起位置class='A'


这就是为什么数据库专家经常试图指出,规范化并不是为了满足一些模糊的理论而做的琐事,但实际上,规范化使整个系统更简单。

我认为在一个查询中,SQLServer只选择一个索引,其余的索引是从部分结果处理的——在我的例子中,这将是一个“或”A列上的汉斯索引无助于选择B、C项@user512602:没有任何东西可以阻止SQL查询多个索引,尽管它通常不会这样做,因为它太昂贵了。在您的例子中,它可能会使用统计信息来确定哪个索引将提供最少的结果,然后将其余的搜索词作为谓词添加到该索引中。不过这对你的案子来说应该足够了。根据栏目内容和您的查询,您甚至可以在一个栏目上创建一个索引,但从这里很难说出来!当我查看执行计划时,我实际上看到所有4个索引都被使用。我认为在1个查询中,SQLServer只选择1个索引,其余的是从部分结果中处理的-在我的情况下,A列上的“或”hance索引无助于B,C orD上的选择@user512602:没有任何东西可以阻止SQL查询多个索引,尽管它通常不会这样做,因为它太昂贵了。在您的例子中,它可能会使用统计信息来确定哪个索引将提供最少的结果,然后将其余的搜索词作为谓词添加到该索引中。不过这对你的案子来说应该足够了。根据栏目内容和您的查询,您甚至可以在一个栏目上创建一个索引,但从这里很难说出来!当我查看执行计划时,我实际上看到使用了所有4个索引。