#database #postgresql #join
#База данных #postgresql #Присоединиться
Вопрос:
В SQL-запросе мне приходится объединять много таблиц, и это очень дорого для DB.
В БД в группе хостов много хостов, около 20 групп хостов, и есть 4 группы хостов, которые я не использую…
Я блуждал, добавлю ли я в свой запрос оператор «not in», исключая эти 4 hostgroup, запрос будет дешевле? или просто усугубить ситуацию, используя больше ресурсов в db?
это мой запрос, на всякий случай…
select history.clock, hstgrp.name as hostgroup, hstgrp.groupid as hgid , hosts.name as hostname ,
items.name as item, hosts.hostid, history.value as porcentaje, items.key_ as key ,items.itemid,
applications.name as appname, applications.applicationid as appid
FROM history
join items_applications on history.itemid = items_applications.itemid
join applications on items_applications.applicationid = applications.applicationid
join items on items.itemid = history.itemid
join hosts on items.hostid = hosts.hostid
join hosts_groups on hosts.hostid = hosts_groups.hostid
join hstgrp on hosts_groups.groupid = hstgrp.groupid
where lower(items.name) SIMILAR TO lower('Used disk space%|Used disk space on%')
and hstgrp.name not in ('Discovered', 'Discover VMs') <==============
Ответ №1:
Дополнительный фильтр, конечно, не может повредить, но если он не очень избирательный, он, вероятно, не значительно сократит время выполнения.
Я вынужден гадать, поскольку вы не добавили EXPLAIN (ANALYZE, BUFFERS)
выходные данные к вопросу, но я бы предположил, что запрос возвращает много строк и должен быть медленным.
Вы могли бы изменить SIMILAR TO
условие на
WHERE lower(items.name) LIKE lower('Used disk space%')
и поддержка его индексом:
CREATE INDEX ON items (lower(name) text_pattern_ops);
Возможно, это несколько ускорит выполнение.