によって誘発されたthis question私は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;
/
そして2つの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;
0123を
ご覧のとおり、サブクエリのコストはrank()よりも低くなります。これは正しいですか?そこに何か不足していますか?
PS:テーブルの完全なクエリと低コストのサブクエリでもテストされています。
EDIT
は、私は2つのクエリののTKPROF生成された(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
については、サブクエリ
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
については
私は、サブクエリがランクよりも常に少ない効率的な意志はないと結論することはできますか?サブクエリの代わりにランクが示されるのはいつですか?
テーブルとインデックスを分析しましたか? –
(これが動作するのかどうかはわかりませんが、いくつかのルールに反していますが..) @Justin Cave、このクエストは他の投稿のあなたの答えと関連していますので、どうぞご覧ください。 –