에 의해 영감을 얻었습니다 rank()
함수를 테스트하여 하위 쿼리가 순위보다 비효율적인지 확인하려고했습니다.성능 : 순위() 대 하위 쿼리. 하위 쿼리 비용이 저렴합니까?
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;
: 다음
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 테스트를 몇 가지 기록을 ...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);
삽입 : 그래서 테이블을 생성
하위 쿼리의 비용은 rank()보다 낮습니다. 이게 옳은 거니? 거기에 뭔가 빠졌나요?
추신 : 또한 테이블의 전체 쿼리와 저렴한 비용의 하위 쿼리로 테스트되었습니다.
편집
나는 두 쿼리의 TKPROF 생성 (하나를 추적, 종료 데이터베이스, 시작을 두 번째 추적). 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,이 퀘스트는 다른 게시물의 답변과 관련되어 있으니 알려 주시고 의견을 제시해주십시오. –