sql1select MAIN_DOMAIN, ALEXA_RANKING, site_name, SITE_TYPE, CONTACT
  from (select MAIN_DOMAIN,
               ALEXA_RANKING,
               site_name,
               SITE_TYPE,
               CONTACT,
               spare_num,
             row_number() over(partition by MAIN_DOMAIN order by MAIN_DOMAIN) rn
          from site_alexa)
 where rn = 1
   and spare_num = 0
   and ALEXA_RANKING >= '0'
   and ALEXA_RANKING <= '1000000'
 order by ALEXA_RANKING desc
sql2
select distinct MAIN_DOMAIN, ALEXA_RANKING, site_name, SITE_TYPE, CONTACT
  from site_alexa
 where 1 = 1
   and spare_num = 0
   and ALEXA_RANKING >= '0'
   and ALEXA_RANKING <= '1000000'
 order by ALEXA_RANKING desc
 总记录:526130
索引:
DOMAIN  域名
 MAIN_DOMAIN  主域名
我一直以为分析函数 row_number()会比distinct快,但这一两个sql ,distinct更快1秒多
sql1 要3秒多,sql21秒多

解决方案 »

  1.   

    执行计划呢?
    sql1用了个inline view。
      

  2.   

    但要用row_number()肯定会用到内联视图
      

  3.   

    sql1执行计划:SELECT STATEMENT, GOAL = RULE Optimizer=RULE
     SORT ORDER BY
      WINDOW NOSORT
       VIEW
        WINDOW SORT PUSHED RANK
         TABLE ACCESS FULL sql2执行计划
    SELECT STATEMENT, GOAL = CHOOSE Optimizer=CHOOSE
     SORT UNIQUE
      TABLE ACCESS FULL
      

  4.   

     sql2 rule执行计划:SELECT STATEMENT, GOAL = RULE Optimizer=RULE
     SORT UNIQUE
      TABLE ACCESS FULL
      

  5.   

    -- 有时分析函数用法不一定比其他的一般用法速度快,要看具体的情况。像上面的例子SQL1中多了个ORDER BY操作。
      

  6.   

    呵呵,执行完sql1的时候,楼主清除了缓存的data block了么
    alter system flush buffer_cache;
    alter system flush shared_pool;清除缓存之后再执行sql2统计看看
      

  7.   

    参考:
    Oracle Sql 语句性能调优
      

  8.   

    学习
    怎么用sql语句查share_pool的sql?
      

  9.   

    1.请提供数据库版本, SGA和PGA相关配置,其实DISTINCT和ROW_NUMBER没一个是好东西,但若字段太多的话,建议使用row_number,在oracle 9i(或以前),oracle  distinct 使用sort unique操作,而在oracle 10g,在采用group by hash操作,不需要全派序的,效率要高很多
    2.大家讨论来讨论去,不知道注意到没有,这两条sql并不等价,那么执行快慢讨论还有什么意义呢
      

  10.   

    是oracle9i或者以上版本么如果是的可以设置system的parameter optimizer_mode=CHOOSE 或者是 ALL_ROWS/First_ROWS或者是在查询语句里加上hint  select /*+ FIRST_ROWS */ * from .....
      

  11.   


    是的,再加上这点,没有统计信息,也就基于Rule叻
      

  12.   

    的版本是9i2的,
    怎么收集统计信息,能给个deom吗
      

  13.   

    http://topic.csdn.net/u/20080919/13/7809f349-9396-4857-bcb8-f5140bce3e9d.html
    找到个例子
    但没找到用法 
    我自己这下试的,不成功!
    选执行这语句:
    begin
      dbms_stats.gather_table_stats(ownname    => kailiao,
                                    tabname    => 'spd_domain',
                                    method_opt => 'for all indexed columns',
                                    cascade    => TRUE);
    end;再执行:select MAIN_DOMAIN, ALEXA_RANKING, site_name, SITE_TYPE, CONTACT
      from (select MAIN_DOMAIN,
                   ALEXA_RANKING,
                   site_name,
                   SITE_TYPE,
                   CONTACT,
                   spare_num,
                 row_number() over(partition by MAIN_DOMAIN order by MAIN_DOMAIN) rn
              from site_alexa)
     where rn = 1
       and spare_num = 0
       and ALEXA_RANKING >= '0'
       and ALEXA_RANKING <= '1000000'
     order by ALEXA_RANKING desc
    最后执行:SELECT endpoint_number, endpoint_value, ENDPOINT_ACTUAL_VALUE
      FROM (SELECT endpoint_number, endpoint_value, ENDPOINT_ACTUAL_VALUE
              FROM USER_HISTOGRAMS
             WHERE table_name = 'spd_domain'
               and column_name = 'kailiao'
             ORDER BY endpoint_number)
     WHERE rownum <= 20;
    但查询出来的结果没有记录我想查上面的查询sql语句 的统计信息, 各位 前辈要怎么用
      

  14.   

    我觉得有可能是慢在这里2个查询条件:   and ALEXA_RANKING >= '0'
       and ALEXA_RANKING <= '1000000'
    字符串的<= >=是很费时间的,楼主这里为什么不转换成数字呢?