我有以下表格
在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的所有值会很低效,但似乎恰恰相反。是不是我的第一个查询写的不对?
我怀疑是因为在第一个查询中,你在做。
p.rating->(o.idcust::varchar)::int
一次一行,因为查询迭代了其余的操作, 而在第二个查询中,hstore的值是在一次查询中扩展的。如果你想了解更多的情况,可以使用explain analyze。