2008-11-05 2 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 уже.

9.7.2 DB2 добавляет новый синтаксис для ограничения результата запроса, как иллюстрации ниже:

SELECT * FROM TABLE LIMIT 5 OFFSET 20 

база данных будет извлекать результат из строки нет. 21 - 25

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 повышает производительность этого запроса.

+1

Эй, @Paul, это отличный пример! Спасибо. Является ли «ORDER BY NAME DESC» избыточным во внешнем запросе? – Beez 2014-01-08 16:27:01

+0

возможно так, но я просто копирую его пример без таблицы tmp. Вместо этого можно использовать только DESC. – 2014-01-09 19:19:31

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