パフォーマンスを考慮したSQL文作法

このQ&Aのポイント
  • SQL文のパフォーマンスやメンテナンス性を考慮した基本的な記述作法についてまとめているサイトや書籍はありますか?
  • 外部結合は3つまで、結合が多い場合はランダムリードを使用するなど、効果的なSQL文作法についての例がほとんどないです。
  • SQL文自体は問題なく動作しているが、データ蓄積後の遅延やメンテナンスの課題があります。参考になる情報を教えてください。
回答を見る
  • ベストアンサー

パフォーマンスを考慮したSQL文作法

はじめまして。 SQL文の"記述"という面については問題ないのですが、 パフォーマンスやメンテナンス性等を考慮した際に、 "基本"的な記述作法を纏めているサイトはありますでしょうか? (または書籍)書き方というよりは考え方の様なものなのですが・・・。 たとえば「外部結合は3つくらいまで」とか「いくつも結合するならランダムリードで」とか、そもそも例としてもあまり思いつかないのですが。 SQLとしては成り立っているため、モノとしての動作は(スタート時においては)問題無いのですが、レコードが蓄積された後の動作遅延や、後々のメンテナンスで現在苦労しておりましたので、何か参考に なる情報がございましたらぜひ教えていただければと思います。

  • gonii
  • お礼率39% (9/23)

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

  • ベストアンサー
  • norayuni
  • ベストアンサー率79% (27/34)
回答No.1

http://msdn.microsoft.com/ja-jp/ms172984.aspx http://msdn.microsoft.com/ja-jp/ms172432.aspx http://technet.microsoft.com/ja-jp/ms191426.aspx 簡潔にまとまった内容ではないのですが、いくつかの作法が紹介されています。 結合は5つ以下に・・・など。

gonii
質問者

お礼

ありがとうございます! 大変参考になりました。

