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

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

но я знаю, что это плохой стиль. Итак, как запросить максимальную производительность?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
7
0
24 150
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Не уверен, зачем вы создаете таблицу 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 повысит производительность этого запроса.

Привет, @Paul, это отличный пример! Спасибо. Является ли ORDER BY NAME DESC избыточным во внешнем запросе?

Beez 08.01.2014 20:27

возможно, но я просто копирую его пример без таблицы tmp. Вместо этого можно использовать просто DESC.

Paul Morgan 09.01.2014 23:19

Есть ли способ указать смещение и диапазон?

bluelurker 04.02.2020 15:28
Ответ принят как подходящий

Мое требование уже добавлено в 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".)

CodingWithSpike 20.04.2011 17:01

Да; он работает в DB2 9.7.4. В этой статье рассказывается об этой новой функции: ibm.com/developerworks/data/library/techarticle/…

AngocA 03.11.2011 13:50

Похоже, что это работает только для DB2 Express-C, и вам нужно изменить compatibility_vector на mys, как это объясняется в статье.

AngocA 03.11.2011 14:19

Вам действительно не следует использовать этот синтаксис MySQL в DB2, если вы можете этого избежать. Лучше используйте Собственный синтаксис подкачки DB2 ...

Lukas Eder 27.10.2013 18:02

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

Например:

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 миллиона записей. Причина положительного голосования в том, что он работал без изменения настроек основной базы данных. :)

suhas0sn07 27.03.2019 07:30

Это просто, сделать разбивку на страницы, просто следуя синтаксису.

LIMIT (pageSize) OFFSET ((currentPage) * (pageSize))

Другие вопросы по теме