我在这里附加了一个查询,分析结果https://explain.depesz.com/s/x9BN
这是查询
EXPLAIN ANALYZE
SELECT
branches.id as branch_id,
date(products.created_at + interval '1 hours 0 minutes') as date,
SUM(total_amount) as totalamount
FROM "products"
INNER JOIN "branches" ON "branches"."id" = "products"."branch_id"
WHERE (products.order_status_id NOT IN (10, 5, 50))
AND (products.company_id = 190)
AND (
products.created_at
BETWEEN '2019-01-30 23:00:00.000000'
AND '2019-12-30 23:00:00.000000'
)
GROUP BY branches.id, date;
在这里我可以看到更多时间花在
NOT IN()
的使用上。我们还有其他功能可以用来提高性能吗?
最佳答案
您的时间花在了许多包含您要搜索的行的表块上。也许许多块没有被缓存,并且存储不是很快。
此查询可能永远不会像闪电一样快,但是您可以尝试以下两种方法:
CREATE INDEX ON products (company_id, creazed_at);
CLUSTER products USING idx_products_company_and_branch;
然后,将所需的行集中在较少的表块中,因此读取它们应该更快。
请注意,
CLUSTER
会阻止其在运行时对表的所有访问,并且由于该表随修改的顺序而降低,因此必须不时地对其进行重复。 关于sql - 似乎NOT IN降低了Postgresql查询的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60025460/