【问题标题】:left join taking too long离开加入时间太长
【发布时间】:2020-10-19 10:53:03
【问题描述】:

我遇到了查询性能问题,不知道如何解决。

两个表都有 20k 行

table 1. prod_id, month, year, volume
1.       1        5      2020   4
2.       2        5      2020   5
...
    
table 2. prod_id, wh, share, month, year
1.       1        1   10%    5      2020
2.       1        2   10%    5      2020
3.       1        3   40%    5      2020
4.       1        4   40%    5      2020
...

Prod_id 类似于索引但不是主键,因为表 1 具有不同月份、年份等的重复项 我需要得到这样的表(table1 * wh = 80k 行):

table 3. prod_id, wh, month, year, new_volume
1.       1        1   5      2020  volume*share
2.       1        2   5      2020
3.       1        3   5      2020
4.       1        4   5      2020
5.       2        1   5      2020
6.       2        2   5      2020
...

我正在使用 LEFT JOIN 来执行此操作,但耗时 15 分钟以上,有什么想法可以改进此查询吗?

SELECT table1.prod_id, table2.wh, table1.month, table1.year, volume*share AS new_volume
FROM table1
LEFT JOIN table2 ON (table1.prod_id = table2.prod_id) AND (table1.month = table2.month) AND (table1.year = table2.year)

【问题讨论】:

  • 您是复制 SQL 还是将其输入到问题中?上面写着table2.rpod_id,有点奇怪。
  • 是的,对不起,我输入了

标签: sql ms-access


【解决方案1】:

对于这个查询:

SELECT table1.prod_id, table2.wh, table1.month, table1.year, volume*share AS new_volume
FROM table1 LEFT JOIN
     table2
     ON (table1.prod_id = table2.prod_id) AND
        (table1.month = table2.month) AND
        (table1.year = table2.year)

您想要在table2 上建立索引:

create index idx_table2_prod_month_year on table2(prod_id, month, year)

您还可以在select 中包含wh2 和来自table2 的任何其他列。

【讨论】:

  • 我应该在table1中添加相同的索引吗?如果没有,我不知道如何正确编写查询......或者只是足以添加此索引并保存相同的查询?
  • 看起来有助于添加该索引。非常感谢
  • @VladBalan 。 . .我重新格式化查询,以便更轻松地阅读它们。这减少了(但遗憾的是并没有消除)无意的错误。一般来说,我建议整齐地格式化所有代码并要求生产代码。
猜你喜欢
  • 2011-07-03
  • 2011-07-03
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2012-04-17
  • 2017-05-02
相关资源
最近更新 更多