2012-12-19 24 views
1

我相信我是一個相當簡單的問題,我無法在Stack或Google Land中定位。我有一個相當基本的選擇statment這件事情是這樣的:將使用SUM的LIMIT OFFSET提供準確的數據嗎?

SELECT 
    itemid, 
    itemdiscription, 
    SUM(quantity) 
FROM  mytable 
GROUP BY itemid, itemdescription 
ORDER BY itemid 
LIMIT 250 
OFFSET 0; 

Basicly這是從超過100K +記錄或使表拉,或更少依賴,這是一個臨時表。所以我想弄清楚的是提供可靠數據的SUM函數,因爲在相似的項目id之間可能有30k條記錄。我最初的想法是,這將執行查詢,然後只返回前250個結果,但後來我想也許不是,所以我想我會問社區是如何工作的。

我使用LIMIT/OFFSET的主要原因是因爲我正在從PHP執行查詢,而這些值是迭代執行的變量,所以我沒有處理使用大量內存的數組。

謝謝!

+3

將執行整個求和操作,然後只有最終結果集將受'limit/offset'限制。 –

回答

1

作爲文檔狀態,限制(或偏移量)適用於「由查詢的其餘部分生成的行」,因此在應用限制或偏移之前考慮查詢的結果。然後應用這些子句會影響這些結果。

http://www.postgresql.org/docs/9.2/static/queries-limit.html

這裏有一對夫婦的使用極限,

http://www.sqlfiddle.com/#!12/08fa0

+0

謝謝,我只是想100%肯定,並沒有足夠的測試數據來確認。謝謝你的小提琴鏈接!我認爲這會派上用場:-) – defaultNINJA

0

第一方式的SQL小提琴,它已被處理後LIMIT工程對查詢結果的頂部。然而,如果服務器認爲結果是相同的,服務器可以優化它 - 例如,如果x爲索引字段,則SELECT x FROM t ORDER BY x LIMIT 1將工作得非常快。

但是,如果您在此處使用LIMIT/OFFSET來提高性能或實現分頁,則應重新考慮您的方法。這是因爲,即使所有聚合字段都被編入索引並且LIMIT可以充分利用該優勢,但當OFFSET增加時,總體工作也會增加,並且即使運行時變得幾乎與沒有LIMIT的完整查詢幾乎相同 - 非常昂貴。

如果要保持偏移量非常低(最好是0),我強烈建議在(itemid,itemdescription)上添加複合索引 - 它應該使查詢運行得更快,特別是如果有多行具有相同的itemid

+0

性能問題是當我嘗試在PHP中將100列加75列和值的記錄存儲到單個數組中時,然後循環以便數據可以被操縱,然後顯示在一個網絡應用程序。保存該數組所需的內存對於PHP Web服務器來說太高了。當然,我可以增加每個會話可用的最大內存,但這會在多個用戶同時連接時造成問題。所以我通過限制返回的記錄來限制php數組的大小。除此之外,我希望能夠立即獲得所有數據。 – defaultNINJA

0

EXPLAIN您的查詢,看看它是如何執行的。你會看到,分組後應用LIMIT

+0

以前從未使用過'EXPLAIN',看起來相當有用,謝謝! – defaultNINJA

相關問題