2

私は3つのテーブルを持っています

  • glSalesJournal
  • HMISAdd
  • HMISMain

今私がやろうとしているのは、さまざまなフィールドとグループ化して結果をglSalesJournalに挿入しながら、HMISAddamtを使用してglSalesJournalamtを追加することです。

glSalesJournalには633173レコードが含まれています

HMISAddには4193レコードが含まれています

HMISAddとglSalesJournalには、同じ列が含まれています。

  • loc
  • glAcct
  • glSubAcct
  • batchNbr
  • ContractNbr
  • amt

テーブルにインデックスを追加しましたが、結果は同じです。

これが私のコードです:

INSERT INTO hmismain
            (loc,
             glacct,
             subacct,
             batchnbr,
             contractnbr,
             amt)
SELECT glsalesjournal.loc,
       glsalesjournal.glacct,
       glsalesjournal.glsubacct,
       ( glsalesjournal.amt + hmisadd.amt ) AS sumAmt,
       glsalesjournal.batchnbr,
       glsalesjournal.salescontnbr
FROM   glsalesjournal
       LEFT OUTER JOIN hmisadd
                    ON ( glsalesjournal.loc = hmisadd.loc
                         AND glsalesjournal.glacct = hmisadd.glacct
                         AND glsalesjournal.glsubacct = hmisadd.subacct
                         AND glsalesjournal.batchnbr = hmisadd.batchnbr
                         AND glsalesjournal.salescontnbr = hmisadd.contractnbr )
GROUP  BY glsalesjournal.loc,
          hmisadd.loc,
          glsalesjournal.glacct,
          hmisadd.glacct,
          glsalesjournal.glsubacct,
          hmisadd.subacct,
          glsalesjournal.batchnbr,
          hmisadd.batchnbr,
          glsalesjournal.salescontnbr,
          hmisadd.contractnbr

スクリプトの実行にかかる時間は2時間以上です。レコードを100に制限しても、かかる時間は同じです。

誰かがスクリプトを最適化する方法を教えてもらえますか?

ありがとう

4

2 に答える 2

2

1) 1 回限りのクエリのようですが、これでよろしいですか? そうでない場合は、毎回同じデータを hmismain テーブルに挿入しています。2) 2 つの別々
のテーブルの フィールドをグループ化しているため、インデックス作成の量は役に立ちません。役立つ唯一のインデックスは、これら 2 つのテーブルを同じ方法でリンクするビューのインデックスです。

さらなる注意:
ポイントは何ですか

      GROUP  BY glsalesjournal.loc,
      hmisadd.loc,
      glsalesjournal.glacct,
      hmisadd.glacct,
      glsalesjournal.glsubacct,
      hmisadd.subacct,
      glsalesjournal.batchnbr,
      hmisadd.batchnbr,
      glsalesjournal.salescontnbr,
      hmisadd.contractnbr

同じフィールドでデータを2回グループ化しています
glsalesjournal.loc, hmisadd.loc
glsalesjournal.glacct, hmisadd.glacct,
...

GROUP BY から重複を削除すると、高速に実行されるはずです

于 2012-08-21T09:16:43.103 に答える
0

このフィールドにインデックスを追加しましたか:

glSalesJournal.loc
glSalesJournal.glAcct
glSalesJournal.glSubAcct
glSalesJournal.batchNbr
glSalesJournal.salesContNbr
HMISAdd.Loc
HMISAdd.GlAcct
HMISAdd.SubAcct
HMISAdd.batchNbr 
HMISAdd.contractNbr

このフィールドがインデックス化されていない場合、個々のレコードごとにフルテーブル スキャンが実行されるため、パフォーマンスが低下します。

MySQL インデックス作成構文

于 2012-08-21T09:00:30.737 に答える