2017-10-18 60 views
-1

我有一个查询至极的样子:PostgreSQL的模式匹配性能

SELECT * 
FROM my_table 
WHERE 'some_string' LIKE mytable.some_column || '%%' 

我如何索引我some_column柱改善查询性能? 或者它是一个更好的方式来过滤这个?

+0

请确认:' 'some_string'LIKE mytable.some_column || '%'',而不是'mytable.some_column LIKE'some_string%''?如果是这样,您的字符串可以多长时间(分钟/平均/最大)?表中有多少行,有多少个不同的字符串?另外:您的Postgres版本和表定义显示相关列的数据类型和约束以及您拥有的相关索引。 –

回答

1

该断言有效搜索指定字符串的所有前缀:

WHERE 'some_string' LIKE mytable.some_column || '%' 

也许%是你的客户,需要与其他%转义特殊字符传递文字%,否则'%%'会只是噪音,可以用'%'来代替。

最有效的解决方案应该是一递归CTE(或类似)完全匹配的每一个的前缀,从some_column = left('some_string', 1),高达some_column = left('some_string', length('some_string'))(= 'some_string')。

你只需要在此列一个简单的B树索引。根据您的实现细节,部分表达指数可能会提高性能...

相关:

+0

我可以提供rCTE,但首先澄清你的问题,谢谢。 –

+0

谢谢,我想我有足够的了解如何解决这个问题。这似乎是一个普遍的问题。 – Egg

0

我相信你打算写下面的查询:

SELECT * 
FROM my_table 
WHERE mytable.some_column LIKE 'some_string%'; 

换句话说,你想找到记录,其中一些列用some_string其次是什么开始,可能什么都没有。

据我所知,some_column常规B树索引将是有效的,到一个点,在您的查询。其原因是,Postgres的可以遍历树寻找前缀some_string。一旦发现该条目,超出该索引可能无助。但some_column上的索引应该在这里给你一些性能优势。

其中,下标会帮助将是下面的条件:

WHERE mutable.some_column LIKE '%some_string'; 

在这种情况下,该指数呈现大多是没用的,因为我们有什么前缀的列值不知道应该开始。

+0

你认为错了。 – Egg

+0

@Egg我的回答有什么问题? –