SQL Server-索引具有最小和最大范围的映射表
在使用具有多个范围的映射表时,我遇到了性能问题。映射表的布局如下所示SQL Server-索引具有最小和最大范围的映射表,sql,sql-server,indexing,range,Sql,Sql Server,Indexing,Range,在使用具有多个范围的映射表时,我遇到了性能问题。映射表的布局如下所示 ResultNumber param1Min param1Max param2Min param2Max ... param8min param8max 这些是映射表的列名。表上连接的是param1、param2、param3。。。参数8 我需要找到其中的行(param1在param1Min和param1Max之间)和(param2在param2Min和param2Max之间)。。。并从匹配行中获取结果编号。问题是映射表有超
ResultNumber param1Min param1Max param2Min param2Max ... param8min param8max
这些是映射表的列名。表上连接的是param1、param2、param3。。。参数8
我需要找到其中的行(param1在param1Min和param1Max之间)和(param2在param2Min和param2Max之间)。。。并从匹配行中获取结果编号。问题是映射表有超过200万行,我很难索引这个表,因为它必须使用范围来查找它需要的内容
有没有关于如何加快速度的想法
我还包括了我尝试过的没有任何帮助的索引
SELECT ResultNumber
FROM MappingTable
WHERE ( param1 BETWEEN param1Min AND param1Max )
AND ( param2 BETWEEN param2Min AND param2Max )
AND ( param3 BETWEEN param3Min AND param3Max )
...
CREATE CLUSTERED INDEX [index] ON [dbo].MappingTable
(
[param1Min] ASC,
[param1Max] ASC,
[param2Min] ASC,
[param2Max] ASC,
[param3Min] ASC,
[param3Max] ASC,
)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)
“param1、param2、param3…param8”变量或列是否在另一个表中?在任何情况下,我都会将其分解成若干块,以便从索引中获得使用率,并将需要在每个后续参数检查中完成的工作分割开来
您希望在resultnumber和only resultnumber上创建聚集索引,然后在resultnumber、param#min、param#max组合上创建非聚集索引。[dbo].[MappingTable]上总共应该有9个索引
Create Clustered Index ix_rn On [dbo].[MappingTable] (resultnumber)
Create NonClustered Index ix_p1 On [dbo].[MappingTable] (resultnumber, param1min, param1max)
...
Create NonClustered Index ix_p8 On [dbo].[MappingTable] (resultnumber, param8min, param8max)
这将允许您从下面的代码中获得性能增益。它应该跑得非常快
With param1 As
(
Select resultnumber
From [dbo].[MappingTable]
Where @param1 Between param1min And param1max
), param2 As
(
Select m.resultNumber
From [dbo].[MappingTable] m
Join param1 p1
On m.resultnumber = p1.resultnumber
Where @param2 Between param2min And param2max
), param3 As
(
...
...
), param8 As
(
Select m.resultNumber
From [dbo].[MappingTable] m
Join param7 p7
On m.resultnumber = p7.resultnumber
Where @param8 Between param8min And param8max
)
Select resultNumber
From param8
表实现看起来像这样。根据要加入的表的大小,这仍然需要一段时间,但它的运行速度仍应比原始查询快
With param1 As
(
Select m.resultnumber, w.tableIdentityValue
From [dbo].[MappingTable] m
Join whateverJoinTable w
On w.param1 Between m.param1min And m.param1max
), param2 As
(
Select m.resultNumber, w.tableIdentityValue
From [dbo].[MappingTable] m
Join param1 p1
On m.resultnumber = p1.resultnumber
Join whateverJoinTable w
On m.tableIdentityValue = w.tableIdentityValue
And w.param2 Between m.param2min And m.param2max
), param3 As
(
...
...
), param8 As
(
Select m.resultNumber, w.tableIdentityValue
From [dbo].[MappingTable] m
Join param7 p7
On m.resultnumber = p7.resultnumber
Join whateverJoinTable w
On m.tableIdentityValue = w.tableIdentityValue
And w.param8 Between m.param8min And m.param8max
)
Select resultNumber, tableIdentityValue
From param8
你在所有的Min和Max列上都有索引吗?我试过了,当我运行一个执行计划时,它根本没有使用索引。性能也没有变化。你的索引中是否包含结果编号?paramNMin和paramNMax之间的每个
paramN的选择性如何?让我想起了一些Hmmm。创建3对索引。结果编号-param1min-param1max,param1min-param1max-Resultnumber为第一对。对另外两对重复这个,我来试一试。两个快速问题,一个是在createindexes代码示例中,您的意思是将createnonclusteredex放在参数indexs的createclusteredex中,而不是将其放在createclusteredex中吗?另外,第一个select语句是否会使用第一个参数索引,因为它根本不使用resultnumber?是的,您是正确的,其他索引应该是非聚集的;谢谢你抓到那个打字错误。它将使用第一个param索引,因为它正在返回resultnumber。