SQL Server 2012 Express 사용.
아래의 SQL 쿼리는 매우 느리고 성능을 향상 시키거나 더 효율적으로 수행하려면 조언이 필요합니다.
라는 테이블 PriceDaily
을 쿼리하고 Date
주어진 날짜에 대해 열을 쿼리합니다 2009/11/27
( 예 : 날짜는 임의의 날짜가 될 수 있으며 실제로 변수에 의해 결정됨).
날짜별로 정렬 한 다음 X 레코드를 위 (+ X) 또는 아래 (-X)로 이동하고 날짜 필드에 대한 해당 레코드의 값을 반환해야합니다. 예를 들어 -5의 경우 5 개의 레코드를 위로 이동하고 날짜 값을 반환합니다.
예를 들어 2009/11/20
테이블의 일부가 다음과 같은 경우 반환됩니다 ( 2009/11/20
위의 5 개 레코드 이므로 2009/11/27
).
2009/11/20
2009/11/23
2009/11/24
2009/11/25
2009/11/26
2009/11/27
2009/11/30
2009/12/01
2009/12/02
2009/12/03
2009/12/04
최적화 할 쿼리 :
with Records AS
(
select
row_number() over(order by date) as 'row',
*
from [NIG03].[dbo].[PriceDaily]
)
select Date
from records
where row = (SELECT Top 1 ROW_NUMBER() OVER(ORDER BY Date DESC) AS Row
FROM [NIG03].[dbo].[PriceDaily]
WHERE [NIG03].[dbo].[PriceDaily].Date<'2009/11/27'
ORDER BY Date) - X + 1
이 쿼리를 최적화하는 방법에 대한 조언은 높이 평가 될 것입니다.
창 기능 만 사용하여이를 표현할 수 있습니다 .
select pd.*,
max(case when date = '2009-11-27' then seqnum end) as date_seqnum
from (select pd.*,
row_number() over (order by date) as seqnum
from PriceDaily pd
) pd
where seqnum = date_seqnum - X + 1;
이 쿼리 (및 쿼리)의 경우 성능 문제는 다음에 대한 인덱스가 필요하다는 것입니다 date
.
create index idx_pricedaily_date on PriceDaily(date);
대체 접근 방식이 있습니다 (인덱스의 이점도 누릴 수 있음).
select pd.*
from PriceDaily pd
where date >= '2009-11-27'
order by date
offset X rows fetch first 1 row only;
물론의 where
다른 값에 대해 에서 오프셋과 비교 방향을 조정해야합니다 X
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다