gpt4 book ai didi

sql - 似乎 NOT IN 降低了 Postgresql 查询的性能

转载 作者:行者123 更新时间:2023-12-02 09:04:33 27 4
gpt4 key购买 nike

我在这里附上了一个查询分析结果,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() 花费了更多时间。

我们可以使用其他函数来提高性能吗?

最佳答案

您的时间花在访问包含您搜索的行的许多表 block 上。也许很多 block 没有被缓存,并且存储速度不快。

这个查询可能永远不会像闪电一样快,但你可以尝试以下两件事:

  1. 使用多列索引:

    CREATE INDEX ON products (company_id, creazed_at);
  2. 如果这还不够快,请重写表,以便 block 按索引顺序物理排列:

    CLUSTER products USING idx_products_company_and_branch;

    然后所需的行集中在较少的表 block 中,因此读取它们应该更快。

    请注意,CLUSTER 在运行时会阻止对表的所有访问,并且必须不时重复执行,因为顺序会随着表的修改而降低。

关于sql - 似乎 NOT IN 降低了 Postgresql 查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60025460/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com