• ベストアンサー

処理速度の改善について

PL/SQLにて大量のデータを処理しているのですが、処理に時間が掛かりすぎる為、SQLのチューニングを考えています。 まずどういう所から見ていけば良いでしょうか? また、INDEXを指定すると良いのかな、と思うのですが、PL/SQL内でINDEXの指定は出来ますか? /*~*/でコメント文と見なされているように思うのですが。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.2

結合処理を行っているSQLはないですか? また、インデックスを作成しているのに使用できないようになっている(例えばWHERE句のインデックス列に関数が使用されている)SQLはないですか? データ件数がそれほど多くない場合、遅いSQL分の大半は結合処理だと思われます。 結合処理について実行計画を確認し、最適なパスになるようにヒント句を設定されてはいかがでしょうか。 また、ルールベースの場合、FROMに記述する表名の順番も実行計画に影響を与えるので、その辺についても確認されるとよいです。 実行計画の取得方法は、 1. あらかじめplan_tableを作成する。 SQL> @?/rdbms/admin/utlxplan.sql 2. 実行計画の取得 SQL> EXPLAIN PLAN FOR (調査対象のSQL文) 3. 実行計画の確認 SQL> SELECT LPAD(' ', 4 * (LEVEL - 1)) || operation || ' ' || options || ' ' || object_name || ' ' || DECODE(id, 0, 'Cost = ' || position) AS "Query Plan" FROM plan_table START WITH id = 0 CONNECT BY PRIOR id = parent_id ORDER BY id, position /

その他の回答 (1)

  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.1

TKPROF等を使用したボトルネックの分析がまず最初ですね。 ・大量更新ならインデックスを削除してから更新->再作成 ・表設計そのもの。多少は正規化を戻して冗長化して、多数の表を扱わないようにする ・ループ回数のチェック(SQLの構造そのもの) ・インデックスの適切な付与 ・同じSQL文なら、大文字小文字やスペースも同じにする 奥は深いですが、 SQLの構造そのもの・・・60% データベースのチューニング・・・30% ハードのチューニング・・・10% といわれたことが有ります。頑張ってください。

参考URL:
http://www.atmarkit.co.jp/fdb/index/index-db.html#tuneorasql

