2008-11-05 60 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