-2

すべての列に他のテーブル (巨大なテーブル) の ID が格納されているテーブルがあります。

CREATE TABLE  #mytable (
Table1Id int,
Table2Id int,
Table3Id int,
Table4Id int,
Table5Id int,
)

これで、テーブルの列に ID が格納されているすべてのテーブルに選択が結合されました。

select T1.col1, t2.Col1, T3.col1... from 
#mytable MyTable inner join table1 T1 on MyTable.Table1Id = T1.Id
inner join table2 T2 on MyTable.Table2Id = T2.Id
inner join table3 T3 on MyTable.Table3Id = T3.Id
inner join table4 T4 on MyTable.Table4Id = T4.Id
inner join table5 T5 on MyTable.Table5Id = T5.Id
order by T1.Col1, T2.col1

現時点では、Table1Id と他のテーブルのすべての id 列にのみインデックスがあります。パフォーマンスを改善するための提案。

4

3 に答える 3

1

インデックスが現在どの列に定義されているかはわかりませんが、例のクエリに基づいて、5 つの列すべてにインデックスを作成する必要があります。

Table1Id, Table2Id, Table3Id, Table4Id, Table5Id

これにより、SQL エンジンはインデックスを読み取るだけでクエリを解決できます。これは、インデックスを読み取ってからテーブルを読み取るよりも高速です。

一部の列にアクセスするクエリを実行する場合は、それらの列にもインデックスが必要です。Table3Id と Table4Id に対してクエリを実行するとします。次に、インデックスを作成する必要があります。

Table3Id, Table4Id

質問で提供された情報から、これらのインデックスが一意であるか、一意でないかはわかりません。あなたはその決断をしなければならないでしょう。

于 2013-05-01T14:06:33.053 に答える
0

あなたが質問に入れた声明について、あなたができることはおそらくほとんどありません。実際、メモリが制限された環境にいる場合、状況によってはインデックスに悪影響を与えることさえあります。

ただし、最初のステップとして、id列の番号付きテーブルにインデックスを作成する必要があります。つまり、これらのテーブルの主キーを格納してから結合する必要があります (インデックスは主キーで自動的に作成されます)。

一般に、インデックスの目的は、テーブル全体をスキャンして特定のレコード セットを見つけることを防ぐことです。この場合、とにかくすべてのレコードが必要なように見えるため、テーブル全体のスキャンが必要です。これにより、インデックスの適用性が制限されます。SQL Server がこれらの結合をハッシュ結合に変換する可能性は十分にあります。これは、すべての行を読み取る必要がある場合にテーブルを結合する効率的な方法です。

whereandgroup by句によっては、追加のインデックスが保証される場合があります。

于 2013-05-01T14:10:15.743 に答える