优化左联接查询PostgreSQL

时间:2019-07-23 12:39:41

标签: left-join postgresql-performance postgresql-11

我的目标是优化耗时约 142s public_html查询。每个表都有大约 6000万条记录。我的PostgreSQL / OS版本是在Ubuntu(6核,32GB RAM)上运行的以下PostgreSQL 11.4

我想加入2个表,这些表通过多对1 关系(left join)链接。这两个表都是根据以下脚本创建的:

ObserverNodeOccurrence <1--*> ObserverNodeOccurrence_NodeElements

两个表都有/* ~50M records */ CREATE TABLE ObserverNodeOccurrence ( _id TEXT, operation TEXT (...), ); /* ~60M records */ CREATE TABLE ObserverNodeOccurrence_NodeElements ( _id TEXT, occurrenceId TEXT REFERENCES ObserverNodeOccurrence(_id) NOT NULL, element TEXT, (...) ); 的{​​{1}}索引。还有b-tree的{​​{1}}索引。此属性为_idb-tree

我的目标是对最常删除的元素进行排名,即计算operation的{​​{1}}的排名,这些排名链接到addition,其中removal

我的查询如下:

ObserverNodeOccurrence_NodeElements

并产生以下输出:

element

我使用ObserverNodeOccurrence重新运行查询,并得到以下输出(click here for a more readable output):

operation = "removal"

两个表上的SELECT occ_ne.element, COUNT(*) FROM ObserverNodeOccurrence as occ LEFT JOIN ObserverNodeOccurrence_NodeElement" as occ_ne ON occ._id = occ_ne.occurrenceId WHERE occ.operation = 'removal' GROUP BY 1 ORDER BY 2 DESC; 类型均为/script', 18066193 /div', 2607379 /iframe', 2038213 /html[1]/body[1]/div[7]', 314568 /html[1]/body[1]/div[8]', 112086 /font', 105911 /html[1]/body[1]/div[9]', 102986 /html[1]/body[1]/div[11]', 61703 /form', 47065 /html[1]/body[1]/div[10]', 41479 /img', 39970 /html[1]/body[1]/div[12]', 25503 ./iframe[2]', 18647 ./font[1]/font[1]/input[1]', 12008 <... about 50 more rows of results ...> 毫无用处。我在某处读到,将其更改为explain analyze可能会提高查询性能。还有其他方法可以优化此类查询吗?

0 个答案:

没有答案