- ベストアンサー
SQLの実行計画の取得について
- SQLの実行計画の取得方法とコストベースとルールベースについて
- コストベースとルールベースの実行計画の比較とコストの数値のチューニング目安
- 統計情報の参考と本番データの利用の必要性
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- DBの実行計画って?
先日、開発者求人の面接に行ってきました。 顧客のDBを解析、DBの検索機能を最適化して、パッケージで納品・・・というようなことを行う企業なのですが、 そこで「DBの実行計画にはどんな種類がありますか?」という質問を受けました。 (え?DBの実行計画の種類? SQL実行する前にEXPLAINとか、で実行計画見て、コストが低くなるように 色々やったことはあるけど、実行計画の種類って?) という感じで何を聞かれているのか見当が付かず、答えられませんでした。 分かる方、教えてください! 何を聞かれたのでしょう? また、なんと答えればよかったのでしょう? ※ちなみに、その企業の扱っているDBはOracle,postgres,SQL server 等 顧客に合わせて何でも扱うみたいです。
- ベストアンサー
- Oracle
- Oracle 実行計画、統計情報の見方
実行計画や統計情報を取得した結果の 簡単な見方があればサイトなど教えてください。 実行計画を取得して どんなSCANやINDEXの利用されているかがわかっても、 何SCANなら速いとかがわからないので、 結局、何を採用すればいいかわかりません。 統計情報でもconsistent getsが ブロックに対する読み込み一貫性が要求された回数とわかっていても、 その値が少なければいいのか、 どの値を優先的に見ればいいのかがわかりません。 情報の取得は出来ても分析の仕方がわからない状態です。 簡単にわかる方法があれば教えてください。
- ベストアンサー
- Oracle
- 実行計画の「COST」と「BYTE」について教えていただきたいです。
実行計画の「COST」と「BYTE」について教えていただきたいです。 書籍には COST・・・・CBOによって見積もられた操作コスト。 BYTE・・・・アクセスされるバイト数のCBOのアプローチによる見積もり。 と書かれていますが、いまいちピンときません。 私は、 COSTは、検索するテーブルのデータ量が多いほうがコスト値が大きくなる。 BYTEは、検索条件に合致して取得できるデータが多いほうがバイト値が大きくなる。 と思っているのですが、正しいでしょうか?
- ベストアンサー
- Oracle
- コストベース・オプティマイザについて。
オプティマイザには、 1)ルールベース・オプティマイザ(RBO) 2)コストベース・オプティマイザ(CBO) があります。 RBO は、決められたアクセスパスの優先順位に従って 実行計画を選択することが分かりました。 CBO は、最適なアクセスパスを選択する為に、 オプティマイザ統計を取得し、実行計画のコストを 見積もることが分かりました。 ★このオプティマイザ統計に関して、質問があります。 オプティマイザ統計は、ANALYZE や DBMS_STATS パッケージを 使用することで取得する統計情報ということが分かりました。 しかし、統計情報を取得することでどのように実行計画が 改善されるのか、この部分のイメージが掴めません。 ================================================================ 例えば、表の統計情報を取得すると、以下のようになりました。 SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT 2 ,AVG_ROW_LEN 3 from user_tables where table_name='EMP'; NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN ---------- ------ ------------ --------- ---------- ----------- 15 5 0 0 0 35 ================================================================ それぞれのカラムの意味は以下であることが分かりました。 《上記のカラムの説明》 NUM_ROWS = 行数 BLOCKS = 使用ブロック数 EMPTY_BLOCKS = 未使用ブロック数 AVG_SPACE = 空き領域の平均サイズ(bytes) CHAIN_CNT = 行連鎖・行移行の行数 AVG_ROW_LEN = 行の平均長(bytes) 上記の統計情報を取得することで、どのように実行計画を定めているのでしょうか。 統計情報を取得することで、どのような意味があるのでしょうか。 宜しければ、教えて頂きたいと思います。
- ベストアンサー
- Oracle
- 9iと10gでの実行計画の違いについて
SQLの実行計画について教えていただきたいです。 【現状】 9iと10gそれぞれの環境で /*+ ALL_ROWS */ を使用したあるSQLの 実行計画を出したところ、全く異なった実行計画になっていました。 コストは9iが2000、10gが150で、10gでは数秒で結果が返ってくるのに対し、 9iではいつまで経っても結果が返ってきません。 9i環境と10g環境とではテーブルの構造やINDEXは同じですが データの中身は別で、件数は9iが100万件、10gが150万件です。 【教えていただきたいこと】 このように9iと10gとで実行計画や処理の時間が異なる原因は データの中身が違うこと以外では何が考えられるでしょうか。 解決策があれば合わせてお教えいただきたいです。 /*+ ALL_ROWS */を使えば9iでもSQLをコストベースにできると 思っているのですが、それが間違いなのでしょうか。。。 そもそも実行計画がよく分かっていないので申し訳ないのですが、 何かお気づきのことがあればお教えいただきたいと思います。 よろしくお願いします!
- ベストアンサー
- Oracle
- PHP+PDO+MYSQL で実行されたSQL文の取得について
PHP+PDO+MYSQL で実行されたSQL文の取得について PEARのDBからPDOへの移行をしていましてデバック用のSQL文取得で困っています。 $sql = "SELECT * FROM sample where id = ? And id2 = ?" PEARのDBでは $db->query($sql,array(1,5)); $db->last_query; で実行したSQL文を取得することは可能でした。 PDOの場合 $sql_result = $pdo->prepare($sql); $sql_result->execute(array(1,5)); でリプレースフォルダ(クォート処理?)を利用してSQLを実行出来るようですが、 実行したSQLを確認する方法がマニュアル等を読みましたがどうしても分かりません。 どなたかご存知の方がいらっしゃいましたらご教授お願い致します。
- ベストアンサー
- PHP
- EXCEL2003 VBAで2つのDBに接続してSQLを実行し、異なる
EXCEL2003 VBAで2つのDBに接続してSQLを実行し、異なるDBのTBLを結合する。 こんな方法あるのかどうかわかりませんが、 VBAでDBに接続する際に同時?に2つのDBに接続し1つのSQLで違うDB同士を任意のキーで結合はできるのでしょうか? どなたかわかる方お願いします。 今考えているのは最初に1つのDBに接続し、データを取得後、再度違うDBに接続し取得したデータを先ほどのデータとVBA内で結合しようと考えています。 ほかにいい方法があればアドバイスおねがいします。 ※今まではACCESSを介してこの処理を行っていましたが引継ぎの関係でEXCELのみでこの処理を 実行しなければなりません。
- ベストアンサー
- Visual Basic
- JOIN ON の SQLの実行が遅いです
下記のようなSQLを実行しています。 SELECT db_1.*, CASE WHEN db_1.tihou = '北海道' THEN '1' WHEN db_1.tihou = '青森' THEN '2' WHEN db_1.tihou = '秋田' THEN '3' WHEN db_1.tihou = '山形' THEN '4' WHEN db_1.tihou = '岩手' THEN '5' WHEN db_1.tihou = '宮城' THEN '6' WHEN db_1.tihou = '福島' THEN '7' else '9' END AS kita, db_2.no, db_2.title, db_3.name, db_3.url from (db_1 left JOIN db_2 ON db_1.nonber = db_2.no) LEFT join db_3 on db_1.nonber = db_3.non WHERE db_1.nonber LIKE '1%' ORDER BY db_1.day DESC LIMIT 0,30 ※DB名、テーブル名は仮名としています db_1というメインのデータベースに合わせて db_2、db_3の情報をくっつけて結果を出したいと思っていますが実行に25秒強かかっています。 (PHPMyadmilで実行しました) db_1単体でしたら実行は速かったのですが db_2、db_3はどうしても付属させたく、また、db_1とは別のデータとしておきたいと考えています。 補足ではありますが、 「db_1.*」としているのは、db_1のデータ全て表示に使う為です。 良い方法をご存知の方いらっしゃいましたら、どうかお教え下さい。
- ベストアンサー
- MySQL
- SQLで取得したフィールドをSQL文として利用
お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。
- 締切済み
- MySQL
お礼
お返事有難うございます。今の段階では色々と決まっていないとのことなので、あまり気にしても仕方がなさそうですね。 ただSQLが詳細設計やプログラム設計に書くので、レビュー時に性能について言われることもあり、どうしたものかと思っていまして・・・。そういう場合は現状パフォーマンスが下がらないように考えていますが(どこらへんを?って言われると厳しいですが)、あとは試験でパフォーマンスが悪い場合は調整しようと考えています。とか言っておくぐらいしかないでしょうか。