- ベストアンサー
800万件のテーブル読み込みについて
oracle10G(10.2.0.1)をWin2003 SP2環境で使用しています。 あるテーブル(Aテーブル)のデータ量が800万件あり、そのテーブルを読み込むSQL(B.SQL)が4分程度かかっていました。 ある日、Aテーブルの項目名を変更することになりましたので、すべてのデータをCSV形式で保存し、テーブルをdropcreate後にsqlローダーにてインポートしたところ、B.SQLが15分かかるようになってしまいました。 B.SQLは、項目名を変えただけで、インデックスも削除する前と同じ状態にしてます。 どこから調査すればよいのでしょうか? よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
統計について言及されていますが、B.SQLの実行計画を確認することも重要です。現状とあわない統計に基づいて実行計画を立てていた場合、非効率な実行計画が表示されていたはずです。(800万行もあるのにROWSが1となるなど) DBMS_STATSで解決したら良いですが、しなかった場合は、「コストベースで立てたプランが悪い実行計画となってしまった」ということが考えられます。コストベースだと、ほぼ同じデータでもある日突然遅くなることが十分考えられます。こっちの場合は、SQLにヒント句を組み込み、以前のような良い実行計画に誘導するやり方が考えられます。 もしくは、ダイレクパスロードのミスで主キーインデックスが壊れてしまい速度劣化するような場合などもありますが、いずれにしても、もしまだ遅かったら実行計画を出して分析してみてください。よく分からない時はここに実行計画を貼り付けたら皆さんがアドバイスくれるかと思います。
その他の回答 (4)
- DB_eng
- ベストアンサー率0% (0/1)
動的サンプリングが働いてしまっていること、 及び統計情報をとることが書かれているので、 1点、補足します。 統計情報の取得コマンドですが、ANALYZEではなく、 DBMS_STATS.GATHER_TABLE_STATSにて行ってください。 CBO(コストベースオプティマイザ)が使用する統計情報は ANALYZEコマンドではなく、DBMS_STATSが推奨されてます。 コマンドサンプルは、以下の通りです。 execute DBMS_STATS.GATHER_TABLE_STATS( ownname=> 'SCOTT', <== スキーマ名 tabname=> 'EMP' , <== テーブル名 estimate_percent=> DBMS_STATS.AUTO_SAMPLE_SIZE, <== 左記のままか、1~100までの値。AUTOはORACLEまかせ、100であればより正確な統計値が得られる cascade=> TRUE, <== その表に作成されている索引も取得 degree=> null <== 並列度。CPUが複数ある場合、指定すると取得時間が短縮される );
お礼
御回答ありがとうございます。 DBMS_STATSコマンドを実行してみます。
- 3rd_001
- ベストアンサー率66% (115/174)
まず、現状の実行計画をとりましょう。 アナライズは、実行計画を取ってからやりましょう。 でないと、どう変わったのかが判断できません。 また、今回は10gですので、現状がどうなっているかも調査してから対策を立てたほうが良いです。 もしかしたら、自動統計が取られているかもしれませんし、動的サンプリングで動いているのかもしれませんし、デフォルトの統計でうごいているかもしれません。 ※Oracleの設定次第ですので、調べないとわかりません。 統計については以下を読んでから実施した方がよいです。 http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19207-02/stats.htm
お礼
ご回答ありがとうございます。 早速実行してみます。
- mako_sea
- ベストアンサー率47% (62/130)
オラクルの統計情報は ANALYZEコマンドで取得するようです。 ただしこの統計情報更新で改善するかは、 オプティマイザの設定にもよると思われます。
お礼
御回答ありがとうございます。 analyzeコマンドを実行してみます。
- wolf03
- ベストアンサー率22% (241/1086)
コストベース検索である以上当然の事象です。 データを一気に入れたため、コスト最適化する統計情報が無い状態ですので遅いのです。 統計情報を何とかしない限り無理ですね。
お礼
御回答ありがとうございます。 統計情報を何とかするというのは、しばらく実行を繰り返してから 再度統計情報を取得するということでしょうか?
お礼
ご回答ありがとうございます。 explain plan により実行計画を確認してみます。