2012-05-01 112 views
0

每個人都希望我更具體。我正在嘗試使用asp classic和ms-access數據庫進行分頁。這是我用來獲取第2頁的項目的查詢。每個頁面有25個項目,當查詢返回大約500+這樣的大數據集時,這需要大約20多秒的時間才能執行,並且是的,我已將sku編入索引更快的查詢。有什麼建議麼。如何使此SQL代碼更快?

SELECT TOP 25 * 
FROM catalog 
WHERE sku LIKE '1W%' 
AND sku NOT IN (SELECT TOP 25 sku 
       FROM catalog 
       WHERE sku LIKE '1W%' ORDER BY price DESC) ORDER BY price DESC 
+2

您正在使用什麼數據庫管理系統? – srgerg

+1

沒有'ORDER BY'的'TOP'是相當奇怪的。 –

+0

TOP意味着(最可能)SQL-Server或MS-Access。哪一個? –

回答

1

一些指針:

  • 您可以通過使用TOP (n)和反向排序模擬SELECT BOTTOM (n) BY
  • 您可以使用嵌套選擇(創建臨時表)

所以,最終「分頁」查詢的結果是(用50,100,125,...代替50)...在後續頁):

SELECT TOP 25 * 
FROM 
(
SELECT TOP 50 * 
FROM catalog 
WHERE sku LIKE '1W%' 
ORDER BY price desc 
) 
TEMP 
ORDER BY price asc; 

雖然你提到你已經收錄你的數據,但是,只是要徹底清除,以達到最佳性能,您應該確保所有的表索引充分爲您的查詢。在這種情況下,我會建議,至少查詢中涉及的兩列:

CREATE INDEX IX_CATALOG ON CATALOG (SKU, PRICE); 
0

你要做的是從表中選擇符合特定條件的所有行,而不是第一個二十五。不幸的是,不同的數據庫管理系統有自己的語法來做這種事情。

Wikipedia page for the SQL select statement的不同語法有很好的調查。

舉個例子,在MySQL中,你可以使用LIMIT clause of the SELECT statement指定多少行返回和偏移:

SELECT * 
FROM catalog 
WHERE sku LIKE '1W%' 
ORDER by id 
LIMIT 25, 9999999999 

返回行26對查詢結果的9999999999。

+0

會喜歡使用限制和偏移但是這是在一個MS訪問數據庫 – kqlambert

0

在列sku上創建一個索引(如果有效使其唯一)。表中有多少行?

2

TOP沒有ORDER BY看起來沒用或至少是奇怪的。我猜意思優爾使用此子查詢:

(SELECT TOP 25 sku 
    FROM catalog 
    WHERE sku LIKE '1W%' 
    ORDER BY sku 
) 

sku添加一個索引,如果你還沒有一個。

查詢的可能重寫,用於訪問:

SELECT * 
FROM catalog 
WHERE sku LIKE '1W%' 
AND sku >= (SELECT MAX(sku) 
      FROM (SELECT TOP 26 sku 
        FROM catalog 
        WHERE sku LIKE '1W%' 
        ORDER BY sku 
       ) 
      ) 

如果您使用的是SQL-Server,您可以使用窗口函數對於這種類型的查詢。

0
SELECT sku 
FROM catalog 
WHER sku LIKE '1W% 
ORDER BY __SOME COLUMN __ 
LIMIT 10000 OFFSET 25 

這回該是行25(OFFSET 25)後的數據庫中的所有*的行。

* LIMIT 10000將結果查詢限制爲10000個元組(行)。

爲確保您沒有隨機獲得OFFSET,您需要按某個欄目排序。