我的目标是优化耗时约 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}}索引。此属性为_id
或b-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
可能会提高查询性能。还有其他方法可以优化此类查询吗?