使用3个表优化SQL查询

使用3个表优化SQL查询,sql,optimization,Sql,Optimization,我有一个SQL查询,我运行了超过2个小时,不得不停止它,因为它需要很长时间。有人能给我一些建议来优化这个查询吗 Tab1部件有300K条记录,但我认为“contact”表太大了。我将无法添加任何索引来优化性能,因为这是一次性的事情 SELECT Tab1.tradeType, Tab1.abuid, Tab1.JOBID, Tab1.uptime, Tab2.vendorName FROM (SELECT tt.NAME AS tradeType , abuid,

我有一个SQL查询,我运行了超过2个小时,不得不停止它,因为它需要很长时间。有人能给我一些建议来优化这个查询吗


Tab1部件有300K条记录,但我认为“contact”表太大了。我将无法添加任何索引来优化性能,因为这是一次性的事情

SELECT Tab1.tradeType,
  Tab1.abuid,
  Tab1.JOBID,
  Tab1.uptime,
  Tab2.vendorName
FROM
  (SELECT tt.NAME AS tradeType ,
    abuid,
    jo.ID         AS JOBID,
    jo.UPDATETIME AS uptime
  FROM Job jo,
    vendortradetype tt
  WHERE updatetime >= sysdate -365
  AND tt.id         = jo.SC_VENDORTRADETYPE
  AND contactabuid IS NOT NULL
  ) Tab1
JOIN
  (SELECT MAX(name) AS vendorName, abid FROM contact GROUP BY abid
  ) Tab2
ON Tab1.abuid = Tab2.abid;

我建议简化查询(以及使用适当、明确、标准、可读的
JOIN
语法):

就性能而言,您需要在
联系人(阿比德,姓名)
上建立索引

顺便说一下,使用此公式,您可以通过删除该列来检查
联系人
表是否存在问题


然而,查询看起来并不特别复杂。我怀疑问题在于
JOIN
条件的格式不正确(即不完整)。否则,可能会有其他查询锁定表。这会导致等待或复制表(取决于数据库),这会大大降低速度。

“我无法添加任何索引来优化性能,因为这是一次性的事情”-然后转述Bender的话“你疯了!”您已经有了什么索引?请发布您正在使用的表架构和DMB,好吗?@TimBiegeleisen:在某些情况下这是正确的,但在这种情况下并不令人信服。@Charlieface:在联系人表上,我有1)“abid”和一些其他字段的索引(但没有“name”)还有“name”和其他一些字段,我认为这些字段在这种情况下不会有多大帮助
SELECT tt.NAME AS tradeType, jo.abuid,
       jo.ID AS JOBID, jo.UPDATETIME AS uptime,
       (SELECT MAX(c.name)
        FROM contact c
        WHERE c.abid = jo.abuid
       ) as vendorName
FROM Job jo JOIN
     vendortradetype tt
     ON tt.id = jo.SC_VENDORTRADETYPE
WHERE updatetime >= sysdate - 365
      contactabuid IS NOT NULL;