Как написать правильный / эффективный запрос

#postgresql

#postgresql

Вопрос:

У меня вопрос о правильном способе написания запроса.

У меня есть таблица employees, допустим, в ней 4 столбца employee_id , department , salary , email .

Есть несколько записей без адреса электронной почты, я хотел бы найти наиболее эффективный способ написания SQL-запроса с использованием функции window, которая выводит сумму заработной платы для каждой группы, разделенную на все записи без адреса электронной почты.

У меня есть 2 решения, конечно, только одно эффективно, кто-нибудь может дать какие-либо советы по этому поводу?

 select department, sum(salary) as total
from employees
where email is null
group by 1
  

вариант 1

 select a.department , a.total/(select sum(salary) from employees where email is null) 
from (
  select department, sum(salary) as total
  from employees
  where email is null
  group by 1
) a
  

вариант 2

 select a.department , a.total/sum(a.total) over()
from (
  select department, sum(salary) as total
  from employees
  where email is null
  group by 1
) a
  

Я думаю, что запрос 2 более эффективен, но правильно ли это? и действительно ли оставлять предложение over пустым?

Только что начал использовать PostgreSQL вместо MySQL 5.6.

Ответ №1:

Ваш второй запрос лучше.

Первый запрос должен сканироваться employees дважды, в то время как вторая таблица сканирует только (надеюсь, меньший) набор результатов подзапроса для вычисления суммы.

Вполне допустимо оставить OVER предложение пустым, это просто означает, что все результирующие строки получат одинаковое значение (именно то, что вы хотите).