• 締切済み

PL/SQL内の検索条件について

現在PL/SQL内にてSELECTを発行しています。 環境はoracle 11g、WinServer2008です。 SQLは下記になります。 SELECT * FROM TABLE_VIEW TV1 WHERE DAY_F <= kijun_dt AND DAYT >= kijun_dt ; kijun_dtは変数で渡しています。 質問は、kijun_dtを変数で渡すと処理が5秒くらいかかってしまうのですが '2012/03/01'のように固定すると一瞬で返ってきます。 型は日付型できちんとわたっており、 他のテーブル(view)でも同じように変数で渡している箇所が あるのですが、結果は一瞬え返ってきます。 統計情報の更新、マテリアライズド・ビューを作成し使用などしてみましたが どうしても遅くなる原因が特定できません。 似たような現象になった、または何か情報をお持ちの方、 ご回答を宜しくお願い致します。 足りない情報等御座いましたら書ける範囲で出しますので よろしくおねがいします。

  • Oracle
  • 回答数2
  • ありがとう数1

みんなの回答

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.2

#1さんに加えて。 統計情報があるため、固定値のリテラルではインデックスが効いて、バインド変数ではフルスキャンしている、などが考えられます。 (その日付項目のカーディナリティにより、逆の結果になる事もある) また、件数の増減が激しいテーブルであれば、統計情報取得タイミングも考えないとダメでしょう。 リテラル版とバインド版で、それぞれトレースを取り、実行計画を比較してください。 施策の一つとしてはリテラル版に近い実行計画になるようなオプティマイザヒントを付与する事です。 トレースやオプティマイザヒントに関しては、OTNでパフォーマンスチューニング関係のマニュアルがダウンロードできるので、そちらを参考に。 実施環境が本番なのか、テスト環境なのか、も考慮する必要があります。 テスト環境で遅くても本番では速いかもしれないし、逆もまた然り。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

とっさに思いつくのは ・テーブル側の型と変数の型が一致していない ・TABLE_VIEWの構造が複雑 ・ここに書いていない条件がある ・テーブルのサイズ(列・行ともに)がおっきい かな

