"Entries" where "Login" LIKE 'something%' выполнялся 32 минуты (поле Login проиндексировано), какие есть способы его ускорить? При этом точное значение ищется за 50-100мс
Покажите explain analyze
Лучше покажите что положено для того, чтобы помогать в таких случаях. ;) 1. Полную версию PosgreSQL ("SELECT version();"). 2. Запрос и план — именно EXPLAIN (ANALYZE, BUFFERS) 3. \d+ таблицы Всё текстом, конечно (можно на paste site). В данном случае сначала можно просто EXPLAIN, остальное обязательно.
Что такое \d+? Ок, запустил explain, видимо ещё 30+ минут :)
Метакоманда в psql. Ну и пока можно просто EXPLAIN, опять-таки.
PostgreSQL 13.1 (Debian 13.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit Gather (cost=1000.00..61233670.30 rows=401943 width=48) Workers Planned: 2 " -> Parallel Seq Scan on ""LeakEntries"" (cost=0.00..61192476.00 rows=167476 width=48)" " Filter: ((""Login"")::text ~~ 'Execute error%'::text)" JIT: Functions: 2 " Options: Inlining true, Optimization true, Expressions true, Deforming true"
Видно, что индекс не используется. Давайте \d+. ;) И с такой версией PostgreSQL можно (лучше) сразу показывать EXPLAIN (ANALYZE, BUFFERS, SETTINGS /*, VERBOSE*/) SELECT ...
select * from pg_stats where tablename='Entries' and attname='Login'; select name,setting from pg_settings where name~'cost';
Что-то не могу запустить psql (я юзаю докер контейнер): # psql psql: error: FATAL: role "root" does not exist
autovacuum_vacuum_cost_delay,2 autovacuum_vacuum_cost_limit,-1 cpu_index_tuple_cost,0.005 cpu_operator_cost,0.0025 cpu_tuple_cost,0.01 jit_above_cost,100000 jit_inline_above_cost,500000 jit_optimize_above_cost,500000 parallel_setup_cost,1000 parallel_tuple_cost,0.1 random_page_cost,4 seq_page_cost,1 vacuum_cost_delay,0 vacuum_cost_limit,200 vacuum_cost_page_dirty,20 vacuum_cost_page_hit,1 vacuum_cost_page_miss,10
sudo -u postgres psql
Ну так root и не является пользователем в postgres (не должен, по крайней мере). Вы заходите под тем пользователем, который используется приложением.
Похоже на стандартные настройки... вообще, tuning почти наверняка следует заняться.
разобрался, нужно было создать роль. https://pastebin.com/raw/PhhT2d3E
Так, а encoding / collation у этой базы какой (можно посмотреть с помощью \l)?
UTF8 | en_US.utf8
Неподходящий у Вас индекс для этого запроса, в таком случае. Нужен с varchar_pattern_ops, см. https://www.postgresql.org/docs/current/indexes-opclass.html
Не уверен, что b-tree умеет like обрабатывать. Нашел такую тему https://www.sql.ru/forum/1053727/pomogite-sostavit-indeks-dlya-zaprosov-vida-like-text
LIKE 'something%' умеет, см. выше.
Такой? CREATE INDEX some_index ON my_table (Login varchar_pattern_ops);
Да, примерно так.
Спасибо. А вообще, мб я не ту СУБД выбрал и мне нужно какую-нибудь key-value базу брать? (ещё нюанс в том, что пары key-value должны быть уникальными, в sql я могу просто запросом лишнее поудалять, а в key-value как-то сложно всё это)
Да не за что. Вообще, можно C locale сразу использовать для таких полей (кому какое дело, как именно сортируются Login-ы в результатах запросов? ;) ). > А вообще, мб я не ту СУБД выбрал и мне нужно какую-нибудь key-value базу брать? Это уж Вам виднее, какие требования. IMNSHO, нужны Вам реляционка + ACID + SQL — берите PostgreSQL, а если нет — не берите. ;)
> LeakEntries ух негодник
действительно, не хочу платить бабки, чтобы проверить, утекли ли мои данные = негодник)
Когда-то давно мы с Федей написали расширение wildspeed для этого, которое индексирует все перестановки, поэтому пригодно для коротких строк https://github.com/postgrespro/wildspeed
Обсуждают сегодня