oracle rownum 特别慢,select * from table where rownum=1怎么会特别慢??表的数据在千万左右...
援引我的blog的一篇文章。
這是一篇改寫的文章,原文來自
http://www.db-nemec.com/Selecting_ROWNUM_1.html ,我只是結合我的實驗重述,如果大家有時間,可以看看原文。
如果想判斷一個表中是否有數據,最簡單的方法是:
SELECT count(*) FROM test WHERE ROWNUM = 1;
正常情況下它的執行計劃如下:
SQL> select count(*) from TEST where rownum = 1;
Elapsed: 00:00:00.00
Execution Plan
----------------------------------------------------------
0? ?? ?SELECT STATEMENT Optimizer=ALL_ROWS (Cost=40145 Card=1)
1? ? 0? ?SORT (AGGREGATE)
2? ? 1? ???COUNT (STOPKEY)
3? ? 2? ?? ? PARTITION RANGE (ALL) (Cost=40145 Card=7639515)
4? ? 3? ?? ?? ?TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=40145 Card=7639515)
Statistics
----------------------------------------------------------
0??recursive calls
0??db block gets
4??consistent gets
0??physical reads
0??redo size
379??bytes sent via SQL*Net to client
504??bytes received via SQL*Net from client
2??SQL*Net roundtrips to/from client
0??sorts (memory)
0??sorts (disk)
1??rows processed
4個LIO是能夠接受的。
如果你發現就這么簡單的語句執行特別慢,查看執行計劃如下:
SQL> select count(*) from TEST where rownum = 1;
Elapsed: 00:00:19.05
Execution Plan
----------------------------------------------------------
0? ?? ?SELECT STATEMENT Optimizer=ALL_ROWS (Cost=21562 Card=1)
1? ? 0? ?SORT (AGGREGATE)
2? ? 1? ???COUNT (STOPKEY)
3? ? 2? ?? ? PX COORDINATOR
4? ? 3? ?? ?? ?PX SEND* (QC (RANDOM)) OF ':TQ10000' (Cost=21562 Card=7639515)? ?? ???:Q1000
5? ? 4? ?? ?? ???PX BLOCK* (ITERATOR) (Cost=21562 Card=7639515)? ?? ?? ?? ?? ?? ?? ???:Q1000
6? ? 5? ?? ?? ?? ? TABLE ACCESS* (FULL) OF 'TEST' (TABLE) (Cost=21562 Card=7639515)? ?:Q1000
4 PARALLEL_TO_SERIAL
5 PARALLEL_COMBINED_WITH_CHILD
6 PARALLEL_COMBINED_WITH_PARENT
Statistics
----------------------------------------------------------
217??recursive calls
3??db block gets
100678??consistent gets
100260??physical reads
668??redo size
379??bytes sent via SQL*Net to client
504??bytes received via SQL*Net from client
2??SQL*Net roundtrips to/from client
10??sorts (memory)
0??sorts (disk)
1??rows processed
這是怎么回事呢?
在9i和10g中,如果對分區表執行count(*),而且表的degree 大于1,就會出現這種問題,如果把degree恢復為1,問題就能解決。
alter table TEST parallel (degree 1);
看來簡單的增大并行度,也很可能會出現一些問題。ORACLE還有很多需要你去學習。
總結
以上是生活随笔為你收集整理的oracle rownum 特别慢,select * from table where rownum=1怎么会特别慢??表的数据在千万左右...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: window ssm总线控制器有感叹号怎
- 下一篇: oracle中如何创建一个过程,如何开发