Удешевление запроса postgres для БД

#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);
  

Возможно, это несколько ускорит выполнение.