postgresql中的串联索引

swvgeqrz  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(2)|浏览(156)

基本上,我是通过匹配两个表中的字符串来匹配地址的
表B有500万行,所以我不想每次匹配地址时都为它创建新列
所以我考虑创建索引,我当前匹配地址的索引如下所示:

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

但是这不起作用,因为它不接受连接栏
我的更新查询将等于= b. sub_building_name||","||b.建筑物名称
如果没有新列和索引,这将花费数小时
有没有办法在不创建新的串联列的情况下实现这一点?

qlfbtfca

qlfbtfca1#

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

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

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

uxhixvfz

uxhixvfz2#

要通过LIKE或ILIKE进行匹配,可以创建gin索引,如下所述https://niallburkley.com/blog/index-columns-for-like-in-postgres/

CREATE INDEX CONCURRENTLY idx_match_building 
   ON tableB USING gin ( (sub_building_name || ', ' || building_name) gin_trgm_ops);

验证是否已通过此查询启用扩展模块

SELECT * FROM pg_extension where extname = 'pg_trgm';
+-------+---------+----------+--------------+----------------+------------+-----------+--------------+
| oid   | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition |
|-------+---------+----------+--------------+----------------+------------+-----------+--------------|
| 17458 | pg_trgm | 10       | 17455        | True           | 1.3        | <null>    | <null>       |
+-------+---------+----------+--------------+----------------+------------+-----------+--------------+

关于为什么concat不会削减它的相关信息:)https://www.postgresql.org/message-id/1409893231867-5817884.post%40n5.nabble.com

相关问题