【问题标题】:Postgresql: how to query hstore dynamicallyPostgresql:如何动态查询 hstore
【发布时间】: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


    【解决方案1】:

    我怀疑这是因为在您执行的第一个查询中:

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

    查询迭代其余操作时一次一行,而在第二个查询中,hstore 值在单个查询中展开。如果您想了解更多信息,请使用 EXPLAIN ANALYZE:

    https://www.postgresql.org/docs/12/sql-explain.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2011-09-22
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 2013-05-24
      相关资源
      最近更新 更多