Come interrogare l'intervallo di dati in DB2 con le massime prestazioni?
-
06-07-2019 - |
Domanda
Di solito, ho bisogno di recuperare i dati da una tabella in un certo intervallo; ad esempio, una pagina separata per ogni risultato di ricerca. In MySQL utilizzo la parola chiave LIMIT ma in DB2 non lo so. Ora utilizzo questa query per recuperare l'intervallo di dati.
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
ma so che è cattivo stile. Quindi, come richiedere le massime prestazioni?
Soluzione
I miei requisiti sono già stati aggiunti in DB2 9.7.2.
DB2 9.7.2 aggiunge una nuova sintassi per il risultato della query limite come illustrato di seguito:
SELECT * FROM TABLE LIMIT 5 OFFSET 20
il database recupererà il risultato dalla riga n. 21 - 25
Altri suggerimenti
Non sono sicuro del motivo per cui stai creando la tabella TMP. RUNNING_NO non è in ordine crescente? Vorrei pensare:
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
darebbe gli stessi risultati.
Avere un INDICE su NAME nella tabella DIPENDENTI migliorerà le prestazioni di questa query.
È molto difficile, dipende dal database che hai.
ad esempio:
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