Postgresql:如何动态查询hstore?

问题描述 投票:2回答:1

我有以下表格

  • ORDER (idOrder int, idCustomer int) [PK: idOrder] 。
  • ORDERLINE (idOrder int, idProduct int) [PK: idOrder, idProduct] 。
  • PRODUCT (idProduct int, rating hstore) [PK: idProduct] 。

在PRODUCT表中,'rating'是一个keyvalue列,其中key是一个idCustomer,value是一个整数的rating。

查询的目的是 统计包含客户给予好评的产品的订单数量。 看起来是这样的。

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
1个回答
1
投票

我怀疑是因为在第一个查询中,你在做。

p.rating->(o.idcust::varchar)::int

一次一行,因为查询迭代了其余的操作, 而在第二个查询中,hstore的值是在一次查询中扩展的。如果你想了解更多的情况,可以使用explain analyze。

https:/www.postgresql.orgdocs12sql-explain.html

© www.soinside.com 2019 - 2024. All rights reserved.