2016-05-15 4 views
0

私は2つのテーブルを持っています。ニューステーブルには7mのレコードがあり、news_publishテーブルには70mのレコードがあります。 このクエリを実行すると膨大な時間と非常に時間がかかります。 チューニングのために3つのインデックスを追加しますが、クエリは遅いです。 私は誰かが1000年にその変更の統計を提案することを発見し、この問題をGoogleと私はそれをチャゲが、問題はまだpostgresqlの日付クエリのクエリのパフォーマンス

alter table khb_news alter submitteddate set statistics 1000; 

SELECT n.id as newsid ,n.title,p.submitteddate as publishdate, 
    n.summary ,n.smallImageid , 
    n.classification ,n.submitteddate as newsdate, 
    p.toorganizationid 

from khb_news n 
    join khb_news_publish p  
     on n.id=p.newsid  
    left join dataitem b on b.id=n.classification 

where 
    n.classification in (1) and n.newstype=60 
    AND n.submitteddate >= '2014/06/01'::timestamp AND n.submitteddate <'2014/08/01'::timestamp and p.toorganizationid=123123 
order by p.id desc 

limit 10 offset 0 

インデックスであるとき:

CREATE INDEX "p.id" 
ON khb_news_publish 
USING btree 
(id DESC); 

CREATE INDEX idx_toorganization 
ON khb_news_publish 
USING btree 
(toorganizationid); 


CREATE INDEX "idx_n.classification_n.newstype_n.submitteddate" 
ON khb_news 
USING btree 
(classification, newstype, submitteddate); 

後にこのインデックスを追加し、分析を説明し実行します私これは私がに説明を追加

"Limit (cost=0.99..10100.13 rows=10 width=284) (actual time=24711.831..24712.849 rows=10 loops=1)" 
     " -> Nested Loop (cost=0.99..5946373.12 rows=5888 width=284) (actual time=24711.827..24712.837 rows=10 loops=1)" 
     "  -> Index Scan using "p.id" on khb_news_publish p (cost=0.56..4748906.31 rows=380294 width=32) (actual time=2.068..23338.731 rows=194209 loops=1)" 
     "    Filter: (toorganizationid = 95607)" 
     "    Rows Removed by Filter: 36333074" 
     "  -> Index Scan using khb_news_pkey on khb_news n (cost=0.43..3.14 rows=1 width=260) (actual time=0.006..0.006 rows=0 loops=194209)" 
     "    Index Cond: (id = p.newsid)" 
     "    Filter: ((submitteddate >= '2014-06-01 00:00:00'::timestamp without time zone) AND (submitteddate < '2014-08-01 00:00:00'::timestamp without time zone) AND (newstype = 60) AND (classification = ANY ('{19,20,21}'::bigint[])))" 
     "    Rows Removed by Filter: 1" 
     "Planning time: 3.871 ms" 
     "Execution time: 24712.982 ms" 

を説明します どのようにクエリを変更してより速くすることができますか?

あなたがkhb_news_publish(toorganizationid、ID)にインデックスを作成して開始する必要があります
+0

をそのように説明書式設定を修正してくださいhttps://explain.depesz.comのようなツールで動作します –

+0

私はそれを変更しますhttps://explain.depesz.com/s/Gymで説明を追加しました –

+0

'CREATE INDEX" p.id "ON khb_news_publish USING btree(id DESC); 'IMHOこれはプライマリキーであったはずです(これは**ユニーク*インデックス)。他のテーブルと同様に、FKのサポートインデックスを追加するよりも、候補キーのユニークインデックスを追加するよりも、PK + FKを制約することから始めます。 – wildplasser

答えて

2

CREATE INDEX idx_toorganization_id 
ON khb_news_publish 
USING btree 
(toorganizationid, id); 

これは、問題を修正する必要がありますが、あなたはまた、インデックスが必要な場合があります:

CREATE INDEX idx_id_classification_newstype_submitteddate 
ON khb_news 
USING btree 
(classification, newstype, submitteddate, id); 
+0

khb_newsに3つの列を持つインデックスがあります。このインデックスを削除し、idx_id_classification_newstype_submitteddateを追加しますか?またはこれを追加 –

+0

この2つのインデックスを追加した後に説明がありますhttps://explain.depesz.com/s/SS5H –

+0

この2つのインデックスを追加し、https://explain.depesz.com/s/SS5Hで説明してください –