在我的查询中,我想找到与许多 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) 我有一张桌子
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)