関連するQ&A

  • Selectの処理速度改善について

    先日、PL/SQLの開発について、こんな質問を受けました。 「SQLを組むさい、処理速度を速めるためにやっていることは?」 と。 で、ちょっと考えて 「Selectなら、Indexを考慮してSelect文を作成し、実行します。 処理時間がかかる場合は、実行計画などをみて、 Select文にヒント句をつけて、処理速度を改善します。」 と答えました。 答えたあと、質問者された方は、なんだかがっかりした感じでしたが、 私の回答は不適切だったのでしょうか? それとも、どういう回答が良かったのでしょうか? よろしくお願いします。

  • 処理速度の見積もり時間について。

    処理速度の見積もり時間について。 Oracle 10gを使用し開発を行っています。 処理速度について伺いたいことがあり、投稿致しました。 現在、PL/SQLを使用しCSVファイルよりデータを読み込み、 テーブルをチェックし、条件に合致するようならデータのUPDATEを 行うという処理をしています。 このCSVファイルのデータは何百万件と大量のデータで、 処理速度を懸念しております。 そこで処理速度についてですが、どのようにすれば見積もることが できるのでしょうか? 具体的な方法をご教授頂けるとありがたいです。 そもそもCSVファイルを一行ずつ読み込んで、テーブルに対し UPDATEを掛けるというやり方自体間違っているのでしょうか? 一時テーブル等を使用した方が良いのではないかとも思うのですが・・・。 以上、宜しくお願い致します。

  • mysql_queryの処理速度が遅い

    PHP+MySQLでプログラミングをしているのですが、実行時にmysql_queryの処理に時間がかかっています。状況は以下の通りです。 ・処理時間を計測するとmysql_queryの実行に15秒程度かかっています。 ・Webminで直接同じSQL文を実行すると1秒程度で終わります。 ・SQLのコマンドは単純なUPDATEです。 ・indexは設定してあります。 ・DBに格納してあるレコード数は数100件程度です。 ・optimizeは実行してみましたが、あまり効果はありませんでした。 お聞きしたいのはWebminで実行すると1秒程度で終わるSQL文がmysql_queryで実行すると、なぜ時間がかかるのかということです。 mysql_queryで時間がかかる原因およびmysql_queryの処理時間を短縮する方法などがあれば教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • カーソルオープンの処理について

    バッチ処理をするために、DB2の埋め込みSQLを使用していますが問題があります。 処理対象のデータが大量にあるのですが、カーソルのオープン処理で時間がかかってしまうため、時間内に終了することができません。 カーソルオープン処理を早くする方法がありましたら教えていただけますでしょうか。 ちなみに、 1.取得件数とオープン処理速度は全く関係がないように見えます。 2.インデックスを貼ってみましたが、変わりませんでした。 よろしくお願いいたします。

  • 処理時間について

    今、仕事で既存の処理のレスポンス調査をしているのですが、 行き詰ってしまったので質問させていただきます。 本番環境とテスト環境で全く同じ処理を実行した所、テスト環境では 1分程度で処理が正常終了するのに本番環境だと 2時間経過しても処理が終わらず、なぜ同じ処理なのに本番環境と テスト環境で処理時間に違いがありすぎるのか分からず困っています。 処理としては25万件程あるデータ(テキストベース)を PL/SQLで読み込みTable_AにInsert または キーが同じデータが 存在しているならUpdateをし、 それと同時にトリガーで更新前と更新後の値を Log_TableにInsertします。 検証したときの手順としては、 (1)Table_AとLog_TableをCreate (2)トリガーのコンパイル (3)Table_Aのインデックスの作成 (4)PL/SQLのコンパイル (5)Table_AとLog_Tableの統計情報の取得 となっております。 ちなみに、テスト環境と本番環境の両方について、 実行されたSQLの実行計画を取得し比較したのですが、 同じ実行計画になっていました。 また、統計情報を取らずに処理を実行した場合は、テスト環境でも 2時間経過しても処理が終わりませんでした。

  • SQLの速度を調べるには…

    ただいまオラクルマスターのブロンズSQL基礎Iを勉強中です。 インデックスについて覚えたのですが、インデックスをつけた状態とそうでない状態の差が実感できません。 大量にデータが存在しないとわからないものだとは思いますが、なにか実感できる手段はないでしょうか? SQLをたたいてから結果が返ってくる時間をしらべることができれば、ミリセックの違いでも感じられると思うのですが。 よい方法をご存知でしたら教えてください。

  • 動的SQLの処理件数

    PL/SQL中でSQL文を文字列に入れて、動的SQLを実行するんですが、その後にSQL%ROWCOUNTで処理件数ってとることってできますか? 自分のソースが問題なのか、動的SQLに原因があるのか悩んでいます。環境はOracle8iです。

  • oracle pl/sqlの処理速度について

    pl/sqlで作成したプログラムはc言語で作成したものより処理が遅いと聞きました。 処理の前提として、  ・処理件数は数十万件から数百万件のバッチ処理  ・データは全てテーブルに格納してある  ・処理が複雑なため、プロシジャからプロシジャを呼び出す必要がある  ・サーバの能力はそれなりにある です。 c言語の経験がないので、検証することが出来ません。 処理の内容にもよるとは思いますが、一般的な回答で構いませんので教えてください。

  • mysqlでSELECTの速度を上げる方法

    以下のようなSQLを発行すると、mysqlの処理時間が非常に多くかかるため、なんとか最適化を行いたいと考えています。 どのような方法があるのか教えていただけませんしょうか。 SELECT user_id,comment,comment_id,date,study_time,study,source FROM data_temp t1 WHERE NOT EXISTS (select comment_id from data t2 where t1.comment_id = t2.comment_id) ■補足 ・dataとdata_tempのテーブル構造は全く同じです。 ・SQLで実現したいことは、両テーブルのcomment_idをキーとして、dataに含まれないdata_tempの差分データを表示させたい。 なお、以下のインデックス作成は行いましたが、結果変わらずでした。 alter table data t1 ADD INDEX_t1 (user_id,comment,comment_id,date,study_time,study,source); alter table data_temp t1 ADD INDEX_t1 (user_id,comment,comment_id,date,study_time,study,source); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PL/SQLでmdb(Access)ファイルへの書き込みは可能?

    あまりPL/SQLに関して知識がないので 可能なのかを教えていただきたいのですが、 例えば、 Oracleのテーブルデータ(例:メッセージテーブル) をローカルの空のMDBファイルへ丸ごとコピー といった処理をVBで行っているのですが、 毎回Insertを発行しているために とても処理に時間がかかっています。 (もともとこれ自体無謀なんですが・・・) そこでPL/SQLではバルク処理?といった 高速処理もあるようで、 このVBのかわりにPL/SQLで出来ないものだろうか・・・ と単純に思ったのですが、 PL/SQLでこういったコピー処理っていうのは 可能なんでしょうか?? ご存知の方、教えていただきたいです。 よろしくおねがいします。