- ベストアンサー
SQL、Oracleでの文字列操作のパフォーマンス向上法
- Oracle7を使用して、文字列操作(連結、切り出し)のパフォーマンスを向上させる方法を教えてください。
- 文字列連結(||)を使用せずに、外部結合付きでaテーブルのnum, code, seqを結合したものとbテーブルのbangoが同じかどうか検索するSQLのパフォーマンスを向上させる方法を教えてください。
- 検索速度が遅くなるため、文字列連結(||)を使用せずにaのnum, code, seqとbのbangoを比較するSQLのパフォーマンスを向上させる方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
再投稿です。CONCAT()関数は試してみましたか? ||演算子と同じです。 でも処理時間が早くなるか自信ないです。 うまくいかなかったらすみません。 where bango(+) = CONCAT(num, code, seq)
その他の回答 (4)
しつこくてすみません。 新規でbangoフィールドのINDEX追加したらどうでしょう。 テーブル定義の変更も不可なのかな?だとしたらつらい… num,code,seqに設定されてても結合してしまったら インデックス効果はありません。 あと記憶が定かじゃないんですが 条件の左側の項目にインデックスが付いてないと駄目だったような。。。 つまり前回の回答を例にすると INDEX(A, B)だった場合、 where char1 = A and char2 = B じゃ効かないということです。 うそだったらごめんなさーいい あまりお役に立てなくてすみません。 頑張ってください!!
お礼
テーブルにindexをつけたりとtableに手を加えることは できないのです。すいません。 あと何度も回答ありがとうございました。 結果 where substr(bango(+),1,8) = num and substr(bango(+),9,2) = code and substr(bango(+),11,2)= seq で速度の向上ができました。 ただ、場合によってはsubstrの方が||より遅くなるときも ありましたが、今回はsubstrでうまくいきました。 本当にありがとうござました。
再々投稿です。 検索ってことはselectで抽出するってことですか? select num || code || seq A from table where bango(+) = A ってな具合に別名をつけるのはどうでしょう。 これも自分では試してないんで速くなるかわからないんですけど。 where以降の条件文がゴテゴテしてると遅くなる気がして… あとyujiさんのおっしゃるとおり、インデックスが あるのとないのではかなりスピード違うと思います。 ただ条件の項目数とインデックスの項目数が一致していないと 意味が無いです。 where A = char1 and B = char2 という場合は、INDEX(A, B)じゃないと高速になりません。 以前速くて今は遅いっていうのはちょっとした 条件文の変更で起こってしまった可能性はないでしょうか。
補足
selectで抽出ではありません。 目的は where句の書き方?の違いによる検索速度なんです。 ちなみに別名をつけてもあまり向上がみられませんでした。 使用しているoracleはコストベースで設計しており indexやwhere句の書き方の順番とはあまり関係なくoracleに 判断させています。 (それがそもそも原因といわれたらどうしようもないですが) 一応、indexの一番はじめの検索キー、主キーは num,code,seqに設定しております。 何回もすいません。ありがとうございます。 原因はおっしゃるとおりちょっとした条件文の違いだとは 思いますが、条件の内容は同じなので条件文の書き方の違いだと思ってます。 私が今回where句で使用したのは || なので それが速度低下につながっていると思った限りです。
- yuji
- ベストアンサー率37% (64/169)
どうしても高速に検索したいのであれば、 num || code || seq の結果を格納した列を元のテーブルに追加すればいいのでは? INSERT, UPDATE 時にこの値を更新するようなトリガーを 入れておけばいいでしょう。 ちなみに、 where substr(bango,1,8) (+) = num and substr(bango,9,2) (+) = code and substr(bango,11,2) (+) = seq のように substr を使うとbango列のインデックスを見なくなるので 余計に遅くなる可能性があります。 (もしかして、最初からbango列にインデックスがついていないとか?)
補足
インデックスのことは考慮していませんでした。 文字列連結と、どちらがパフォーマンスがでないか 後学のために調べてみてもいいですね。 あと、このテーブルは変更できないのです。 すいません。 以前は5秒程度で検索できた、と言ってる方がいまして、 私の力量不足で非常に悩んでおります。 (現在は40秒程度、concat使用で38秒程度) ありがとうございました。
質問の回答ではないですがちょっと気になったことが… where substr(bango,1,8) (+) = num and substr(bango,9,2) (+) = code and substr(bango,11,2) (+) = seq が正しいのでは?
補足
すいません。 substrの第二引数は n文字目 でしたね。 substr(bango,1,8) が正しいです。 お騒がせしました。
補足
向上はあまりみられませんでした。 すいません。 経過: 00:00:46.30 -> 経過: 00:00:38.98 あとCONCATは二つのものしか比較できませんので 正しい書式は concat(num, concat(code,seq ) ) だと思います。 ありがとうございます。