我在这里附加了一个查询,分析结果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/

    10-15 13:01
    查看更多