高分请教这个SQL语句为什么会运行很久?

0
select 
H.RENO,
B.NAME,
H.RBNO,
H.ENO,
A.NAME,
H.BNO
from
HTABLE H
join
NAMETABLE A
on
(A.NUM = 2 and
H.ENO = A.ENO and
H.RENO <> A.ENO)
join
NAMETABLE B
ON
(H.RENO = B.ENO)
ORDER BY
H.RENO,
H.RBNO
执行上面的SQL语句之后就一直在运行,得不出结果。
表NAMETABLE里面有2万条符合“NUM = 2”的记录。但是如果NAMETABLE里的记录减少到300条的话就可以查询出数据。或者把A.NUM = 2去掉也可以得出数据。
请问该如何解决这个问题?
已邀请:
1

老头子 - 专注是唯一的捷径 2015-10-19 回答

按照你的描述
-----

表NAMETABLE里面有2万条符合“NUM = 2”的记录。但是如果NAMETABLE里的记录减少到300条的话就可以查询出数据。或者把A.NUM = 2去掉也可以得出数据。


-----
初步猜测是NUM字段是有索引的,但是由于错误的统计信息导致索引评估失败,尝试加上下面这个hint再执行试试,如果不行建议你把执行计划发出来。
select /*+ full(A)*/
H.RENO, B.NAME, H.RBNO, H.ENO, A.NAME, H.BNO
  from HTABLE H
  join NAMETABLE A
    on (A.NUM = 2 and H.ENO = A.ENO and H.RENO <> A.ENO)
  join NAMETABLE B
    ON (H.RENO = B.ENO)
 ORDER BY H.RENO, H.RBNO
 
 
0

- 取是能力,舍是境界 2015-10-18 回答

在Oracle中写SQL的时候要特别注意数据类型,要显式的保持数据类型一致,如果A.NUM是字符类型那一定要写成A.NUM = '2'

要回复问题请先登录注册