- - PR -
遅いSQLのチューニングについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-11-15 17:47
SQLのチューニングについて教えて下さい。
現在、Oracle8iで下記のようなSQLを処理しています。 SELECT A, B, C, D, E, F, SUM(G), MAX(H), MAX(I) FROM TBL WHERE A=P1 AND B=P2 GROUP BY A, B, C, D, E, F; INDEXをはったりしていますが データ量が多いせいか 処理に時間がかかってしまいます。 SQLチューニングで処理速度をあげたいと思っているのですが 何か良い方法があれば教えて下さい。 宜しくお願い致します。 |
|
投稿日時: 2004-11-15 18:07
・レコード総件数と検索結果件数
・現時点でどれ位の処理時間になってしまっているのか ・テーブルの主キーの有無(有るならどれが主キーなのか) ・INDEXを作成したカラム を教えて下さい。 あと、SQLトレースは取得されましたか? アクセスパスがわかりますので、取得してみてはいかがでしょうか。 |
|
投稿日時: 2004-11-15 18:11
まず、これだけ見るとAとBに対して複合インデックスが張ってあれば通常は十分だと思います。
ですが、条件にひっかかる件数が多い場合にはC,D,E,Fまで含めてインデックスを張る必要が あるかもしれません。 とはいうものの、あてずっぽうに対策を考えるのは得策ではありません。まず、実行プランを 検証する必要があるでしょう。また、コストベースの場合は当然ANALYZEをかけている必要が ありますが、それは大丈夫でしょうか。 |
|
投稿日時: 2004-11-15 19:19
返信ありがとうございます。
総件数は 約 2600万件です。 検索結果の件数は 多い時で 約 250万件です。 処理時間は 30分くらいです。 しかしオラクルの処理が重なると、倍くらいになることもあります。 テーブルの定義はだいたい CREATE TABLE TBL ( A, E, aa, B, F, C, D, bb, G, H, I ) このような感じで、 主キーは (A, B, C, D, bb, F ) です。 なぜこのようなカラムの順番で作成したのかは 当初から携わってないので わかっていません。 作成したINDEXは (A, B, C ) です。 これは、主キーと同じ順番ですが その他の処理のwhere条件で(A,B,C)を 使用しており、 こちらのINDEXで処理されれば 処理されるINDEXのバイト数が減って 早くなるかと思い作成しました。 しかし、実行計画をみると主キーで処理されています。 トレースも取得しましたが、 見方がよくわかってない部分も多々あると思いますが 特に気になる点はありませんでした。 ちなみにこんな感じです。 Execution Plan --------------------------------------------------- SELECT STATEMENT GOAL: CHOOSE SORT (GROUP BY) TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TBL' INDEX (RANGE SCAN) OF '主キー' (UNIQUE) ANALYZEについては、 週に1回、EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(ユーザー名) を実行しています。 GROUP BY で指定したカラムでINDEXを作成した方が よいのでしょうか? |
|
投稿日時: 2004-11-15 20:02
これだけのデータをソートするとなるとそれなりの領域が必要となるかと思いますが、
ソート領域には十分なメモリが割り当てられていますか? あと、GROUP BY でソート処理が行われている時点で、 現在設定されているインデックスは WHERE 句による絞り込みにしか 使われていないようですね。 ところで、A 列と B 列はわざわざ取得する必要があるのでしょうか? SELECT 句で指定する列数が増えただけで遅くなる場合もあるようですので。 |
|
投稿日時: 2004-11-15 20:35
ソート領域には大きく割りたてたつもりですが
まだ小さいでしょうか? sort_area_size = 4096000 A 列と B 列についてですが カーソル文で取得して ループ処理を行っているので その方が処理がわかりやすいかと思いました。 しかし、処理の遅さを考えると わざわざ取得する必要がないと思います。 ご指摘ありがとうございました。 GROUP BY でソート処理が行われている時点で、 WHERE 句による絞り込みにしかないということは やはりGROUP BY で指定したカラムでINDEXを作成すべきでしょうか? データ量が多いだけに カラムの多いINDEXを作成して INSERT処理に影響がでるのではないかと 少し不安です。 |
|
投稿日時: 2004-11-17 15:07
G,H,Iも含めてINDEXを作成して試してもらえますか?
SUMやMAX等で使用するカラムもINDEXにしておくとテーブルアクセスではなくINDEXから取ってくるので、いくらか違うかと思います。 ただ、INSERTやUPDATE時への処理速度の影響がどの程度かちょっと分かりませんが(^^; |
|
投稿日時: 2004-11-24 21:45
返信が遅くなってすいません。
G,H,Iも含めてINDEXを作成してみました。 統計情報で確認したところ 作成したINDEXを使用して コストの値は減少したのですが 「consistentgets」が増えて 少し遅くなってしまいました。 私の作成したINDEXが間違っているのかもしれませんが 処理が遅くなってしまったので INDEXの使用はやめようと思います。 アドバイス、ありがとうございました。 |
1