求解:存储过程动态拼接的SQL,有红色部分时,存储过程查询需要0.2S,没有时需要19S,而直接执行SQL有红色部分时是0.14S,没有红色部分时是1.4S……为什么SQL反而更快,怎么使存储过程查询没有红色部分时查询更快?

解决方案 »

  1.   

    这只是测试的时候用的呀,又不一定只有一个元素,我知道你还会说用exisits,但我现在说的是没有这个条件时慢
      

  2.   

    红色部分是不是建了索引,SQL运行是先从where条件开始过滤条件
      

  3.   

    这和where条件的执行顺序有关。ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接尽量写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件尽量写在WHERE子句的末尾。
      

  4.   

    那确实,exist后面是权限管理拼了出来的语句(给一个用户授权看他能查询哪些产品出来)
      

  5.   


    这个得看赋给的权限了,exist后面是权限管理拼了出来的语句(给一个用户授权看他能查询哪些产品出来),红色部分是产品种类,所以……
      

  6.   


    这个得看赋给的权限了,exist后面是权限管理拼了出来的语句(给一个用户授权看他能查询哪些产品出来),红色部分是产品种类,所以……
    可能是我说的不清楚,首先我是说,你添加了 in (203) 之后,会过滤掉很大一部分数据,参与join的数据量变小,所以会比之前快很多。其次,从优化角度,有几点建议你可以考虑一下:
    (1)列查询语句考虑是否可以用decode替代;
    (2)考虑exists是否可以用表连接替代;
    (3)如果表中数据量差别很大,建议将大表放在小表之前(这是因为from的从右向左解析规则);
      

  7.   


    这个得看赋给的权限了,exist后面是权限管理拼了出来的语句(给一个用户授权看他能查询哪些产品出来),红色部分是产品种类,所以……
    可能是我说的不清楚,首先我是说,你添加了 in (203) 之后,会过滤掉很大一部分数据,参与join的数据量变小,所以会比之前快很多。其次,从优化角度,有几点建议你可以考虑一下:
    (1)列查询语句考虑是否可以用decode替代;
    (2)考虑exists是否可以用表连接替代;
    (3)如果表中数据量差别很大,建议将大表放在小表之前(这是因为from的从右向左解析规则);
    这个得看赋给的权限了,exist后面是权限管理拼了出来的语句(给一个用户授权看他能查询哪些产品出来),红色部分是产品种类,所以……
    可能是我说的不清楚,首先我是说,你添加了 in (203) 之后,会过滤掉很大一部分数据,参与join的数据量变小,所以会比之前快很多。其次,从优化角度,有几点建议你可以考虑一下:
    (1)列查询语句考虑是否可以用decode替代;
    (2)考虑exists是否可以用表连接替代;
    (3)如果表中数据量差别很大,建议将大表放在小表之前(这是因为from的从右向左解析规则);谢谢大神,已经全面修改原来的权限拼接的方法,改在了表连接了其实我内心是拒绝的,这是 一个完成的上线的项目,这一刀下去,要测好久了,都不知道有哪些位子用了这……蛋蛋疼