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。