簡體   English   中英

PostgreSQL簡單查詢優化

[英]PostgreSQL simple query optimization

PostgreSQL 8.4; 三個表 - 商店(~100k,pk id,fk supplier_id&item_id),供應商(~10 pk supplier_id),item(~1000 pk item_id);

我創建了以下查詢以獲取我需要的數據:

SELECT store.quantity, store.price, x.supplier_name
FROM store NATURAL JOIN
     (SELECT * FROM item NATURAL JOIN supplier) AS x 
 WHERE store.price > 500 AND store.quantity > 0 AND
       store.quantity < 100 AND
       x.item_name = 'SomeName';

查詢計划:

Nested Loop  (cost=20.76..6513.55 rows=8 width=229)
  ->  Hash Join  (cost=20.76..6511.30 rows=8 width=15)
        Hash Cond: (store.item_id = item.item_id)
        ->  Seq Scan on store  (cost=0.00..6459.00 rows=8388 width=23)
              Filter: ((price > 500::numeric) AND (quantity > 0) AND (quantity < 100))
        ->  Hash  (cost=20.75..20.75 rows=1 width=8)
              ->  Seq Scan on item  (cost=0.00..20.75 rows=1 width=8)
                    Filter: ((item_name)::text = 'SomeName'::text)
  ->  Index Scan using supplier_pkey on supplier  (cost=0.00..0.27 rows=1 width=222)
        Index Cond: (supplier.supplier_id = store.supplier_id)

現在的目標是通過優化查詢本身來降低成本30%以上。 我發現的這個問題的唯一實例是通過修改表或服務器設置來解決的,但我希望通過修改除查詢以外的其他內容來實現這一點,而這正是我在研究方面做得不夠的地方。

顯然,要解決的問題是Seq Scan,這讓我想到我需要安排它以便掃描/過濾僅應用於商店表的一個子集 - 但是在任何這種情況下你都需要掃描表格,所以也許使用別的東西而不是Seq Scan? 索引掃描沒有幫助,因為我不會被索引過濾...我在這里感到困惑,因為這似乎是PostgreSQL優化器所做的更多選擇,而不是我可以隨意改變的東西......

(如果你想知道,這是作業的一部分,我在這里問,因為我花了幾個小時研究這個問題沒有找到任何相關的東西,我只是放棄了它,但我仍然很好奇...)

您可以使用索引修復此問題。 由於“自然連接”,有點難以分辨鍵是什么。 (我建議using而不是natural join這樣你至少可以看到正在使用的鍵,如果其中一個表被修改,它不會搞亂連接。)

我認為item(item_name, item_id)上的索引可以幫助查詢計划。

將難以優化,因為它看起來不錯,嘗試這樣來避免子查詢:

SELECT 
    store.quantity, 
    store.price, 
    supplier.supplier_name 
FROM store 
    INNER JOIN item
        ON store.item_id = item.item_id
    INNER JOIN supplier
        ON supplier.supplier_id = store.supplier_id
        AND supplier.item_name = 'SomeName'
WHERE 
    store.price > 500 
    AND store.quantity BETWEEN 0 AND 100;

使用BETWEEN會更好。

另外,添加索引

  • store.item_id
  • item.item_id
  • supplier.item_name

暫無
暫無

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

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