Как запросить диапазон данных в DB2 с максимальной производительностью?
-
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