- - PR -
SQLの性能
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-07 00:01
なんとなくやりたいことはわかりました。
そういった場合、(条件とする値が7000個) をバッチクエリ等で 一旦別テーブルに出力してから、TableAと内部結合した方が パフォーマンス的には有利かも知れません。 また<TableAからの外部結合がいくつか> の結合条件に インデックスが有るか無いかによってパフォーマンスは大きく変化すると 思います。 | ||||||||
|
投稿日時: 2006-07-07 00:33
バッチクエリとはいえ、結局問題のクエリは実行するわけですよね? それなのに、性能が良くなるかも、という理由がよくわかりません。
TableAの方はインデックスを張っていない列で結合しているところもしますが、 相手側のテーブルの結合列は主キーです。 | ||||||||
|
投稿日時: 2006-07-07 00:44
問題のクエリは実行しないんだってば。 (少なくともinの部分は) まずinの条件の7000個を列挙して別テーブルにしてExitsなどを 使ったり、inner joinしたほうが早いんじゃない? とハニワ祭りさんは言いたいんだよ! 7000個もあれば当然、手作業で書くんじゃなくて 何らかの方法でプログラム的に書いているわけでしょ。 だったら、その過程でTEMPORARY TABLEなどを使ってみたらというのが ハニワ祭りさんのアドバイスだって。 本当に早くなるかはわからないが、やってみる価値はありだと思う。 最初から in のところに7000個も書いているという与件を 提示していないから、みんながあぁでもない、こうでもないという 議論に付き合わされたことにも気づいてくださいな。 | ||||||||
|
投稿日時: 2006-07-07 09:25
Temporary tableを使用したほうが
おそらく速くなるでしょうね。 A.column1 in (条件とする値が7000個) は --> A.column1 = '0' or A.column1 = '1' or A.column1 = '2' .... と同じことなので、coloumn1がkeyであっても、おそらくindexは効かないでしょう。 Temporary tableを使用すれば A.coloumn1 = B.coloum1 となり、 indexが効いてくると思われます。 | ||||||||
|
投稿日時: 2006-07-07 12:02
in句に7000個?
それならクエリのコンパイルに時間がかかってもおかしくない。実行プランの確認を しているのなら、コンパイル時間も表示されると思いますので、まずそこがボトル ネックかどうか確認してください。 それから、そのin句に指定する値は、どこから引っ張ってくるものでしょうか。 もしもDBから引っ張ってくるものであれば、サブクエリにしたりすることはできない のでしょうか。 | ||||||||
|
投稿日時: 2006-07-07 19:43
======================================================================== 元テーブルが7000レコードで7000個のin と比較するって すごく不思議なケース・・・だ。さてさて、 邪推してみました。根拠はありません。当てずっぽうです。 普通 in で比較する場合、その列はコード値やUniqueなものでしょう。 実際 A.column1のcolumn1は主キーだそうで・・・・。 で、column1が数字型だとすると、普通は整数でしょうね。 小数が主キーに使えないわけではないが、多分整数でしょう。 それで、連続していない数値というと・・・ もしや 20040530 20040531 20040601 20040602 のように日付をYYYYMMDDで表現した数字じゃないんですか? で、例えばそこから 平日のデータだけを抽出するというニーズだとか。 もし、column1がそのような日付的な要素の意味だとすれば、 そもそも in で 7000個書いて比較する処理を 何とかして早くする方法を考えようとするよりも、 抜本的に単純にSQLの見直しによる高速化が出来そうな気がする・・・・・・・・。 | ||||||||
|
投稿日時: 2006-07-07 20:16
最初からクエリを書いていればよかったです。
すいませんでした。 まさかIN句のせいで遅くなっているとは思ってもみなかったので・・・。 運用としては、 1.あるクエリ(*1)でデータを検索して画面に表示。 2.表示されたデータのうち、CSVファイルに出力したいデータを選んで出力を実行。 名称など最新データを出力するために再度クエリを実行。 2.のクエリが問題のクエリです。 すなわち、1.で抽出した件数が2.のクエリの最大件数なのです。 1.のクエリは、抽出元テーブルに12000件あってもタイムアウトはしないのですが、 1.のクエリを2.で使うと、選んでいないデータも抽出されてしまうので、使えないんです。 これではバッチクエリも無理ですよね? | ||||||||
|
投稿日時: 2006-07-07 20:46
やっぱりやりたいことはかなり想像どおりでした。
出力したいデータがユーザーによって選択されたら それをバッチクエリで一時テーブルに出力して、 2.のクエリのINの部分を一時テーブルとの内部結合に置き換えては? というのが、そもそもバッチクエリうんぬんの主旨です。 [ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2006-07-07 20:49 ] | ||||||||
