SELECT msg_id,message from msg where state='sd' and msg_id in
(select msg_id from ct where type='10' and msg_id=msg.msg_id);我想问select msg_id from ct where type='10' and msg_id=msg.msg_id这一句的
msg_id=msg.msg_id这个条件是两个表的整个数据都比较还是只限定在msg.state='sd' 这些数据的比较?

解决方案 »

  1.   

    sql语句应该是 从下往上 从右往左 执行的
    所以 msg_id=msg.msg_id这个条件应该是两个表的整个数据都比较的
      

  2.   

    OracleDBA群35903017,欢迎加入。
      

  3.   

    按照从右向左的原则,应该是整个表都比较的,对于这类语句我一般是这样写
    SELECT msg_id,message from msg where msg_id in
    (select msg_id from ct where type='10' and msg_id=msg.msg_id)
    and state='sd'
      

  4.   

    按照从右向左的原则,应该是整个表都比较的,对于这类语句我一般是这样写
    SELECT msg_id,message from msg where msg_id in
    (select msg_id from ct where type='10' and msg_id=msg.msg_id)
    and state='sd' 这位老兄这个是个很好的优化方法.
      

  5.   

    虽然sql语句应该是 从下往上 从右往左 执行的,但是可以比较这两句sql的执行计划,其实是一样的,无论怎么写其实执行起来还是会限定在msg.state='sd' 这些数据的比较。
      

  6.   

    楼上的兄弟说的不怎么对吧!
    的确是限定在msg.state='sd'中,由于先执行限定在msg.state='sd'将大大提高SQL的查询速度.
    我还是比较同意vokeyliu的做法.
      

  7.   

    我试过放前放后速度都一样,我还是比较同意preciouszhao(土土) 的看法
      

  8.   

    看基于什么规则的优化器?
    如果是基于规则的,2种应该是有差异的。我觉得。
    SELECT msg_id,message from msg where state='sd' and msg_id in
    (select msg_id from ct where type='10' and msg_id=msg.msg_id);
     改成
    SELECT msg_id,message from msg where msg_id in
    (select msg_id from ct where type='10' and msg_id=msg.msg_id) and  state='sd' ;
     就可以了吧
      

  9.   

    要看该表上的索引结构,要看cbo 最后选择的执行计划