Sql server SQLServer为一个结果的多个列编制索引
我有一个大表(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,但我想应该有更好的方法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
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个索引。