- ベストアンサー
SQLの高速化
SQLの高速化に関する情報を教えてください! 結合する時、どっちのテーブルを=の左にする(これ、分かりません・・・)、とか、多くのテーブルとテーブルの結合条件を書く際、WHEREに近い方にどういう結合条件を持ってきたらいい、とか、WHERE句を評価する時のDBの検索の仕組み(順番)とか・・・基本的なとこから全部知りたいです! ↑これは適当に言っていることであって、このような感じの情報がもしあれば、知りたいということです。 どうかお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まずは簡単な事からやっていけ良いのでは。 Aテーブル(マスタ)項目1,項目2,項目3 Bテーブル(サブ参照用1)コード,名称 Cテーブル(サブ参照用2)コード,名称 上記テーブルよりデータを検索するとします。 select A.項目1,A.項目2,A.項目3,B.名称,C.名称 from A,B,C where A.項目1 = 条件 AND --マスタの抽出(1) A.項目2 = B.コード(+) AND --マスタとBテーブル(2) A.項目3 = C.コード(+) --マスタとCテーブル(3) 実行結果の件数はAテーブルの(1)の結果件数です。 次にマスタからBテーブルより名称を取得します 条件は(2)となり(+)によりなければ空白が名称 となります。 (3)は(2)と同じで参照先が異なります。 Where句の順番はマスタから記述。 それとテーブル間はプライマリを記述そして複数 項目の場合はテーブル構成の順番通りに記述する。 この為,高速化の目的で別インデックスを作る。 ただし読込みが早いと書込みが遅い事を忘れずに。 あとは色々勉強してみて下さい。 (説明悪いかな)
その他の回答 (4)
- taspon
- ベストアンサー率69% (9/13)
「あくまでも適当な一例」とのことでしたが、気になった点がありますのでお伝えします。 開発の職場で古くから語り継がれているノウハウ(どっちのテーブル=の左に・・・など)の中には、古いOracleの仕組みを元にしていることがよくあります。 だから、「教えを守ってSQLを書いたのに本当に効果があるんだろうか?」という話になってしまいます。 そんな経験はありませんか? 古い仕組みとはルールベース・オプティマイザで これに対してコストベース・オプティマイザ 簡単に言ってしまうと、 SQL文の書き方ひとつで、 ・性能に大きく影響するのがルールベース ・性能にあまり影響しないのがコストベース いまどきルールベースで運用されているDBはほとんどありませんが、この2つの違いを理解していないと、いろんな情報に惑わされてしまいます。 まず、この2つの違いを理解しておくことをおすすめします。 それからコストベース・オプティマイザでは、 「統計情報の収集」がきちんと定期的に実施されているかどうかが、SQLの性能に大きく影響します。 質問者さんが使っている環境には、DB管理者がいるでしょうか?それとも管理者不在でしょうか? DB管理がしっかりしていれば、他の人はあまり気にしなくてもよいのですが、「統計情報の収集」がどういったタイミングで実施されているか、把握しておくことをおすすめします。 なお、収集はOracleバージョンによって、明示的な実行が必要だったり、Oracleが自動でやってくれたり、いろいろです。 以上です。 SQLの性能に非常に大きく関係しますので、SQLのチューニングを覚えるより前に、ぜひ理解しておきましょう。
お礼
ありがとうございます。 そういうことも必要な知識なのですね。 分からない部分は、一つ一つ調べてみます。
かなりレベルが高いですが (初心者向けの回もあります) このメルマガは非常に役立ちます
お礼
ありがとうございます。利用させていただきます。
基本的な事ってどのくらい基本から書けばいいのか。。。 それこそ本書ける位の分量になるので。 SQL以前にデータ構造や、適切なインデックスとかを設計してます?
お礼
B設計⇒DB設計の間違いです。申し訳ありません。
補足
B設計に関しては知識がありません。PG歴8ヶ月ですので、コーディングしかしたことありません。今まで、SQLは他の人が既に作成済であったり、他のソースからコピーしてきたりして何とかしていました。人任せにしてきてしまい、基本的なところから分かっていないため、質問させていただきました。 >基本的な事ってどのくらい基本から書けばいいのか。。。 広い分野で質問をしてしまったようで、申し訳ありません。 基本的なところとは、私が例に挙げているようなことがあれば、教えて頂きたいということです。
- OsieteG00
- ベストアンサー率35% (777/2173)
DBのチューニングは多岐に渡るのでここではとても説明できません。 SQLのチューニングなら... http://www.atmarkit.co.jp/fdb/index/index-db.html#tuneorasql まずは読み込む件数そのものを減らす工夫からはじめてみては。
お礼
ありがとうございます!明日じっくり読んでみます。
補足
詳しい説明、ありがとうございました! 分からない箇所が3つあり、 >テーブル間はプライマリを記述 プライマリは分かりますが、テーブル間とはどういうことでしょうか? >ただし読込みが早いと書込みが遅い事を忘れずに。 DBのことでしょうか?読み込み、書き込みとは? >複数項目の場合はテーブル構成の順番通りに記述 SELECT句の部分ですよね? もし回答いただけるのでしたら幸いです・・・。 その後は、自分で勉強してみますので!