1

私たちは次の問題に直面しており、可能な限り最善の解決策を見つけようとしています。

SQL Server 2008 を使用しています。6 億を超えるレコードがあり、約 25 列のテーブルがあります。列の 1 つは ID であり、インデックスが付けられています。このテーブルからレコードのサブセットを取得する必要があります。主に 2 つの場合があります。

a) サブセットには、1000 から 200 百万の行が含まれます。取得する行の ID は、SQL Server のインデックス付きテーブルに格納されます。

b) サブセットに含まれる行が 100 万行未満。取得する行の ID は、アプリケーションのサーバーのメモリ (.NET Web アプリ) に格納されます。

私たちの課題は、このサブセットをできるだけ早く取得することです。これを数秒で行う必要があります。

これまでのソリューション:

a) 2 つのテーブルを結合します。それは機能しますが、十分に高速ではありません。クエリは次のようになりSELECT * FROM Big_Table JOIN IndexTable ON Big_Table.ID = IndexTable.IDます。

b) 本当に解決策がありません。WHERE IN クエリを実行しようとしましたが、サブセットが 100 万行に近づくと、永遠に時間がかかります ( SELECT * FROM Big_Table WHERE ID IN (ID1, ID2, ID3...))。解決策は一時テーブルにインデックスを格納することですが、これはケース a に戻ります。

特に適切なインデックスとパーティショニングを使用して、可能な限り SQL Server を最適化しようとしています。今日は、両方のケース (a と b) でサブセットを抽出するのが最善の方法だと思われる方法についてお尋ねします。

任意のアイデアや提案をいただければ幸いです。

ありがとう

4

2 に答える 2

3

ページネーションを行っているので、最初に IndexTable から行の範囲をサブ選択してから、これを大きなテーブルに結合できませんでしたか?

何かのようなもの:

select * from big_table where id in (select top 100 id from indextable)
于 2011-03-10T13:37:11.750 に答える
1

問題 a) (クエリ) に対する最も明白な質問は、両方のテーブルSELECT * FROM Big_Table JOIN IndexTable ON Big_Table.ID = IndexTable.IDの列にインデックスがあることを確認していますか?ID

于 2010-10-22T09:39:30.113 に答える