2008-11-05 4 views
4

일반적으로 일부 범위의 테이블에서 데이터를 검색해야합니다. 예를 들어, 각 검색 결과에 대한 별도의 페이지. MySQL에서는 LIMIT 키워드를 사용하지만 DB2에서는 모르겠습니다. 이제 데이터 범위 검색에이 쿼리를 사용합니다.DB2에서 최상의 성능으로 데이터 범위를 쿼리하는 방법은 무엇입니까?

SELECT * 
FROM(
    SELECT 
     SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO 
     , DATA_KEY_VALUE 
     , SHOW_PRIORITY 
    FROM 
     EMPLOYEE 
    WHERE 
     NAME LIKE 'DEL%' 
    ORDER BY 
     NAME DESC 
    FETCH FIRST 20 ROWS ONLY 
) AS TMP 
ORDER BY 
    TMP.RUNNING_NO ASC 
FETCH FIRST 10 ROWS ONLY 

그러나 나는 그것이 나쁜 스타일이라는 것을 알고 있습니다. 그렇다면 최고의 성능을 위해 쿼리하는 방법은 무엇입니까?

답변

5

내 요구 사항이 이미 DB2 9.7.2에 추가되었습니다.

SELECT * FROM TABLE LIMIT 5 OFFSET 20 

데이터베이스는 더 행에서 결과를 검색합니다 아래 설명과 같이

DB2의 9.7.2는 제한 쿼리 결과에 대한 새로운 구문을 추가합니다. 21 - 25

+0

'LIMIT'는 MySQL 호환성이 활성화 된 경우에만 작동한다고 생각하십니까? DB2 9.7.3을 실행하면 기본적으로 지원되지 않습니다 (SQL0104N ""다음에 예기치 않은 토큰 "LIMIT"가 있습니다.) – CodingWithSpike

+0

예; DB2 9.7.4에서 작동합니다. 이 새로운 기능에 대한 기사입니다 : http://www.ibm.com/developerworks/data/library/techarticle/dm-1006db2expressc972/index.html – AngocA

+4

DB2 Express-C에서만 작동하는 것 같습니다. 이 기사에서 설명한 것처럼 compatibility_vector를 mys로 변경해야한다. – AngocA

3

TMP 테이블을 만드는 이유를 잘 모르겠습니다. RUNNING_NO가 오름차순으로 오르지 않았습니까? 나는 생각할 것이다 :

SELECT SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO, 
     DATA_KEY_VALUE, 
     SHOW_PRIORITY 
    FROM EMPLOYEE 
WHERE NAME LIKE 'DEL%' 
ORDER BY NAME DESC 
FETCH FIRST 10 ROWS ONLY

같은 결과를 줄 것이다.

EMPLOYEE 테이블에서 NAME보다 INDEX를 지정하면이 쿼리의 성능이 향상됩니다.

+1

이봐, @ 폴, 이것은 좋은 예입니다! 고맙습니다. 외부 질의에'ORDER BY NAME DESC'가 중복되어 있습니까? – Beez

+0

아마 그렇게하지만 난 그냥 tmp 테이블없이 그의 예제를 복사하고 있습니다. 대신 DESC 만 사용할 수 있습니다. –

1

매우 어렵습니다. 어떤 데이터베이스가 있는지에 따라 다릅니다. 예를 들어

:

SELECT * FROM ( 
    SELECT 
     ROW_NUMBER() OVER (ORDER BY ID_USER ASC) AS ROWNUM, 
     ID_EMPLOYEE, FIRSTNAME, LASTNAME 
    FROM EMPLOYEE 
    WHERE FIRSTNAME LIKE 'DEL%' 
) AS A WHERE A.rownum 
BETWEEN 1 AND 25