【发布时间】:2020-06-10 14:56:45
【问题描述】:
我有以下表格
- ORDER (idOrder int, idCustomer int) [PK: idOrder]
- ORDERLINE (idOrder int, idProduct int) [PK: idOrder, idProduct]
- PRODUCT (idProduct int, rating hstore) [PK: idProduct]
在 PRODUCT 表中,“rating”是键/值列,其中键是 idCustomer,值是整数评级。
计算包含客户给予好评的产品的订单的查询如下所示:
select count(distinct o.idOrder)
from order o, orderline l, product p
where o.idorder = l.idorder and l.idproduct = p.idproduct
and (p.rating->(o.idcust::varchar)::int) > 4;
查询计划看起来是正确的,但是这个查询需要很长时间。所以我尝试了一个不同的查询,我在其中分解了 hstore 中的所有记录:
select count(distinct o.idOrder)
from order o, orderline l,
(select idproduct, skeys(p.rating) idcustomer, svals(p.rating) intrating from product) as p
where o.idorder = l.idorder and l.idproduct = p.idproduct
and o.idcustomer = p.idcustomer and p.intrating > 4;
这个查询只需要几秒钟。这怎么可能?我认为爆炸 hstore 的所有值会非常低效,但似乎恰恰相反。是否有可能我没有正确编写第一个查询?
【问题讨论】:
标签: postgresql hstore