小编Mic*_*cht的帖子

如何使用多个 LIKE 运算符并使用索引

在我的查询中,我想找到与许多 LIKE 运算符之一匹配的行。我知道 3 种方法,但只有其中一种可以使用索引。

让我们从表开​​始:

CREATE TABLE dir (
    id BIGSERIAL PRIMARY KEY,
    path TEXT NOT NULL
);

CREATE INDEX path_idx ON dir(path TEXT_pattern_ops);
Run Code Online (Sandbox Code Playgroud)

插入示例数据后,我可以执行以下操作:

EXPLAIN ANALYZE 
SELECT id, path FROM dir
   WHERE path LIKE 'A%'
      OR path LIKE 'B%'
      OR path LIKE 'C%';
Run Code Online (Sandbox Code Playgroud)

以上查询正确使用索引。

第二种方式:

EXPLAIN ANALYZE 
SELECT id, path FROM dir
  WHERE path LIKE ANY(ARRAY['A%', 'B%', 'C%']::TEXT[]);
Run Code Online (Sandbox Code Playgroud)

此查询不会使用索引。我知道的最后一种方法:

CREATE TABLE patterns (pattern) AS VALUES
('A%'),
('B%'),
('C%');

EXPLAIN ANALYZE 
SELECT id, path FROM dir
  JOIN patterns ON …
Run Code Online (Sandbox Code Playgroud)

sql postgresql query-optimization sql-like

5
推荐指数
1
解决办法
214
查看次数

将 SQL 结果拆分为最大大小 = n 的组

我有一张桌子

 id | volume_id| ... |
----+----------+-----+
  1 |       1  | ... |
  2 |       2  | ... |
  3 |       1  | ... |
  4 |       3  | ... |
  5 |       2  | ... |
  ...
Run Code Online (Sandbox Code Playgroud)

我可以做一个简单的分组查询:

select volume_id, count(*), min(id) as min_id, max(id) as max_id
from my_table
group by volume_id;
Run Code Online (Sandbox Code Playgroud)

这将产生结果:

 volume_id | count | min_id | max_id    
-----------+-------+--------+--------
         1 | 67330 |  ...   | ...
         2 | 67330 |  ...   | ...
         3 | 67330 | …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

4
推荐指数
1
解决办法
1596
查看次数

标签 统计

postgresql ×2

sql ×2

plpgsql ×1

query-optimization ×1

sql-like ×1