日期:2014-05-17  浏览次数:20836 次

一个简单的SQL优化问题
select count (*) / (extract( minute from (max(b) - min(b)))  *60 +  extract(second from( max(b) - min (b))))  row_per_second,
   extract( minute from (max(b) - min(b)))  *60 +  extract( second from(max (b) - min(b))) as  sec,
        count(*) rowCnt,
       max(b),
       min(b)  
  from jackTestIO;

如上,意思大概能直接看懂吧.
我的问题是,(extract( minute from (max(b) - min(b)))  *60 +  extract(second from( max(b) - min (b)))) 这个语句出现了2次,有什么办法把这段表达优化成一个,其他地方直接引用这个值就好了.
要求: 表达明了,语句简洁, 计算高效. 不要用begin,end,declear 什么的,
oracle 性能优化

------解决方案--------------------
如果要从日期类型的字段中抽取时/分部分用to_char() 函数就可以.比如to_char(sysdate,'hh24')抽取小时

抽取小时
 
SQL> select to_char(sysdate,'hh24') from dual;
 
TO_CHAR(SYSDATE,'HH24')

抽取分钟
 
SQL> select to_char(sysdate,'mi') from dual;
 
TO_CHAR(SYSDATE,'MI')

抽取秒
 
SQL> select to_char(sysdate,'ss') from dual;
 
TO_CHAR(SYSDATE,'SS')

------解决方案--------------------
写个子查询呗

select rowCnt / sec, t.*
  from (select extract(minute from(max(b) - min(b))) * 60 +
               extract(second from(max(b) - min(b))) as sec,
               count(*) rowCnt,
               max(b),
               min(b)
          from jackTestIO) t;