[英]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.