関連するQ&A

  • SQLServerを使い、SQL文の練習をしたい

    SQLServerを使い、SQL文記述の 練習をしたいと考えています。 (テーブルを作る、結合させる、レコードの合計を出す、などの内容) 自分のPC上で、SQL文を書いて 「わー2つのテーブルが結合した!」 「こっちのテーブルにはないレコードだけを追加できた!」というようなことを実感したいのみなのですが、この目的での利用でも、レンタルサーバーを借りるなどして「サーバー」を準備する必要があるのでしょうか? AccessでSQL文の面白さを知り、 他のデータベース関係のソフトにも触れてみたいと 思ったのが理由です。 よろしくお願いいたします。

  • SQLの解析資料の作り方

    仕事のメンテナンスで他の人が作ったSQLの解析を 多く行うのですが、複雑なSQLや10以上のテーブルを 結合して何をどうしているかを、解析した以外の人間が 一目で見て分かるような資料をどのように作ったらいいか 困っています。 何か良い表現方法やまとめかたをご存知の方がいらっしゃったら 教えていただきたいです。 現在は、どのテーブルからどの結合条件でどの抽出条件で などのまとめかたで記述をしているのですが、ぱっと見 わかりづらく、伝わりにくいので解析後時間がたってしまうと わけがわからなくなり困っております。 よろしくお願いいたします。

  • スペース区切りによるAND検索をSQL文だけで実現したい

    スペース区切りによるAND検索をSQL文だけで実現したい いわゆるWeb検索等で利用するスペース区切りでのAND検索を SQL Serverでも実現可能かどうかを調べています。 結合に使用するため、プログラムからSQLを組み立てる事が出来ません。 なお、検索したい対象は一時テーブル内の小数データなので、パフォーマンスは特に問題は有りません。 ただし、一時テーブルなのでCONTAINS等を使用する事が出来ません。 せめて一時テーブルに対するフルテキスト検索が出来れば問題ないのですが、、、 以上、よろしくお願いします。

  • ExcelVBAにて外部データ(*.csv)をSQL文を使って抽出する方法

    こんにちは VBAインポート問題で日々悩んでいるものです。 CSV形式のデータをODBCのシステムDSNに登録し、それをDAOでSQL要求しデータを抽出する方法がよくわかりません。 (1)データベースの定義記述内容 (2)レコードセットにSQL命令をかける記述 (3)抽出された内容をワークシートに貼る記述 等がよくわかりません。 DAOの場合、レコードセットを定義するのに set DB=DBEngine.OpenDatabase("******")があったり、なかったりする理由がわかりません。 突然、set rs = CurrentDb.OpenRecordset("*****") しているのはなぜでしょうか。

  • SQLの参考書(文法書?)

    みなさんこんにちは。 SQLの参考書について、教えてください。 下記のテーブル t0、t1、t2 において、 key0 および key1は t1.id への外部キーで、 key は t0.id への外部キーです。 この構成に対して全リストを SELECT しますと、 RESULT に示す結果となります。 上記のような機能の SQL につきましては、 3個以上のテーブルの結合や、 1つのレコードからの同一テーブルへの複数の結合が必要となり、 記述が複雑になると思います。 そこで教えていただきたいのですが、 このような SQL を記述する際に必要な文法を勉強するには、 どのような参考書が良いでしょうか? どうぞ、よろしくお願いいたします。 TABLE: t2 -------------------- id key0 key1 -------------------- 0 2 0 1 3 1 2 4 6 3 5 7 TABLE: t1 -------------------- id key -------------------- 0 3 1 4 2 5 3 6 4 7 5 0 6 1 7 2 TABLE: t0 -------------------- id text -------------------- 0 "00000" 1 "00001" 2 "00002" 3 "00003" 4 "00004" 5 "00005" 6 "00006" 7 "00007" RESULT: -------------------- id text text -------------------- 0 "00005" "00003" 1 "00006" "00004" 2 "00007" "00001" 3 "00000" "00002"

  • VBA SQL文 日付判定で抽出の仕方

    適用開始日を条件にして現在の一覧抽出の仕方 助けてください。 SQL記述 初級ですが、基本的な記述は出来ます。 VBA記述 実務で行っています。 【環境】 Access 2003 Excel 2003 VBA (+ADO 2.8 ) やりたい事はテーブルから現在有効になっているレコードの一覧を抽出する事です。 Access mdbファイルに対象テーブルがあります。 ADODB.Recordset オブジェクトに取得したレコードセットを当てて、そこから ExcelのVBAで作ったフォーム上のリストビューコントロールにAddする予定です。 しかし、一覧を抽出する為のSQL文で、つまづいてしまいました。 条件は (1)抽出した一覧にコードは重複していない事 (2)現在の日付と比較し、有効になっているレコードを含め、未来のレコードは含めない事 (3)対象テーブルのフィールドは全て含める ちょっと、条件の説明がわかりづらく感じるので、対象テーブルのモデルと得たい結果を 表現します。 【対象テーブル(単一テーブル)】 INDEX  コード  適用開始日  値 -------------------------------- 1     B0001 2010/10/01 A 2     B0001 2010/11/12 B 3     B0002 2010/09/01 A 4     B0002 2010/10/01 B 5     B0002 2011/01/01 C 6     B0003 2010/10/01 A 【得たい結果】 (現在の日付は2010/11/25とします) INDEX  コード  適用開始日  値 -------------------------------- 2     B0001 2010/11/12 B 4     B0002 2010/10/01 B 6     B0003 2010/10/01 A サブクエリ等を使ってみましたが、私のスキルだと上手くいきませんでした(;_;)。 このぐらいの処理になると、いつもプログラムで処理してましたが、 (VBやVBAでの処理なら、全然問題なく得たい結果を実現できます。) そのせいもあってか、一向にSQL文記述が上達しません。 パフォーマンスやステップ数低減、将来MS SQLServerへのマウントする意向もあり どうしても、一回のSQL発行でこの抽出を実現したいのです。 皆様、ご教授の程、宜しくお願いします。

  • SQLで乱数を使った取得の工夫

    お世話になります。 ID,name,point 1.りんご.30 2.みかん.22 3.いちご.18 4.バナナ.13 5.すもも.4 6.マンゴー.1 上記のようなデータがある場合、pointが高いほど 選ばれ易くするようなSQLを記述したいのですが、 その方法をお教えいただけないでしょうか。 ただのランダムであれば、『SELECT * FROM テーブル名 WHERE ID=abs(random()%全レコード数(この場合は6)+1』と すれば、均等にランダムで拾えますが、これを1のりんごのIDほど 取得しやすく、6のマンゴーほど発生しにくくするといった感じです。 以上、よろしくお願いいたします。

  • SQL、oracleにて文字列操作(連結、切りだし)のパフォーマンス向上法

    oracle7を使用しています。 #desc a num  char(8) code char(2) seq char(2) ・・・ #desc b bango char(12) ・・・ 上記場合で aのnum,code,seq を結合したものと bのbangoが 同じかどうかの検索を外部結合付きで行いたいとします。 where bango(+) = num || code || seq で動作は正常に行われるのですが、検索速度がかなり重くなってしまいます。 文字列連結(||)は重くなるというのを聞いたことがあるのでできれば (||)を使用したくないのです。 where substr(bango,0,8) (+) = num and substr(bango,9,2) (+) = code and substr(bango,11,2) (+) = seq とすると外部結合のところでおこられちゃいました。 文字列連結をつかわずに上記SQLの検索パフォーマンス向上法を どなたか教えていただけませんか?

  • チューニング対象のSQLの見つけ方・「遅い」SQLの目安

    質問はずばり、SQLを「遅い」と判断する具体的な処理時間・判断基準は? です。前提は比較的単純なSELECT文とさせてください。 パフォーマンスチューニングする際などにはSTATSPACK reportをみてとりあえず 1回あたりの処理時間が遅いSQLやStatement Totalの 処理時間が長いSQLを ターゲットにしていくものだと思います。 しかし極端な話、単に上位といってもトップのSQLの処理時間が1msec以下だったらそもそも パフォーマンスチューニングは一切必要ないはずです。 逆にTOP10以下でも単純なSQLなのに1秒以上処理時間のかかるものが多数あった場合には 何か問題があるはずと考えチェックしていくべきだと思います。 もちろん、データ数や結合テーブル数・条件の複雑さによって一概には言えないことはわかります。 しかし、大体の目安というものはあるべきかと思います。 私のなんとなくの判断基準は 「軽めのものは0.03秒程度、重めでも0.2秒程度」かなーと思っています。 経験的なものでまったく根拠はありません。経験も大してありません。 なので、もう少し根拠のある数字もしくはもう少し経験のある方のご意見 を伺いたいと思い質問させていただきます。 よろしくお願いします。

  • バッチ処理でレコード数が多いテーブルの結合について。

    バッチ処理でレコード数が多いテーブルの結合について。 300~500万件程度のテーブルが二つあり、これを結合して情報を取得したいと考えています(両者は1:1ではなく、ない場合も正常な構成です)。 またこの二つのテーブルはレコードを履歴として保持しており、ある時点の最新のレコードを取得する必要があります(PKの内、ある1項目がMAXなものを取得する想定)。 件数が件数なのでまともな時間で返ってくるかという懸案があり、どのように実装を進めればパフォーマンス問題のリスクを抑えられるかを考えています。 SQLでjoinせずにテーブルをある時点の最新のレコードを別々に取得して、javaの処理でループして結合するなど・・・。 何かよい方法がありましたらアドバイス頂けないでしょうか。

    • ベストアンサー
    • Java