oracle10G(10.2.0.1)をWin2003 SP2環境で使用しています。
あるテーブル(Aテーブル)のデータ量が800万件あり、そのテーブルを読み込むSQL(B.SQL)が4分程度かかっていました。
ある日、Aテーブルの項目名を変更することになりましたので、すべてのデータをCSV形式で保存し、テーブルをdropcreate後にsqlローダーにてインポートしたところ、B.SQLが15分かかるようになってしまいました。
B.SQLは、項目名を変えただけで、インデックスも削除する前と同じ状態にしてます。
どこから調査すればよいのでしょうか?
よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
統計について言及されていますが、B.SQLの実行計画を確認することも重要です。
現状とあわない統計に基づいて実行計画を立てていた場合、非効率な実行計画が表示されていたはずです。(800万行もあるのにROWSが1となるなど)DBMS_STATSで解決したら良いですが、しなかった場合は、「コストベースで立てたプランが悪い実行計画となってしまった」ということが考えられます。コストベースだと、ほぼ同じデータでもある日突然遅くなることが十分考えられます。こっちの場合は、SQLにヒント句を組み込み、以前のような良い実行計画に誘導するやり方が考えられます。
もしくは、ダイレクパスロードのミスで主キーインデックスが壊れてしまい速度劣化するような場合などもありますが、いずれにしても、もしまだ遅かったら実行計画を出して分析してみてください。よく分からない時はここに実行計画を貼り付けたら皆さんがアドバイスくれるかと思います。
No.4
- 回答日時:
動的サンプリングが働いてしまっていること、
及び統計情報をとることが書かれているので、
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が複数ある場合、指定すると取得時間が短縮される
);
No.3
- 回答日時:
まず、現状の実行計画をとりましょう。
アナライズは、実行計画を取ってからやりましょう。
でないと、どう変わったのかが判断できません。
また、今回は10gですので、現状がどうなっているかも調査してから対策を立てたほうが良いです。
もしかしたら、自動統計が取られているかもしれませんし、動的サンプリングで動いているのかもしれませんし、デフォルトの統計でうごいているかもしれません。
※Oracleの設定次第ですので、調べないとわかりません。
統計については以下を読んでから実施した方がよいです。
http://otndnld.oracle.co.jp/document/products/or …
No.2
- 回答日時:
オラクルの統計情報は
ANALYZEコマンドで取得するようです。
ただしこの統計情報更新で改善するかは、
オプティマイザの設定にもよると思われます。
参考URL:http://itnavi.com/totteORA/Tips21.asp
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) access フォーム 大分類、小分類 1 2022/08/11 18:03
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Oracle sql(oracle)で質問です。 テーブルAのカラム名、日付(yyyymmdd)の値を テーブルB 2 2023/01/06 10:31
- SQL Server 大学でSQLの授業があるのですが全くわかりません。 表ではなく文で説明されているのですが調べても理解 6 2022/07/20 02:26
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Oracle SQL update方法 2 2022/06/22 14:07
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
WHERE句はJOIN結合前結合後どち...
-
likeとsubstrの使いわけについて
-
Like文の速度について教えてく...
-
Selectの処理速度改善について
-
前方一致で索引(インデックス...
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
Transact-SQLでストアードプロ...
-
エクセルVBAでUserFormを起動し...
-
SQLserver算術オーバーフロ...
-
ストアドプロシジャからストア...
-
Statement ignored というエラー
-
ODBCリンクの際にACCESSでは読...
-
SQLで部分的にGROUP BYしたいとき
-
sqlのwhere句で下記の条件にし...
-
PL/SQLカーソルの2重FORループ...
-
全角空白のTRIMができない...
-
テーブルの主キーをdate型...
-
Excel VBAで「プログラム実行」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
likeとsubstrの使いわけについて
-
WHERE句の実行順序
-
Like文の速度について教えてく...
-
WHERE句はJOIN結合前結合後どち...
-
ヒント句が無効になります
-
JOINの時のONとWHEREの違いにつ...
-
あいまい検索のパフォーマンス...
-
アナライズでほとんどの処理が...
-
SQL ORDER BYにおける条件について
-
800万件のテーブル読み込み...
-
問題解決のストーリーにて PDCA...
-
実行計画HASH JOIN RIGHT OUTER
-
oracleのanalyzeと処理時間につ...
-
PDCAを回すって?
-
【チューニング】インデックス...
-
Oracleで検索すると、フリーズ...
-
Oracle 実行計画、統計情報の見方
-
OEMで負荷の少ないSQLの実行計...
-
データ抽出の速度について
おすすめ情報