- - PR -
範囲条件での連結について(SQL Server2000)
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-08-04 13:57
ここ一日悩んでいたのですが、どうにも良い解決方法が見つからず投稿させていただきます。
もしいいアイデアがありましたらご教授ください。 現象としては、パフォーマンスの大幅低下となります。 使用しているテーブルは二つ、それぞれ Table A(260000件) 伝票区分( nchar(3) ) 伝票No( int ) Table B(35000件) 契約書No( int ) 伝票区分( nchar(3) ) 伝票開始No( int ) 伝票終了No( int ) (その他抽出したい項目) で、 以上のテーブルについて、AとBを結合したいというものです。 SELECT * FROM A INNER JOIN B ON A.伝票区分 = B.伝票区分 AND A.伝票NO >= B.伝票開始No AND A.伝票NO <= B.伝票終了No というものなのですが、パフォーマンスが恐ろしく悪くなってしまいます。 もちろん原因が伝票Noの範囲で結合しているところにあるのはわかるのですが、 他システムからのインポートデータのため、テーブル構造を変えることができません。 ちなみに、抽出結果は35000件ほどに絞った場合でも、15分以上、 これを最後の結合条件をA.伝票NO = B.伝票開始No に絞り 結果を5000件にすると、10秒弱で終わる状態です。 無理かな、とは思い始めているのですが、考えられる改善点はありますでしょうか。 | ||||
|
投稿日時: 2005-08-04 14:21
INDEXはどうされていますか?
| ||||
|
投稿日時: 2005-08-04 14:27
主キーは何かと明記してくれると少しは回答しやすいです。
select * というのは サンプルだからこうしてるんですよね? | ||||
|
投稿日時: 2005-08-04 14:38
情報が足りなかったですね。申し訳ありません。
選択の*はご指摘の通り、サンプルだからです。 INDEXは、 Aについて、伝票区分・伝票No Bについて、伝票区分・伝票開始No・伝票終了No で張ってあります。 また主キーは、テーブルAが表示されていない別項目で設定されており、 テーブルBには存在していません<ここですかね? なにぶんにも、インポート元がまた資料もはっきりしないので困っているところです。 こちらでなんとか主キーをつけようとしているのですが… Table A(260000件) 伝票区分( nchar(3) ) 伝票No( int ) Table B(35000件) 契約書No( int ) 伝票区分( nchar(3) ) 伝票開始No( int ) 伝票終了No( int ) (その他抽出したい項目) | ||||
|
投稿日時: 2005-08-04 15:13
クエリアナライザでどこでコストがかかっているか調べてみてはどうでしょうか?
http://www.microsoft.com/japan/msdn/sqlserver/columns/sysbuild/sysbuild2.asp | ||||
|
投稿日時: 2005-08-04 16:49
クエリアナライザでの実行プラン検証を行ってみました。
見方がよく分からずに書籍等購入してきたのですが、 いまいち分かってないかもしれません。 二つのテーブルはHASH結合で結合され、 コストのうち70%はTable Bのクラスタ化インデックスに消費されているようです。 ただ、結合条件を=に変えると劇的に変わるので、HASH結合のところが問題でないかと思うのですが…考え方はあっていますでしょうか。 | ||||
|
投稿日時: 2005-08-07 15:23
お疲れ様です。 ハッシュ結合されているということは, 結合時にインデックスが使用されていないと思いますが。 | ||||
|
投稿日時: 2005-08-09 10:03
解決いたしました。 ありがとうございます。 まさに言われている通り、インデックスを貼ったにもかかわらず有効利用できていなかったようです。 クエリオプティマイザに対し強制的に結合種類の選択及びインデックスの使用を指示するようにしたところ、パフォーマンスが劇的に改善し、ご質問した条件で十数秒、業務で本来必要とする範囲に広げても1分ほどで終了するようになりました。 ありがとうございました。 | ||||
