使用3个表优化SQL查询
我有一个SQL查询,我运行了超过2个小时,不得不停止它,因为它需要很长时间。有人能给我一些建议来优化这个查询吗使用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,
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;