【问题标题】:Table Indexing on PostgreSQL for performancePostgreSQL 上的表索引以提高性能
【发布时间】:2018-04-20 09:40:04
【问题描述】:

我正在解决 PostgreSQL 的性能问题,我有下表:

 CREATE TABLE main_transaction (
   id integer NOT NULL DEFAULT nextval('main_transaction_id_seq'::regclass),
   description character varying(255) NOT NULL,
   request_no character varying(18),
   account character varying(50),
   ....
 )

上面的表有 34 列,包括 3 个FOREIGN KEYs,它有超过 100 万行数据。我有以下条件SELECT 查询:

SELECT * FROM main_transaction
WHERE upper(request_no) LIKE upper(concat('%','20080417-0258-0697','%'))

在 2 秒内返回结果。我想通过使用表索引来减少工作时间。到目前为止,我使用了btree 索引。但是,我没有注意到任何快速的结果。我的问题是,如何提高上述查询的性能?

【问题讨论】:

  • 为什么是%?搜索字符串已经具有该列的最大长度...
  • ('%','20080417-0258-0697','%') -> (('%',:field,'%') )

标签: postgresql indexing database-performance


【解决方案1】:

搜索以% 开头的模式的唯一机会是三元组索引:

CREATE EXTENSION pg_trgm;

CREATE INDEX ON main_transaction
   USING gin (upper(request_no) gin_trgm_ops);

【讨论】:

  • 太棒了!我的表中也有外键,并且我正在使用 CROSS JOIN 通过 id 链接表,这会导致性能下降。我在main_transaction 表中有一个profile_id 列,用于profile 表,在配置文件表中我有customer_id 用于customer 表。 SELECT * FROM main_transaction t CROSS JOIN main_profile p CROSS JOIN main_customer c WHERE t.profile_id = p.id AND p.user_id = c.id AND ( upper(t.request_no) LIKE upper(concat('%','0-90-6 12 ','%')) OR upper(c.phone) LIKE upper(concat('%','0-90-6 12','%')) )。谢谢
  • 好吧,那就开个题吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2015-04-28
  • 2013-12-05
  • 1970-01-01
  • 2014-11-25
  • 2017-03-06
相关资源
最近更新 更多