2011-02-01 3 views
1

선택할 수있는 SQL 쿼리를 만들어야 만 한 행으로 1000 행을 주문한 다음 100 행 만 반환 할 수 있습니다.n 행을 순서대로 선택하고 m 행을 반환 할 수있는 SQL 쿼리

왜? 내 쿼리는 ~ 1 000 000 행 (또는 그 이상)을 선택할 수 있으며 처음 1000 개를 가져오고이 1000 개 행에서 가장 관련성이 높은 100 개만 표시합니다. 이러한 선택의 성능에 대해 두려워서이 첫 번째 단계를 소개하고자합니다 (단 1000 개의 행만 가져옴). 더 관련성이 높은 문서를 놓칠 수도 있지만이 경우 중요하지 않습니다.

+1

주어진 순서에 대해 처음 1000 개의 행을 선택하는 쿼리를 요청한 다음 * 다른 순서로 결과의 처음 100 개 행을 반환합니까? –

+1

어떤 DBMS를 사용하고 있습니까? – RichardTheKiwi

+0

@ Cyberkiwi MS SQL을 사용합니다. @AdamRobinson. 1000 행 순서를 선택하고 100 행을 반환하고 싶습니다. – Darqer

답변

2

문자 적 ​​해석은

select top 1000 from tbl order by columnname 

그리고

SELECT TOP 100 FROM (select top 1000 from tbl order by columnname) SQ 

에 다음 단계로 이어질 것입니다하지만 당신이 2 개의 다른 후가 아니라면 직접

select top 100 from tbl order by columnname 

다르지 제공하지 않습니다 주문 :

SELECT TOP 100 
FROM (
    select top 1000 from tbl 
    order by columnname) SQ 
ORDER BY othercolumn 

또는 스위칭 오름차순 사이/DESC

SELECT TOP 100 
FROM (
    select top 1000 from tbl 
    order by columnname ASC) SQ 
ORDER BY columnname DESC 
5

처음 1000 시간을 선택하지 않으면 문제가 발생합니까? 즉, 당신은 그냥 사용하는 경우 ...

Select top 100 * 
From table 
Order by column 

는 동일한 결과를 얻을 다른 곳에서 지적 된대로 성능을 저하보다는 개선 가능성이되지 않습니다.

이 쿼리를 최적화하려면 column에 인덱스가 있는지 확인한 다음 SQL 서버가 원하는 검색 결과를 얻고 레코드 정렬을 최적화 할 수 있습니다.

+0

DB 엔진은 너무 똑똑해서 자동으로 수행 할 수 있습니다. 이 쿼리를 최적화 하시겠습니까? – Darqer

+0

@Darqer : 1000의 목적은 무엇입니까? –

+0

요청한 내용을 정확하게 반환하려면 DB 엔진이 왜 똑똑해야합니까? 특별한 최적화가 필요하지 않습니다. – JohnFx

1

하위 쿼리를 사용할 수 있습니다. 같은 : 내 SQL 조금 녹슨

select top 100 * from (
    select * from tablename 
    limit 1000 
) 
order by fieldname 

그래서 문법은 약간 떨어져있을 수 있습니다, 당신은 작업중인 플랫폼에 따라 그것을 할 수있는 더 좋은 방법이있을 수있다, 그러나 희망이 도움이됩니다.

+0

이 쿼리는 TableName 순서에서 fieldname을 기준으로 상위 100 개를 선택하는 데 다소 난독화된 방법이며 아무런 이점도 제공하지 않습니다. – JohnFx

+0

@ JohnFx : 나는 OP에 원래의 1000 레코드를 선택하기 위해 몇 가지 다른 기준을 염두 해두고 있었는데, 하위 쿼리에'where' 절을 추가했습니다. 아마 더 분명 했어야했는데. –

+0

여전히 출력에는 차이가 없습니다. – JohnFx

4

내가 마지막으로 당신이 얻을하려고하는 것을 이해 생각하지만, 당신이 데이터베이스 작업을 주문 실시합니다 방법에 대한 매우 혼란스러워 나타납니다.

올바르게 이해하면 많은 수의 행 (예제에서는 1,000 개이지만 행 수가 많지 않음)을 정렬 할 경우 성능에 영향을 미칠 수 있습니다. 따라서 관심있는 100 개의 행만 정렬하여 현혹하려고합니다.

where 절을 적용하여 100 행으로 제한하면 대부분의 경우 최신 DB 시스템이 자동으로 수행 추가 작업을하지 않도록 결과를 좁힌 후까지 정렬합니다. 이것은 100 %의 시간이 아니지만 DB 최적화 프로그램이 먼저 정렬하기로 결정할 때 일반적으로 성능에 따라 또는 쿼리가 정렬을 먼저 수행해야만 정확한 결과를 얻는 데 도움이되는 이유가 있습니다. .

트릭은 tSQL이 절차상의 언어가 아닌 선언적 언어임을 이해해야한다는 것입니다.즉, 언어를 사용하여 원하는 것을 설명하고 옵티마이 저가이를 수행하는 정확한 알고리즘을 파악합니다. C# 또는 Java와 같은 절차 언어를 작성한 것처럼 코드를 최적화하려는 것으로 보입니다. SQL은 쿼리를 코드로 변환하지만 입력 할 때 쿼리를 실행하지 않습니다.

간단히 말해서, DB 엔진은 이러한 유형의 단순 최적화 (및 매우 복잡한 일부 최적화)에 매우 뛰어납니다. 이와 같은 특수 효과로 최적화 프로그램을 최적화하지 않으므로 신경 쓰지 마세요. 더 많은 성능을 얻지는 않을 것이고 쿼리를 작성하는 방법에 따라 실제로 성능을 저하시킬 수 있습니다.

관련 문제