SQL:如何使用1+;数百万张唱片

SQL:如何使用1+;数百万张唱片,sql,postgresql,performance,join,indexing,Sql,Postgresql,Performance,Join,Indexing,我想使用下面的查询连接两个表(“products”表有150万条记录),但15分钟后查询仍在运行,我的电脑过热(这是一款联想v330-14ikb,内存为8gb),因此我停止了它 我对索引非常陌生,我尝试创建以下内容: 在订单上创建索引customer\u id\u idx1(customer\u id) 在产品上创建索引customer\u id\u idx2(customer\u id) 在订单上创建索引customer\u id\u revenues\u idx(customer\u id

我想使用下面的查询连接两个表(“products”表有150万条记录),但15分钟后查询仍在运行,我的电脑过热(这是一款联想v330-14ikb,内存为8gb),因此我停止了它

我对索引非常陌生,我尝试创建以下内容:

  • 在订单上创建索引customer\u id\u idx1(customer\u id)
  • 在产品上创建索引customer\u id\u idx2(customer\u id)
  • 在订单上创建索引customer\u id\u revenues\u idx(customer\u id,revenues)
  • 在产品上创建索引客户id成本(客户id,成本)
以下是查询:

SELECT a.customer_id, (SUM(a.revenues) / SUM(b.costs) :: FLOAT) AS roi
FROM orders a
JOIN products b
ON a.customer_id = b.customer_id
WHERE a.customer_id IN (
    SELECT customer_id FROM (SELECT 
        customer_id,
        COUNT(*) AS n_products
    FROM products
    GROUP BY 1
    ORDER BY 2 DESC
    LIMIT 5) x
)
GROUP BY a.customer_id  
ORDER BY roi DESC
输出应返回前5名客户购买产品数量的收入/成本比率

我正在使用pgadmin。有人能告诉我如何加速并使其编译吗?
提前谢谢你。

我想你不需要像我所说的那样加两倍

select customer_id, roi
from (
  select o.customer_id, 
         sum(o.revenues) / sum(p.costs)::float as roi, 
         count(*) as n_products
  from orders o
    join products p on o.customer_id = p.customer_id
  group by o.customer_id  
  order by n_products
  limit 5
) t
order by roi desc
或者,尝试分别聚合这两个表,然后合并结果:

select o.customer_id, o.revenues / p.costs::numeric as roi
from (
  select customer_id, sum(revenues) as revenues
  from orders
  group by customer_id
) o
  join (
    select customer_id, sum(costs) as costs, count(*) n_products
    from products
    group by customer_id
  ) p on p.customer_id = o.customer_id
order by p.n_products desc
limit 5  

请提供示例数据、所需结果以及代码应执行的操作的清晰解释。请回答您的问题并添加使用
explain(format text)
(因为您无法运行
explain(analyze)
)生成的问题,并确保保留计划的缩进。粘贴文本,然后将
`
放在计划前一行和计划后一行。还请包括所有索引的完整
create index
语句。我正在尝试,但不幸的是,我对sql和stackoverflow比较陌生,不知道执行计划是什么。但我正试图像你一样编辑这个问题said@123_stack您只需将
explain
放在查询文本的前面,然后运行它。如果您使用的是GUI客户机,可能会有不同的方法,但是如果您需要特定数据库客户机程序的建议,您需要告诉我们它是什么。@jjanes:知道了,谢谢!谢谢你的回复!我试过你的解决办法,但问题仍然存在。几分钟后,它仍在运行。不知道是RAM还是索引有问题。例如,当我尝试使用相同的查询,但筛选特定的customer_id(例如,其中customer_id=779),而不是在5秒钟内编译的子查询时。但在按产品筛选前5名客户时,速度太慢了。@123\u stack:这里有点不对劲。订单有多少行?订单表有3.2万条记录,产品表有150万条记录records@123_stack:我添加了另一个解决方案。您的新解决方案有效!无法告诉你我有多感激,非常感谢你。你能解释一下是什么引起了这个问题吗?我是sql新手,还有很多东西要学