2008年12月27日星期六

对大表求min/max注意事项

有一个近亿条记录的表,当需要对主键字段求min/max时,如果在同一条sql中使用min/max时,将会特别的慢,如果分成两条sql执行时,则速度很快,测试如下:




18:22:33 SQL> select min(id),max(id) from bmw_user_trace;
^Cselect min(id),max(id) from bmw_user_trace
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation


Elapsed: 00:00:13.92

18:22:57 SQL> select min(id) from bmw_user_trace;

MIN(ID)
----------
14927731

1 row selected.

Elapsed: 00:00:00.01
18:23:04 SQL> c/min/max
1* select max(id) from bmw_user_trace
18:23:12 SQL> /

MAX(ID)
----------
176547013

1 row selected.

Elapsed: 00:00:00.02

oracle就是按照执行计划里面的RANGE SCAN (MIN/MAX)算法来做的,如果是max,首先沿着最右边的root-branch node-leaf node,发现最右边的leaf block是空的,于是沿着逆向指针往左走,一直走到最左边发现都是空的,于是扫描了所有的leaf blocks如果是min,首先沿着最左边的root-branch node-leaf node,发现最左边的leaf block是空的,于是沿着顺向指针往右走,走到最右边发现都是空的,扫描了所有的leaf blocks。

原文引自http://www.itpub.net/405653.html

没有评论: