Como consulta gama de dados DB2 com a mais alta performance?
-
06-07-2019 - |
Pergunta
Normalmente, eu preciso para recuperar dados de uma tabela em algum intervalo; por exemplo, uma página separada para cada resultado da pesquisa. No MySQL I palavra-chave uso limite, mas no DB2 eu não sei. Agora eu usar essa consulta para recuperar intervalo de dados.
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
mas eu sei que é mau estilo. Então, como consulta para melhor desempenho?
Solução
Minha exigência foram adicionados em DB2 9.7.2 já.
DB2 9.7.2 adiciona nova sintaxe para resultado da consulta limite de como ilustrar abaixo:
SELECT * FROM TABLE LIMIT 5 OFFSET 20
o banco de dados irá recuperar resultado de linha não. 21-25
Outras dicas
Não sei por que você está criando a tabela de TMP. não é RUNNING_NO aready em sequência ascendente? Gostaria de pensar:
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
daria os mesmos resultados.
cujo índice sobre o nome na mesa o empregado irá aumentar o desempenho desta consulta.
É muito difícil, é depende de qual banco de dados que você tem.
Por exemplo:
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