找不到改进PostgreSQL查询的方法

ca1c2owp  于 2023-02-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(94)

在我的PostgreSQL数据库中,我有6个名为storeAPrices,storeBprices等的表,包含相同的列和索引,如下所示:

  • 项目代码(字符串,主键)
  • item_name(字符串,b树索引)
  • 是_whigthed(编号:0|1,betree索引)
  • 项目_价格(编号)

我希望通过item_code或item_name相似性将每个storePrices表连接到其他表,但是“OR”应该像编程语言中那样起作用(只有当left为false时才检查右侧)。
当前,我的查询性能较低。

select 
*
FROM "storeAprices" sap
left JOIN LATERAL (
                        SELECT *  FROM "storeBPrices" sbp  
                        WHERE                       
                    
  similarity(sap.item_name,sbp.item_name) >= 0.45
                        ORDER BY similarity(sap.item_name,sbp.item_name) DESC
                        limit 1
                      ) bp ON case when sap.item_code = bp.item_code then true else sap.item_name % bp.item_name end 
left JOIN LATERAL (
                        select * FROM "storeCPrices" scp                       
                        WHERE                     similarity(sap.item_name,scp.item_name) >= 0.45
                        ORDER BY similarity(sap.item_name,scp.item_name) desc
                        limit 1
                      ) rp ON case when sap.item_code = rp.item_code  then  true else sap.item_name % rp.item_name end

这是我的查询的一部分,花了太多时间来响应。我的数据不是很大(每个表15k项)
我还有一个索引“is_whigthed”,我不知道如何使用它。(我不想设置它为变量,因为我想得到所有“is_whigthed”的结果)
有什么建议吗?

qc6wkl3g

qc6wkl3g1#

OR应该比用例更快

bp ON sap.item_code = bp.item_code OR sap.item_name % bp.item_name

你也可以像pg_trgm模块文档中提到的那样在item_name列上创建三元组索引,因为你使用了它的%操作符来表示相似性

相关问题