最高のパフォーマンスでDB2のデータ範囲を照会する方法は?
-
06-07-2019 - |
質問
通常、ある範囲のテーブルからデータを取得する必要があります。たとえば、検索結果ごとに個別のページがあります。 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
しかし、私はそれが悪いスタイルであることを知っています。では、最高のパフォーマンスを得るためにクエリを実行するにはどうすればいいですか?
解決
私の要件はすでにDB2 9.7.2に追加されています。
DB2 9.7.2は、以下に示すように、クエリ結果を制限するための新しい構文を追加します。
SELECT * FROM TABLE LIMIT 5 OFFSET 20
データベースは行番号から結果を取得します。 21-25
他のヒント
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テーブルのNAMEにINDEXを設定すると、このクエリのパフォーマンスが向上します。
それは非常に難しく、どのデータベースを持っているかによります。
例:
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
所属していません StackOverflow