같은 서브 쿼리 만 1 레코드를 가져올 수있는 최선의 방법을 찾고 있는데요, 불행하게도) :
Do begin
var_1 = select * from ((Select 'A' product, '1' period, '100' price from sys.dummy)
Union (Select 'A' product, '2' period, '0' price from sys.dummy)
Union (Select 'A' product, '3' period, '0' price from sys.dummy)
Union (Select 'A' product, '4' period, '5' price from sys.dummy)
Union (Select 'A' product, '5' period, '0' price from sys.dummy)) order by period desc;
var_out = (select a.product,
a.period,
(select max(price)
from :var_1 b
where a.product = b.product
and a.period > b.period
and b.period <> 0
and b.period = (select max(period) from :var_1 c
where a.product = c.product
AND a.period > c.period
and c.period <> 0
and c.price <> 0
)) as price
from :var_1 a where price = '0')
union (select product, period, price from :var_1 where price <> '0');
select * from :var_out order by product, period;
end
는
코멘트 후 추가 sps12
에서 테스트. 왜 그냥 시도하지 않으시겠습니까? 그것은 매우 간단합니다. 호기심 때문에 HCP 시험판에서 시험해 보았습니다. 밀리언 행에 약 1 초가 걸렸습니다. 이전 기간에는 가격이없는 null 값을 가진 행을 피하기 위해 ifnull을 포함 시켰습니다.
drop table var_1;
create column table var_1 as
(
select
cast ('Prod' || prd.GENERATED_PERIOD_START as nvarchar(20)) product,
cast (per.GENERATED_PERIOD_START as decimal(2)) period,
cast (case when rand() < '0.5' then rand() * '100' else '0' end
as decimal(5,2)) as price -- ~50% of price is 0
from series_generate_integer(1,0,1000000/13) as prd, --~1Mio records
series_generate_integer(1,0,13) as per --12 periods + period 0
);
merge delta of var_1;
select * from var_1
order by product, period
limit 100;
do begin sequential execution -- don't let parallel execution influence the runtime-measurement
declare start_timestamp timestamp;
start_timestamp = current_timestamp;
var_out = (select a.product,
a.period,
ifnull ((select max(price)
from var_1 b
where a.product = b.product
and a.period > b.period
and b.period <> 0
and b.period = (select max(period) from var_1 c
where a.product = c.product
AND a.period > c.period
and c.period <> 0
and c.price <> 0
)),'0.0') as price
from var_1 a where price = '0')
union (select product, period, price from var_1 where price <> '0');
select nano100_between(:start_timestamp, (select current_timestamp from dummy))/10000 as runtime_millisec from dummy;
select * from :var_out
order by product, period
limit 100;
end
도와 주셔서 감사합니다 크리스에 대한 많은 !! : 여기
는 코딩입니다 VAR_1 임시 테이블에 100 만 개가 넘는 항목이있는 경우 실적이 어떻게 될지 궁금하십니까? 중첩 된 하위 쿼리 (잘못 부른 경우 수정하십시오)로 인해 성능 문제가 발생합니까? – Gokul@gokul : 왜 단지 성능이 얼마나 좋은지 또는 나쁜지를 측정하지 않았습니까? 그리고 유스 케이스에서 좋은 성능은 무엇입니까? 오직 호기심에서부터 나는 테스트 데이터를 생성하고 실행 시간을 측정하는 코딩을 포함했다. HCP 재판에서 백만 기록 당 1 초가 그렇게 나쁘지 않습니까? 성명서에 대한 설명 계획이나 계획 마법사를 살펴 보는 것도 흥미로울 것입니다. 어쩌면 당신은 이것을 할 수 있고 질문에 어떤 가치를 추가 할 수 있습니다. 그리고 어쩌면 전문가 중 한 명이 윈도우 기능이나 다른 멋진 기능을 사용하여 좀 더 빠른 솔루션을 제안합니다. –
안녕하세요 Chris, 변경 작업 중입니다. 쿼리의 성능을 확실히 업데이트 할 예정입니다. 다시 시도해 주셔서 감사합니다. – Gokul