• 締切済み

SQL分のコツ

INTERBASEを利用しているのですが、あるバッチ処理用のSQLが膨大にCPUを消費してしまい、ほかのプロセスに影響を与えています。 1文で3つのテーブルを参照しつつ、MAXを4項目、副問い合わせも2か所しているので、負荷がかかるのはわかっているのですが。。。 SQLの構文の書き方でパフォーマンスを向上させるテクニックがあればお教え下さい。

みんなの回答

回答No.1

質問が曖昧すぎます。 >1文で3つのテーブルを参照しつつ、MAXを4項目、副問い合わせも2か所 その程度のSQLは、普通に使用されます。 具体的なアドバイスを受けたいなら、もっと具体的な内容を記載する必要があります。 少なくとも、以下のような項目の提示は必須です。 (1)表の構成列  少なくとも表の結合など条件指定している列、MAX値、副問い合わせ で条件指定している列 (2)どういうインデクスを定義しているか (3)母体データは何件で、何件くらいを抽出しようとしているか (4)order byやgroup byの指定の有無 →できれば、SQLそのものをできるだけ記載

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパ

    Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパフォーマンス向上 Oracleで1つのSQL内で同じテーブルを2回以上結合すると結果出力にかかる時間が非常に遅くなります。 例: SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id (テーブルBを2回結合している) こういう場合にパフォーマンスを落とさない方法はありますか?テンポラリテーブルでテーブルBのレプリカを作成して使用するというのはなしです。あくまで1つのSQLで結果出力できることを前提にパフォーマンスを向上する方法を教えてください。

  • 1SQLで書けないものでしょうか

    初めて投稿します。 よろしくお願いします。 現状、下記の様な構成のテーブルがあります。 DB :oracle9iR2 テーブル名:test 名前 型 ------- ------------- key_data VARCHAR2(10) rireki DATE read_data VARCHAR2(10) プライマリキーは、key_dataとrirekiです。 この、データの中から、key_data毎に最新のrirekiの情報だけを 取得したいと考えています。 そこで、下記の様にクエリーを組んでいたのですが、 select key_data, rireki, read_data from test inner join ( select key_data, max(rireki) AS rireki from test group by key_data ) test2 on (test.key_data = test2.key_data and test.rireki = test2.rireki) 複数のテーブルが、上記の様なキー項目と履歴を持つ形で 構成されている為に、複数のテーブルを結合すると途端に パフォーマンスが落ちて困っています。 ひょっとしたら、oracleなら分析関数か何かで1SQLで書けないものか (それで、処理速度が向上出来れば)と云うことで、自分で調べて みましたが、良い方法が見つかりません。 同様のお悩みをもたれた方で、対処法がありましたら教えていただけると幸いです。 よろしくお願いいたします。

  • oracleからSQL Serverへの移行

    oracleからSQL Serverへ移行することになったのですが、副問い合わせで定義したテーブル同士を外部結合するSQL構文が、うまく実現できず、ご教授して頂きたくよろしくお願いします。 下記、oracle 構文をSQL Server構文へ書き換えたい。 select * from (select cal1,cal2,cal3 from tbl1,tbl2 where cal1 >100) aaa, (select cal1,cal2,cal3 from tbl1,tbl2 where cal1 <=100) bbb, tbl3 where aaa.cal1 = bbb.cal1(+) and aaa.cal2 = bbb.cal2(+) and aaa.cal3 = bbb.cal3(+) and aaa.cal1 = tbl3.cal1 よろしくお願いします。

  • Oracleでルールベースでの複合索引

    数十万件のデータをバッチ処理を行っているのですが、パフォーマンスが悪く困っています。 その原因となりそうな部分について質問します。 テーブルAに複合索引を作ります。 create unique index uk_A on A(AA,AB,AC,AD); このテーブルに検索をかけます。そのときにWhere句に書く列の順序は、パフォーマンスには関係ないのでしょうか? select max(AD) from A where AA=1 and AB=2 and AC=3; としたときと select max(AD) from A where AC=3 and AB=2 and AA=1; としたときの、パフォーマンスの違いです。 このバッチ処理の中で、Aのテーブルに多数のデータを追加するために、コストベースにはできません。また、このSQL文は、プロシージャの中で使用しています。 範囲検索の場合のことは、講習でもあったのですが、等価結合のことは出てきませんでした。 どなたかご存知の方宜しくお願いします。

  • ADOからSQLのEXISTSの結果(もしくは変数)を取得

    ASPからADOを使用して、SQLサーバー上のデータを参照する場合に、通常SQLステートメントを Connection::Execute() に渡して、レコードセットを受け取るのが普通だと思いますが、たとえば、EXISTS() の結果(有るか無いか)を取得することは出来ないでしょうか。 代替え案として、SELECTを行い、レコードセットの件数が0か否かで判断することも出来るとは思いますが、もしテーブルが膨大であった場合や、結果が膨大であった場合に、総当たり判定コストや通信コストがかかってしまうのを懸念しています。 また、それ以外にSQL中で使用した変数の内容をADO側に渡す方法は有るのでしょうか。(これが出来れば問題ないのですが、、、) 結果用のテーブルを作成して、そこからSELECTしてレコードセットで返す。位しか思いつきません。 宜しくお願いいたします。 開発環境は: Windows 2000 Server / IIS 5.0 / ASP Microsoft SQL Server 2000 and 7.0 Microsoft Internet Explorer 6.0sp1

  • (初心者です)パフォーマンスの良いSQLの書き方

    SQL初心者です。初歩的かもしれませんが 教えていただけると助かります。 社員情報を管理するマスタテーブル『MST』(PKはSHAIN_ID)、 社員のシステムログイン履歴をログとして残すテーブル『LOG』 (PKはSEQのみ、SHAIN_IDとLOGIN_DATEを持つ) があります。 社員ごとに最新のログイン日付を表示するとき、 以下のようなSQLを書いたところ「パフォーマンス上あまりよくないSQL」 と言われてしまったのですが、どのように改善すればよいでしょうか? ------------------------------------------ SELECT MST.SHAIN_ID,     MST.SHAIN_NAME,     LOG.LOGINTIME FROM  MST,    (SELECT LOGINUSERID,        MAX(LOGINDATE) LOGINDATE     FROM LOG     GROUP BY SHIAN_ID    ) LOG WHERE MST.SHAIN_ID = LOG.SHAIN_ID ORDER BY    MST.SHAIN_ID ------------------------------------------

  • SQLの外部結合について教えて下さい

    いつもお世話になっています。 SQL構文の外部結合が分らなくて困っています。 どうか教えて下さい。 JSPからString Nam = (request.getParameter("param"));で値を受け取ってその値でT_Tableと一致するデータのSQLを実行します。 SELECT * FROM T_Table where ID='"+ Nam +"' order by 日付 desc この結果とT_TableAの「番号」というフィールドと一致する問い合わせのSQLが分りません。自分なりに考えて作りましたがHTMLの部分の表示だけでレコードが表示されないので間違っているのだと思います。 色々調べてみましたが該当のサンプルがなかったので困っています。 教えて下さい!宜しくお願い致します。 【自分で作成してみたSQLです】 テーブルはSQL Serverです。 "SELECT * FROM T_Table where ID='"+ Nam +"' INNER JOIN where ID='"+ Nam +"' ON [T_Table].[番号] = [T_TableA].[番号] order by 日付 desc"

    • ベストアンサー
    • Java
  •  お世話になっています。SQLについての質問です。

     お世話になっています。SQLについての質問です。  VB.netでACCESSに接続しデータベースを参照しているのですが "select max([項目1]) AS N_MAXKEY from [テーブル1]" を実行した際、N_MAXKEYの値をGetInt32(0)で取得できませんでした。 N_MAXKEYの値をどのように取得するか方法をご享受ください。宜しくお願いします。 以下、作成したソースコードの一部です。尚、[項目1]は整数型で設定されています。 ======================== Public G_DATABASES As System.Data.OleDb.OleDbConnection  ~(省略)~ Dim wrk_sql As String 'SQL 文字列変数 Dim cmnd As New System.Data.OleDb.OleDbCommand Dim dr As System.Data.OleDb.OleDbDataReader Dim intTest As Integer = 0  ~(省略)~  wrk_sql = "select max([項目1]) AS N_MAXKEY from [テーブル1]"    cmnd.Connection = G_DATABASES  cmnd.CommandType = CommandType.Text  cmnd.CommandText = wrk_sql  dr = cmnd.ExecuteReader()  intTest = dr.GetInt32(0) ’値を取得できない(´・ω・`) ========================

  • SQL Serverのメモリ設定

    現在MS SQL Server7.0を使用したDBサーバを運用しています。 CPU4ユニット、物理メモリ1GBを搭載しているのですが、先日 テーブル更新バッチ(8万件処理)を実行中に異常終了してしまいました。 タスクマネージャに表示されていた利用可能メモリが9MBしかなく、 SQLServerのメモリ使用量が883MBになっていたため、メモリ不足の ためバッチがダウンしたという判断をしました。実際のところ SQL Serverのメモリ設定(動的設定)が4MB~885MBの間で設定して ありました。これはおそらく、SQLServerインストール時に自動設定 されたものだと思われますが、他アプリケーションのパフォーマンスを 著しく劣化させているためメモリ設定の最大値を支障が出ない程度に 下げたいのですが、どの程度下げればよいのか数値がなかなか導き出せ ません。何かよい方法(計算方法など)をご存知の方がいらっしゃれば ば教えていただけないでしょうか。 よろしくお願いいたします。 サーバ構成 Fujitsu Primergy CPU P(3)866 ×4 メモリ:1024MB HDD:40×4 OS:WINDOWS NT Enterprise Edition SQL:Microsoft SQL Server 7.0

  • asp sqlのselect文について

    asp記載は strSql = "Select * From dbo.テスト(テスト) Where 日付='20110324'" objSr.Open str.Sql,objCon.3 ※上記構文前にConnecting.StringやOPENは定義済みです。また、objSrはレコードセットで定義済みです。 質問内容は、このまま実装すると SQLServerエラー(80040e14) '('付近に不適切な構文があります。 と表示されます。 自分が調べたところ、テーブル名が「dbo.テスト(テスト)」で一部全角カッコがあるるので、 エラーになったのだと思われます。 ちなみに全角カッコではないテーブル名の参照は可能でした。 全角カッコを認識させるにはどうしたらよいでしょうか? [dbo.テスト(テスト)]は試しましたが([ ]で囲む) オブジェクト名dbo.テスト(テスト)が無効ですと表示され、エラーとなりました。 ご教授をお願いいたします。