2

我有三张桌子

  • glSalesJournal
  • HMIS添加
  • HMISMain

现在我要做的是添加 glSalesJournal amt 与 HMISAdd amt 同时与各种字段分组并将结果插入 glSalesJournal

glSalesJournal 包含 633173 条记录

HMISAdd 包含 4193 条记录

HMISAdd 和 glSalesJournal 包含相同的列,它们是

  • 位置
  • glAcct
  • glSubAcct
  • 批次Nbr
  • 合同Nbr
  • 上午

我在表中添加了索引,结果仍然相同。

这是我的代码:

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)看起来这是一个一次性的查询,我在这里正确吗?如果不是,您每次都将相同的数据插入 hmismain 表中。
2)您正在对来自两个单独表的字段进行分组,因此再多的索引也无济于事。唯一有帮助的索引是以相同方式链接这两个表的视图上的索引。

进一步说明:
有什么意义

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

您正在按相同的字段对数据进行两次分组
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 回答