2012-10-20 125 views
1

當前我有下面的SQL Select語句的下列元素。儘管如此,查詢似乎仍然很慢(10.000條記錄)。你有什麼建議?PostgreSQL索引優化

  1. 指數CATEGORY_ID
  2. 指數DELIVERY_DATE
  3. 上的product_id指數,PRODUCT_NAME

這裏是我的DDL:

Create table product ( 
    product_id serial, 
    category_id int2, 
    product_name varchar(50), 
    delivery_date timestamp, 
    subtitle varchar(20), 
    price numeric(10,2), 
    retail_price numeric(10,2), 
    language_id int2, 
    store_id int2, 
    reseller_id int2  
); 

和SQL:

Select * 
from product 
WHERE delivery_date > '2012-10-20 06:00:00' AND category_id = 1 
ORDER BY product_id, product_name; 

任何幫助,將不勝感激。

下面的輸出EXPLAIN分析一下:

Sort (cost=18.11..18.12 rows=1 width=119) (actual time=0.064..0.064 rows=0 loops=1) 
Sort Key: product_id, product_name 
Sort Method: quicksort Memory: 25kB 
    -> Seq Scan on product (cost=0.00..18.10 rows=1 width=119) (actual time=0.019..0.019 rows=0 loops=1) 
Filter: ((delivery_date > '2012-10-20 06:00:00'::timestamp without time zone) AND (category_id = 1)) 
Total runtime: 0.098 ms 
+3

編輯你的問題,並粘貼'explain analyze <你的選擇語句>'的輸出。 –

+3

請參閱http://stackoverflow.com/tags/postgresql-performance/info - 請顯示Pg版本,'EXPLAIN(BUFFERS,ANALYZE)'輸出等。 –

回答

0

您所查詢的絕對理想的配置將是有複合索引(delivery_date, category_id, product_id)(category_id, delivery_date, product_id)

實際上,索引僅爲(category_id, product_id)可能足以獲得可接受的性能。

無論如何,EXPLAIN ANALYZE <original_query>是你最好的朋友。

還有一個注意事項:在您的查詢中,ORDER BY product_id, product_name總是會得到與簡單ORDER BY product_id相同的結果。

+0

謝謝您的回答。即使我不需要在查詢中進行排序的product_name,爲什麼我們不需要將product_name添加到複合索引? – user1761691

+0

正是因爲如此。如果由於某種原因,您決定不在查詢中使用product_id(在ORDER BY或WHERE子句中),但使用了product_name,則應該在其中添加product_name的複合索引 – mvp

+0

因此,通常所說的複合索引應該包含所有「where」和「sort」子句的列? – user1761691