【问题标题】:Concatenated index in postgresqlpostgresql 中的连接索引
【发布时间】:2018-07-10 16:34:02
【问题描述】:

所以基本上我通过匹配 2 个表中的字符串来匹配地址

表 B 有 5m 行,所以我真的不想每次我想匹配地址时都为其创建新列

所以我考虑改为创建索引,我当前匹配地址的索引如下所示:

CREATE INDEX matchingcol_idx  ON tableB USING btree (sub_building_name || ', ' || building_name )

但这不起作用,它不接受连接栏

我的更新查询将等于 = b.sub_building_name || ', ' || b.building_name

如果没有新列和索引,这将需要几个小时

有没有办法在不创建新的串联列的情况下实现这一点?

【问题讨论】:

  • 你到底想做什么?你想使用这个索引加速更新查询,还是普通的 SELECT 查询?请显示要使用该索引优化的 SQL 查询。

标签: sql postgresql indexing


【解决方案1】:

对于基于表达式的索引,您需要将表达式放在括号之间:

CREATE INDEX matchingcol_idx  
   ON tableB USING btree ( (sub_building_name || ', ' || building_name) );

但是,如果您在where 子句中完全使用相同的条件,则会使用该索引。任何仅引用其中一列的条件都不会使用该索引。

【讨论】:

  • 所以我做的任何其他匹配都需要我创建一个新索引。它肯定会在几分钟而不是几个小时内奏效,谢谢!
  • @Luffydude:也许(sub_building_name, building_name) 上的多列索引是更好的选择。但是如果没有您的查询和完整的表定义,这是不可能回答的
  • 事情是,为了匹配字符串,我需要用子字符串、left、upper、逗号和中间没有逗号来做一些猴子业务,所以我不确定。我必须编写至少 18 条不同的更新语句,但它只得到了 95% 的字符串 lol
  • @Luffydude:再次:没有查询,这是不可能回答的。您应该提出一个新问题,其中显示一些示例数据以及您希望如何处理这些数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2022-11-02
  • 2013-07-21
  • 2021-06-16
  • 2018-04-15
  • 1970-01-01
  • 2021-07-13
相关资源
最近更新 更多