성능이 가장 높은 DB2의 데이터 범위를 쿼리하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/265850

  •  06-07-2019
  •  | 
  •  

문제

일반적으로 일부 범위의 테이블에서 데이터를 검색해야합니다. 예를 들어 각 검색 결과에 대한 별도의 페이지입니다. MySQL에서는 Limit Keyword를 사용하지만 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

그러나 나는 그것이 나쁜 스타일이라는 것을 알고 있습니다. 그렇다면 성능이 가장 높은 방법은 무엇입니까?

도움이 되었습니까?

해결책

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

DB2 9.7.2 아래 그림과 같이 한계 쿼리 결과에 대한 새로운 구문이 추가됩니다.

SELECT * FROM TABLE LIMIT 5 OFFSET 20

데이터베이스는 행 번호에서 결과를 검색합니다. 21-25

다른 팁

왜 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

동일한 결과를 제공합니다.

직원 테이블에 이름을 가진 색인이 있으면이 쿼리의 성능이 향상됩니다.

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

예를 들어:

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top