尝试为带有前导和尾随通配符的 ILIKE 查询创建索引,从 xml 数据列中的列中抓取

问题描述 投票:0回答:1

我有以下查询导致性能问题,我正在尝试为其创建索引:

SELECT inst.policydraftinstanceid, Client.*, 
    COALESCE( ssn, tin ) TaxId
    FROM ypolicydraftinstance inst, XMLTABLE( '/policy-draft-xml/policy/clients/nb-client/roles/role' PASSING policydraftxml COLUMNS 
       name text PATH '../../client/detail/name',
       clientCompositeId text PATH '../../@client-composite-id',
       clientType text PATH '../../client/detail/@type',
       roleType text PATH '@type',
       ssn text PATH '../../client/detail/tax-id/@value',
       tin text PATH '../../client/detail/tax-id/@value',
       dateOfBirth text PATH '../../client/detail/date-of-birth'
       ) Client
     WHERE  Client.Name  ILIKE  '%829116417%' ... more comparisons....

我已经尝试过:

CREATE INDEX test_idx1 ON ypolicydraftinstance USING GIN ( CAST( xpath('/policy-draft-xml/policy/clients/nb-client/client/detail/name/text()', policydraftxml) AS TEXT) gin_trgm_ops ); 

但由于 xpath 不是不可变函数,它不会让我运行此查询。 我用不可变的强制转换来包装它是否安全?我将如何有效地做到这一点?名称不会经常更改,但可以更改名称,因此从完美的意义上来说,它并不是一成不变的。对于性能改进或不同的索引方式还有其他建议吗?谢谢。

sql database postgresql performance indexing
1个回答
0
投票

xml -> 文本是不可变的,所以我不认为 xml[] -> 文本有任何不可变的原因。但是从数组类型到文本的自动转换被标记为稳定的,而不是不可变的。我认为这是因为某些类型已转换为可变的文本,并且系统在通用性级别上处理它,不区分数组类型的子类型。因此,您可以定义自己的函数来执行相当于强制转换的操作。

名称不会经常更改,但可以更改名称

这不是不可变的意思。当然,如果输入改变,输出也会改变。不可变意味着如果输入不改变,输出就不能改变(这样它就不依赖于时区或default_text_search_config之类的东西)

但是很难看出这对你有什么用,因为索引和 WHERE 测试不是在同一个表达式上。

© www.soinside.com 2019 - 2024. All rights reserved.