Как запросить диапазон данных в DB2 с максимальной производительностью?

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Обычно мне нужно извлечь данные из таблицы в некотором диапазоне; например, отдельная страница для каждого результата поиска. В MySQL я использую ключевое слово LIMIT, но в 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

даст те же результаты.

Наличие индекса INDEX over NAME в таблице EMPLOYEE повысит производительность этого запроса.

Это очень сложно, это зависит от того, какая база данных у вас есть.

например:

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