簡體   English   中英

縮小日期范圍時,SQL查詢花費的時間更長

[英]SQL Query takes much longer when decreasing the date range

我有一個包含日期范圍的查詢。

當查詢中的日期范圍為“>“ 2013-05-01””時,我將在188.300毫秒內得到結果。 但是,如果我將日期范圍更改為“ BETWEEN'2013-05-01'和'2013-08-01'”,則會在1102312.636毫秒后得到結果。 這對我來說根本沒有意義,因為第二個日期范圍包含的數據要少得多。

以下是這兩個查詢及其解釋:

SELECT 
SUM(quantity)
FROM
transaction_master
INNER JOIN transaction_line_items ON transaction_line_items.link_guid = transaction_master.guid
AND master_code = 'AAL027PU' and item_colour = 'BE'
AND (sale_date  > '2013-05-01')
AND transaction_type = 'POSSALE'

說明: http : //explain.depesz.com/s/hPtI

SELECT 
SUM(quantity)
FROM
transaction_master
INNER JOIN transaction_line_items ON transaction_line_items.link_guid = transaction_master.guid
AND master_code = 'AAL027PU' and item_colour = 'BE'
AND sale_date BETWEEN '2013-05-01' AND '2013-08-01'
AND transaction_type = 'POSSALE'

說明: http : //explain.depesz.com/s/WN1

謝謝!

由於以下原因,對查詢計划的檢查表明行數估算值錯誤:

  • 分布不均,統計目標偏低;

  • 過時的統計信息(自動抽真空經常運行嗎?)

  • 查詢計划者的錯誤估計

首先,運行ANALYZE 如果您需要手動執行此操作,則可能意味着autovacuum運行不足,或者您剛剛批量加載了一個表,而autovac尚未開始。

如果那沒有幫助,請調整相關列的統計目標,因此請分析更多行的樣本。

如果您仍然得到相同的估計,則可能表明計划者在錯誤估計輸入組合方式。 那很難處理。 您需要將其報告給pgsql-performance並尋求建議。

您的條件適用於JOIN語句,我懷疑您應該添加WHERE子句。 否則,看起來服務器會在所有表中掃描具有匹配條件的記錄,而不是先過濾掉所需的記錄,然后再進行聯接。 當然,僅使用外鍵進行簡單連接將具有更快的速度。 所以試試這個:

SELECT 
SUM(quantity)
FROM
transaction_master
INNER JOIN transaction_line_items ON transaction_line_items.link_guid = transaction_master.guid
WHERE
    master_code = 'AAL027PU' and item_colour = 'BE'
AND sale_date BETWEEN '2013-05-01' AND '2013-08-01'
AND transaction_type = 'POSSALE'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM