2008-11-05 68 views
4

通常,我需要从某个范围的表中检索数据;例如,每个搜索结果都有一个单独的页面。在MySQL中,我使用LIMIT关键字,但在DB2中我不知道。现在我使用这个查询来检索数据范围。如何以最高性能查询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 

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

回答

5

我的需求已经添加到DB2 9.7.2中。

DB2 9.7.2增加了限制查询结果的新语法说明如下:

SELECT * FROM TABLE LIMIT 5 OFFSET 20 

数据库将从排检索结果没有。 21 - 25

3

不确定为什么要创建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 over NAME将提高此查询的性能。

+1

嘿,@保罗,这是一个很好的例子!谢谢。外部查询中'ORDER BY NAME DESC`是多余的吗? – Beez 2014-01-08 16:27:01

+0

可能是这样,但我只是在没有tmp表的情况下复制他的示例。可以改用DESC代替。 – 2014-01-09 19:19:31

1

这是非常困难的,这取决于你有哪个数据库。

例如:

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