2012-05-09 6 views
0

SQL Server 2012 Express 사용. 키/값 쌍을 나타내는 테이블이 있습니다. keycol은 테이블의 PK입니다. 쿼리 매개 변수가 테이블의 두 keycol 값 사이에있는 경우 valcol을 찾기 위해 테이블을 쿼리하는 최적의 방법을 찾으려고합니다. 그래서 keycol = 15를 찾고 'keycol = 20'이면 'b'를 찾고 keycol = 36 인 경우 'c'를 찾으려면 'a'를 찾고 싶습니다.PK 값 사이의 SQL Server 쿼리 최적?

; 
with tblextr (keycol , valcol) 
As 
(
    Select 10 , 'a' 
    Union All 
    Select 19 , 'a' 
    Union All 
    Select 20 , 'b' 
    Union All 
    Select 29 , 'b' 
    Union All 
    Select 30 , 'c' 
    Union All 
    Select 39 , 'c' 
) 
select valcol from tblextr 
where keycol = (
    select max(keycol) 
    from tblextr 
    where keycol <= 36 
) 

keycol은 이미 PK이므로 SQL을 작성하는 것보다 나은 방법이 있습니까? 테이블에 놓아야하는 다른 인덱스가 있습니까? 나는 속도가 올라가면 더 많은 공간을 사용하는 것에 신경 쓰지 않는다. 이 테이블은 조회 테이블이므로 전체 테이블을 새로 고치면 새로 고침의 일부로 행이 매월 추가됩니다.

감사합니다.

+0

'36'대신 '6'이 있으면 어떻게해야합니까? 아니면 '136'이 있었다면? –

+0

그러면 결과는 두 경우 모두 null이되며 이는 정상입니다. – Snowy

답변

1

내가 그것을해야한다고 생각 :

... 
SELECT a.valcol 
FROM 
    (SELECT TOP(1) valcol 
     FROM tblextr 
     WHERE keycol <= 36 
     ORDER BY keycol DESC 
    ) AS a 
    JOIN 
    (SELECT TOP(1) valcol 
     FROM tblextr 
     WHERE keycol >= 36 
     ORDER BY keycol ASC 
    ) AS b 
    ON b.valcol = a.valcol 

이미 기본 키 (keycol)에 클러스터 된 인덱스를 가지고 있다면, 당신은이 쿼리에 대한 otehr 인덱스를 필요가 있다고 생각하지 않습니다.