2

複数の範囲を持つマッピング テーブルを使用する場合、パフォーマンスに問題があります。マッピング テーブルは次のようにレイアウトされます。

ResultNumber param1Min param1Max param2Min param2Max ... param8min param8max

これらは、マッピング テーブルの列名です。テーブルの上に結合されているのは ですparam1, param2, param3 ... param8

(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)
4

1 に答える 1

0

「param1、param2、param3 ... param8」は変数または別のテーブルの列ですか? いずれにせよ、私はそれをチャンクに分割して、インデックスから使用法を取得し、後続の各パラメーター チェックで実行する必要がある作業をスライスします。

resultnumber と 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
于 2012-12-20T02:44:57.693 に答える