受this question的啓發我決定測試rank()
函數,試圖查看子查詢的效率是否低於rank。所以,我創建了一個表:性能:rank()與子查詢。子查詢有更低的成本?
create table teste_rank (codigo number(7), data_mov date, valor number(14,2));
alter table teste_rank add constraint tst_rnk_pk primary key (codigo, data_mov);
,並插入一些記錄......
declare
vdata date;
begin
dbms_random.initialize(120401);
vdata := to_date('04011997','DDMMYYYY');
for reg in 1 .. 465 loop
vdata := to_date('04011997','DDMMYYYY');
while vdata <= trunc(sysdate) loop
insert into teste_rank
(codigo, data_mov, valor)
values
(reg, vdata, dbms_random.value(1,150000));
vdata := vdata + 2;
end loop;
commit;
end loop;
end;
/
然後測試了兩種querys:
select *
from teste_rank r
where r.data_mov = (select max(data_mov)
from teste_rank
where data_mov <= trunc(sysdate)
and codigo = 1)
and r.codigo = 1;
select *
from (select rank() over (partition by codigo order by data_mov desc) rn, t.*
from teste_rank t
where codigo = 1
and data_mov <= trunc(sysdate)) r
where r.rn = 1;
正如你所看到的,子查詢的成本比排名較低的()。這是正確的嗎?我在那裏錯過了什麼?
PS:測試表中還有一個完整的查詢和低成本的仍然子查詢。
EDIT
我生成的兩個查詢的的TKPROF(跟蹤一個,關閉數據庫,啓動和跟蹤的第二)。
對於子查詢
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.02 3 5 0 0
Execute 1 0.00 0.00 0 3 0 0
Fetch 2 0.00 0.00 1 4 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.02 4 12 0 1
對於rank()
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.02 3 3 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 9 19 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.03 12 22 0 1
我可以斷定,子查詢不將總是比等級低效率?何時顯示排名而不是子查詢?
您是否分析了表格和索引? – 2012-02-10 19:22:44
(不知道這是否有效或違反了某些規則,但..) @Justin Cave,因爲這個任務與你在其他帖子中的回答有關,你能否請你看看並提出你的意見? – 2012-02-10 20:01:29