• 締切済み

SQLの性能

クエリアナライザで実行すると30秒くらいかかるようなSQLがあるのですが、修正の余地について教えてください。 抽出元となるテーブルのレコード数が多くても、クエリの書き方やインデックスの張り方で速くなるのは知っていますが、限界はないのでしょうか? 単純に抽出元となるテーブルのレコード数が多いことが原因なのか、クエリやインデックスが原因なのかを判断する方法を教えてください。

みんなの回答

  • sakko99
  • ベストアンサー率63% (19/30)
回答No.1

「実行プランの表示」ではどうですか?

参考URL:
http://www.microsoft.com/japan/msdn/enterprise/pag/scalenethowto04.asp
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQLの性能に関して

    SQLの初心者です。 質問がわかりずらかったら申し訳ありません。Oracleを使用してます。 多くのSQL文(約1000個)と、そのSQLでアクセスしたテーブルが保持しているレコード件数、さらに処理時間がかかれた資料があります。 取得できたレコード件数の資料はありません。 これらの資料を元に、SQLの性能は何に相関があるか(例えばjoinの数など)回帰分析を用いて調べようとしてます。 join数以外に、処理時間と何を比較すれば、相関が出そうですかね? また、変数を増やして重回帰分析も考えてます。 比較対象のアドバイスをお願いします。

  • アクセス VBA クエリSQL文変更

    以前、教えていただいたにもかかわらず、作業が上手くいったことで、理解を深めることを疎かに してしまい、一部を修正したところ、わからなくなってしまいました。 申し訳ございませんが、教えてください。 Xと同一の構成である X1~という複数のテーブルから一つを選択して、クエリYを実行 クエリYは、フィールド1の値が BBBであるレコードの、フィールド1、3、5を抽出 Dim dbs As DAO.Database Dim qrdef As DAO.QueryDef Set dbs = Currentdb Set qrdef = dbs.QueryDefs("クエリY") qrdef.SQL = Replace(Expression:=qrdef.SQL _         , Find:="テーブルX" _         , Replace:="テーブルX1" _         , Compare:=vbTextCompare) Set qrdef = Nothing Set dbs = Nothing 実行時エラー3075  クエリ式'テーブルX1.フィールド1'の構文エラー:演算子がありません デバッグ qrdef.SQL = Replace(Expression:=qrdef.SQL _         , Find:="テーブルX" _         , Replace:="テーブルX1" _         , Compare:=vbTextCompare) 元となるクエリを直接実行すると正しく動作します。

  • osqlからのsql実行方法について

    Windows20003のSQL Server2000の環境で、あるテーブルのインデックスを指定して統計情報を更新する処理のバッチ化を考えており、osqlを使用すれば可能な所までは調査出来たのですが、、、 osqlから、SQL文をオプション"Q"にて実行する場合、例えばテーブル名 or インデックス名に「~」等の特殊文字を含む場合、そのまま実行するとシンタックスエラーとなり実行出来ませんでした。 テーブル名 or インデックス名に「~」等の特殊文字を含む場合の実行方法をどなたか御教授御願い出来ないでしょうか。。。 因みに、オプション"i"でsqlファイルを作成して実行しても、sql文に特殊文字があった場合はシンタックスエラーとなりました。 Query Analyzerでは、インデックス名を「"」囲み実行すれば、正常に処理される事は確認済みです。 【実行方法】 osql -E -S <サーバ名> -d <DB名> -Q "UPDATE STATISTICS <テーブル名> <インデックス名> WITH FULLSCAN"

  • MSアクセスのクエリで結果がおかしい

    アクセス2000で追加クエリを作成していますが、 クエリのデータシートビューで確認したレコードと 追加されたテーブルで確認したレコードが異なり、テーブルのデータが少なくなってしまっています。 条件としては、 クエリの参照元 SQLサーバからのリンクテーブル(レコード数で13万件程度) 追加先のテーブルはローカルのmdb内です たまたまかもしれませんが、今テストしているデータは、 クエリ上では、19件あるものの、実行しても9件しか追加されません。 原因としてありそうなものがわかる方がいれば、よろしくお願いします。

  • mysql_queryの処理速度が遅い

    PHP+MySQLでプログラミングをしているのですが、実行時にmysql_queryの処理に時間がかかっています。状況は以下の通りです。 ・処理時間を計測するとmysql_queryの実行に15秒程度かかっています。 ・Webminで直接同じSQL文を実行すると1秒程度で終わります。 ・SQLのコマンドは単純なUPDATEです。 ・indexは設定してあります。 ・DBに格納してあるレコード数は数100件程度です。 ・optimizeは実行してみましたが、あまり効果はありませんでした。 お聞きしたいのはWebminで実行すると1秒程度で終わるSQL文がmysql_queryで実行すると、なぜ時間がかかるのかということです。 mysql_queryで時間がかかる原因およびmysql_queryの処理時間を短縮する方法などがあれば教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルに書かれたSQLの実行方法(oracleとの違い)

    お世話になります。 SQLServer2000、クエリアナライザで質問があります。 ファイルに書かれた一連のSQLの実行したいとき、 ORACLEでは、SQL*PLUSから ファイル名の前に@をつけて実行できました。 また、SQLスクリプトの中で、別のSQLスクリプトを呼び出す場合は、@@を付ければできました。 このような事を、クエリアナライザから行いたい場合、どのようにすれば可能でしょうか? よろしくお願いします。

  • 絞込みする時のSQLの書き方

    お世話になります。 絞込みする時のSQLの書き方について教えてください。 具体的には テーブル名tbl01,フィールド名f01,f02とした場合 1.f01もしくはf02にAという文字を含むレコードを抽出。 SQL = "select * from tbl01 where f01 like '%A%' or f02 like '%A%'" 2.続いて、1で抽出したデータからf01もしくはf02にBという文字を含むレコードを抽出するSQL文 SQL = ????? あくまでも、1と2を満たす条件を1つのSQL文で表す方法です。一旦、1の結果をワークテーブルに落とし、そこから2だけのSQL文を実行するわけではありません。

  • SQLについて

    レコード1 |レコード2 |レコード3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、レコード1のAAAとBBBは値をそのまま抽出し レコード1のDDDはレコード2とレコード3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? レコード2とレコード3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。

  • Accessのsql(ロジック)について伺います

    Access mdb内でローカルDB(ADO)へSQL接続を行うプログラムを組んでおります。 ■テーブル:マスタTBL | 年 | 月 | 日 | 時 | 分 | 秒 | コード | +---- +-- +-- +-- +--+---+------+ | 2013 | 10 | 31 | 10 | 05 | 20 | A1234 | | 2013 | 10 | 31 | 10 | 10 | 00 | B1234 | | 2013 | 11 | 01 | 00 | 00 | 01 | A1234 | | 2013 | 11 | 01 | 00 | 00 | 01 | A1234 | | 2013 | 11 | 01 | 00 | 00 | 01 | A1234 | | 2013 | 11 | 22 | 05 | 10 | 09 | C1234 | | 2013 | 10 | 31 | 00 | 10 | 00 | B1234 | | 2013 | 10 | 31 | 22 | 46 | 55 | A1234 | ※後の作業都合上、日付も含めカラムは全て"文字列"です。 ※全カラム、nullは存在しません。 ※各レコードの格納順に統一性はありません。 ※動作環境はAccess mdb(Office 2007)/Windows7(32bit)です。 【最終的にやりたいこと】 マスタTBLより、最繁日3日分(同じ年月日のレコード数が多い上位3日分)を選定し、 更に時間別、かつコード別の件数を求める(.csv出力)のが最終目標です。 SQL一発でできれば良いのですが、私の力ではそれが組めないため2段階に分け、 第1段階として別の作業用TBLを作成し、まずそこに最繁日3日分を抽出&登録、 第2段階で作業用TBLに対して時間別・コード単位の抽出を行う段取りとしました。 ご質問は、第1段階を満たすSQLについてです。 【ご質問】 上記のテーブルがあるとします。 この中から、最繁日3日分(同じ年月日(時分秒は考慮不要)のレコード数が多い上位3日分)の全レコード(抽出には時分秒も必要)を抽出し、同設定の別テーブルへ登録したい。 と言うのがやりたい事なのですが、抽出するSQLが作れず困っております。 現group by設定をしてしまうと、Countさせて上位日数と件数は判明できますが、その全レコードを羅列させる事ができません。 抽出段階で考慮すべきは日付までなので、group byを考えて時分秒を省いてしまうと、その後秒単位で抽出が必要な第2段階が行えなくなってしまいます。 また時分秒をSELECTに指定してしまうと、group byでも時分秒を加えなくてはいけなくなり、「日付3日分で」が満たされなくなってしまいます。。。 現在、group by有りで作成済みのSQL、および出力結果例は下記の通りで、 全く先に進まなくなってしまいました.... [SQL] 'SQL作成 変数A = "INSERT INTO 登録したいTBL " _ & "SELECT 年,月,日,時,分,秒,コード,COUNT(*) AS CNT " _ & "FROM マスタTBL " _ & "group by 年,月,日,時,分,秒,コード " _ & "order by 年,月,日,時,分,秒,コード;" 'SQL実行 Call db.Execute(変数A) [実行結果例] ■テーブル:登録したいTBL | 年 | 月 | 日 | 時 | 分 | 秒 | コード | カウント | +---- +-- +-- +- -+- -+-- +----- +-------+ | 2013 | 10 | 31 | 10 | 05 | 20 | A1234 | 2 | | 2013 | 10 | 31 | 10 | 10 | 00 | B1234 | 2 | | 2013 | 11 | 01 | 00 | 00 | 01 | A1234 | 3 | | 2013 | 11 | 22 | 05 | 10 | 09 | C1234 | 1 | 現状では当然の出力結果ですが、本来出力したいのは、カウントが3件の3レコードと、 2件のレコード*2つ、合計7レコードを出力させたいと言う意味です。 (カウントは必要かと思ったので入れているだけで、仕様上は別に無くても良い物です。) また、とりあえずですが上記SQLが正しく実行され登録したいTBLへ格納される事は確認済みです。 やり方がそもそも間違えている可能性もございますので、その点も含めご指摘ございましたらお願い致します。 以上です。 ご提示できる条件が少なく申し訳ございませんが、ご回答頂ける方がいましたら、 ご教授をよろしくお願い致します。

  • SQLを発行とは?クエリの作成とは違うのですか?

    SQLを発行とは?クエリの作成とは違うのですか? アクセスしかわからない者です。 (SQLServerは無知) SQLを発行とか実行とかの言葉をよく目にしますが アクセスでテーブルを元に選択クエリを作成するのは 俗に言う「SQLを発行」でしょうか?