関連するQ&A

  • PL/SQLでのSQL文法

    こんにちは。教えてください。 PL/SQLを使うのが初めで戸惑っています。 まず、PROCEDUREで =========================== BEGIN SELECT NAME FROM TABLE1 WHERE NAME='tanaka'; END; / =========================== このように書いて実行させようとすると、「コンパイルエラー」 「INTO句はこのSELECT文に入ります」というエラーが出ます。 SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに?? ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて わかりませんでした。 PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。 よろしくお願いいたします。

  • SQLの検索条件について教えてください

    PL/SQLを使い始めた初心者です。 Oracleのバージョンは9iです。 検索時の条件の設定について教えてください。 例えば、2つテーブルがあるとします。 Aテーブル.TESTNoA ------------- 11111 22222 33333 44444 55555 Bテーブル.TESTNoB ------------- 11111 33333 55555 SQL発行時、 WHERE A.TESTNoA = B.TESTNoB で3件のレコードが取得できますよね。 これと同じ結果が欲しいのですが、 検索条件にテーブル型の変数(索引付表?)は使用できるのでしょうか? 変数 TestHen(0) = 11111 TestHen(1) = 33333 TestHen(2) = 55555 こんな感じで設定しておいて、この変数を利用して 一度のSQLで結果を取得したいのです。 できればLIKEを使って検索したいのですが…。 書き方がおかしかったらすみません。 どなたかお知恵をお貸しください。

  • PL/SQLの基礎的な質問ですが・・

    こんばんわ! PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。 DECLAER aaa VARCHAR2(30) BEGIN select max(TABLE_NAME) into aaa from ALL_TABLES Like '***'; select * from aaa END; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。

  • PL/SQL INSERTについて

    はじめまして。 PL/SQLにて、SELECTした複数件のデータ全てを一括して別テーブルに出力する方法は、 バルグ!?といった方法を使用しないと出来ないのでしょうか? 今までCOBOLのRDBしか関わったことがないので、初歩的な質問で申し訳ないですが、 よろしくお願いします ※色々なサイトを見てある程度納得したのですが、念のため、現状での回答を頂きたく  質問にあげさせて頂きました。 ※ORACLE 9になります 例えば以下の場合、Aテーブルには、Bテーブルの22、33の内容が作成されてほしいのですが、 エラーとなってしまうのでしょうか? Aテーブル:データなし Bテーブル  DAT1 DAT2 --------------   11  A   22  B   33  C INSERT INTO A(A.DAT1,A.DAT.02) SELECT B.DAT1,D.DAT2 FROM B WHERE B.DAT1 > 15

  • PL/SQLの戻り値について

    現在正規化されていないテーブルを、PL/SQLを使って集計したいと考えています。以下のような構造にしたいと思うのですが、可能でしょうか? 1.正規化されていないテーブルのデータを正規化されたテーブル(テンポラリーテーブル)へ転記 2.テンポラリーテーブルテーブルのデータを集計(GROUP BYなどで) 3.2の結果を戻す 上記1~3までをすべてPL/SQLで実行し、その結果を取得したいです。 なお取得する結果としては、  キー,集計値1,集計値2    ・    ・    ・ というような構造で、複数レコードあります。 つまり、通常のSELECT文で返ってくる値を、PL/SQLで戻したいと考えています。

  • PL/SQLについて

    お世話になります。今回初めてPL/SQLに触れているのですが…一度のプロシージャの呼び出しでSELECTを二度行う事は可能なんでしょうか? 一度UPDATEしたのちに同じテーブルの違う値を更新するという作業を行いたくそのためには更新した後もう一度SELECTを行いたいのです。時間の許す限り調べはしたのですが…余裕がなくなってしまったのでここで質問させて頂くことにしました。どなたかご指導よろしくお願い致します。

  • PL/SQLのDELETE文について

    PL/SQLでDELETE文を書こうとしているのですが、 文法がわかりません。。。 分かる方がおられましたら、教えてくださいm(_ _)m 今、TABLE1を削除したいのですが、条件がいろいろあって、 以下のように書いてみたのですがダメでした。 こういう書き方は、できないんでしょうか・・・。 削除条件は、TABLE2に存在し、かつ、TABLE2のTENSUが0のもので、 TABLE3が存在しないものです。 DELETE TABLE1 FROM TABLE1 ,TABLE2 ,TABLE3 WHERE TABLE1.ID = TABLE2.ID AND TABLE2.TENSU = 0 AND Not Exists (SELECT TABLE3.ID FROM TABLE3 WHERE TABLE3.ID = TABLE2.ID) 説明が下手なので、うまく、伝わっているか、心配なのですが・・・、 よろしくお願いします。

  • PL/SQLでSPOOLさせたいのですが、可能でしょうか?

    PL/SQLにてSPOOLにてSELECTの結果を ファイル出力させたいのですが、 (下記のような感じです。) エラーとなってしまいます。 そもそも、PL/SQLにてSPOOLは使用可能なのでしょうか? 例) declare  begin   spool c:\test_spool.dat    select * from dual;   spool off end; この例では 「PLS-00103: 記号"C"が見つかりました。」という エラーメッセージがかえってきます。。。 出力ファイルの指定のしかたが悪いのでしょうか? ご教授いただければ幸いです。 DBはOracle9iです。

  • 異なるスキーマからデータを抽出するには?oracl、PL/SQL

    Oracle初心者です。検索してもなかなかhitしないので、質問させていただきます。 aaaとbbbというスキーマがあると仮定します。 aaaにはパスワードテーブル bbbにはユーザテーブルがあるとします。 ユーザテーブル、パスワードテーブルにはそれぞれuser_idカラムがあり、そのuser_idをキーにして、aaaのpasswordカラムのデータを取得したいと思っています。 sql*plusでbbbに接続して、作業をしています。 言語はPL/SQLを使用しています。 単純に SELECT a.password FROM aaa.パスワードテーブル a, bbb.ユーザテーブル b WHERE a.user_id = b.user_id とすれば良いのかと思っていたら、違うようで、オブジェクトが存在しないと言うエラーになりコンパイルが通りません。 このよう違うスキーマのテーブルを参照する場合、どのようにすれば良いのでしょうか?

  • オラクル結合SQL

    こんばんわ。オラクル初心者です。 オラクル9.1で、下記のようにtable1とtable2を結合して、view1(oracleビュー) を作成したいのですが、どのようなSQLがよいでしょうか。 なかなかうまい方法がなくてこまっています。 table1 no 項目 その他 その他1 1   1 1  2 1  3 .....省略 table2 no 項目 種別 結果 1  1  01  3 1  1  02   8 1  1   03  7 1  2  01  9 1  2   02   6 1  2  03  2 1  3  01   1 ...... view1 良い例 no 項目 結果1 結果2 結果3 1   1   3   8   7    ←種別01 02 03を順にいれる 1   2  9   6  2 1  3  1............ select table1.no,table1.項目,・・・ from table1,table2 where table1.no = table2.no and table1.項目 = table2.項目 ↑おおよそこのような感じになるとは思ってます。 何とか頑張ったのですが、下記のようになってしまうことが 多かったです・・・。どこかSQLがわるいようです。 view1 悪い例 no 項目 結果1 結果2 結果3 1  1   3   8  7 1  1   3   8  7 1  1   3   8  7 1   2  9  6  2 1   2  9  6  2 1   2  9  6  2 1   3  1............ もしご存知の方いらっしゃいましたら、助かります。よろしくお願いいたします。