如何在DB2中以最高的性能查询数据范围?

lqfhib0f  于 2023-01-09  发布在  DB2
关注(0)|答案(5)|浏览(194)

通常,我需要从某个范围内的表中检索数据;例如,每个搜索结果有一个单独的页面。在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

但我知道这是不好的风格。那么,如何查询以获得最高性能呢?

wbrvyc0a

wbrvyc0a1#

我的需求已经添加到DB2 9.7.2中。
DB2 9.7.2为限制查询结果添加了新语法,如下所示:

SELECT * FROM TABLE LIMIT 5 OFFSET 20

数据库将检索第21 - 25行的结果

rvpgvaaj

rvpgvaaj2#

这是非常困难的,这取决于你有哪个数据库.
例如:

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
svmlkihl

svmlkihl3#

不确定为什么要创建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表中使用INDEX而不是NAME将提高此查询的性能。

57hvy0tb

57hvy0tb4#

很简单,只要按照语法进行分页。

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

wmomyfyw5#

如果您希望使用DB2自己的分页语法,请执行以下操作

SELECT *
FROM (
    SELECT RANK() OVER(ORDER BY NAME DESC) AS RUNNING_NO,
        DATA_KEY_VALUE, SHOW_PRIORITY
    FROM EMPLOYEE
    WHERE NAME LIKE 'DEL%'
    ORDER BY NAME DESC
    )
WHERE RUNNING_NO > (:page_no - 1) * :page_size
FETCH FIRST :page_size ROWS ONLY;

相关问题