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


Не уверен, зачем вы создаете таблицу 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 вместо NAME в таблице EMPLOYEE повысит производительность этого запроса.
возможно, но я просто копирую его пример без таблицы tmp. Вместо этого можно использовать просто DESC.
Есть ли способ указать смещение и диапазон?
Мое требование уже добавлено в DB2 9.7.2.
В DB2 9.7.2 добавлен новый синтаксис для результата запроса ограничения, как показано ниже:
SELECT * FROM TABLE LIMIT 5 OFFSET 20
база данных получит результат из строки №. 21–25
Я думаю, «LIMIT» работает, только если включена совместимость с MySQL? По-видимому, запущенная DB2 9.7.3 не поддерживает это по умолчанию (SQL0104N После "" был обнаружен неожиданный маркер "LIMIT".)
Да; он работает в DB2 9.7.4. В этой статье рассказывается об этой новой функции: ibm.com/developerworks/data/library/techarticle/…
Похоже, что это работает только для DB2 Express-C, и вам нужно изменить compatibility_vector на mys, как это объясняется в статье.
Вам действительно не следует использовать этот синтаксис MySQL в DB2, если вы можете этого избежать. Лучше используйте Собственный синтаксис подкачки DB2 ...
Это очень сложно, все зависит от того, какая у вас база данных.
Например:
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
Я заметил задержку около 10 секунд для 2,3 миллиона записей. Причина положительного голосования в том, что он работал без изменения настроек основной базы данных. :)
Это просто, сделать разбивку на страницы, просто следуя синтаксису.
LIMIT (pageSize) OFFSET ((currentPage) * (pageSize))
Привет, @Paul, это отличный пример! Спасибо. Является ли
ORDER BY NAME DESCизбыточным во внешнем запросе?