2 ogrenosakini ogrenosakini 于 2016.04.02 08:56 提问

新人求助 关于 left join添加索引

情况是left join 进来的T4,T5,T6 导致sql文太慢,大概60s。
因为才接触sql文没多久,对于这个不是很懂,百度了一下没有找到合适的资料,特来求助。望大神给予详细解答。非常感谢。

SQL如下:
SELECT *
FROM T1
INNER JOIN T2
ON T1.×× = T2.××
INNER JOIN T3
ON T2.×× = T3.××

LEFT JOIN T4
ON T1.○○ = T4.○○
LEFT JOIN T5
ON T1.○○ = T5.○○
LEFT JOIN T6
ON T1.○○ = T6.○○
AND T6.CD = 01

INNER JOIN T7
ON T2.△△ = T7.△△
INNER(SELECT DISTICT T82.×○
FROM T81
INNER JOIN T82
ON T81.×× = T82.××
WHERE EC_NO = 'DA2846')T9
ON T1.△△ = T9.△△
WHERE T3.FOM_STS BETWEEN 1 AND 3
AND T7.EC_NO = 'DA2846'
GROUP BY ......

3个回答

oyljerry
oyljerry   Ds   Rxr 2016.04.02 09:31

join on中的几个列是否都建立了索引

ogrenosakini
ogrenosakini 没有的~都没有建立索引~
一年多之前 回复
cxsmarkchan
cxsmarkchan   2016.04.02 09:38
  1. left join后的结果无法建立索引,但你可以对每个表参与join的字段建立索引。
  2. 你这个语句有大量连接操作,而且含有外连接会生成很大的表,所以比较慢。建议你先进行选择操作,再连接。例如你的条件中含有对T3和T7的判断语句,这两个判断语句可以直接放在对T3和T7的连接上,减少生成的表的大小,而不要放在所有表都连接到一起后再选择需要的数据。
cxsmarkchan
cxsmarkchan 回复ogrenosakini: 如果你确实不需要t4/t5/t6中的全部内容,一般的思路就是先确认你需要什么内容,然后把t4替换成(select * from t4 where ...) as tt4这样。也就是把t4替换成更小的表。
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复ogrenosakini: 如果你在连接的时候没有选择语句的话,那没什么办法,因为你生成的表就是要包含t4,t5,t6的每一项。但我最后也没看到你用t4,t5,t6中的任何内容啊。
一年多之前 回复
ogrenosakini
ogrenosakini 谢谢你的解答。但是还有一个问题就是在left join t4,t5,t6的时候,这3张表被full access了,导致时间比较长,话说这个有办法优化么?
一年多之前 回复
ogrenosakini
ogrenosakini 回复cxsmarkchan: 还有一个问题是在left join t4,t5,t6的时候,这3张表被full acces
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复ogrenosakini: 是这个意思,建议打上括号,清晰一些。例如INNER JOIN T3 ON (T2.×× = T3.×× AND (T3.FOM_STS BETWEEN 1 AND 3))
一年多之前 回复
ogrenosakini
ogrenosakini 直接放在对T3和T7的连接上?是写成INNER JOIN T3 ON T2.×× = T3.×× AND T3.FOM_STS BETWEEN 1 AND 3这个意思么?
一年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.04.02 15:02

left join
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!