Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация производительности запроса, с использованием индексов. / 8 сообщений из 8, страница 1 из 1
19.08.2021, 11:11
    #40091718
RonaldLRivest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация производительности запроса, с использованием индексов.
Здравуствуйте. Помогите пожалуйсте решить задачку. Нужно вывести имена сотрудников, которые не были в отпуске в 2020 году. В базе есть сотриднки которые вообще не ходили в отпуск и которые ходили несколько раз. По итогу получается вот такой запрос:

select name
from Employee ep
left join Vacation vc on vc.ID_Employee = ep.ID and (vc.DateBegin like '%2020%' or vc.DateEnd like '%2020%')
where vc.ID_Employee is null


Но это полное сканирование таблицы, при больших объемах запрос будет работать очень медленно, индексы использоваться не будут. Как можно оптимизировать запрос? Сделать его производительнее и так, чтобы можно было работать с индексами?
...
Рейтинг: 0 / 0
19.08.2021, 11:21
    #40091726
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация производительности запроса, с использованием индексов.
RonaldLRivest,

а какие типы у полей vc.DateBegin и vc.DateEnd ???

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
20.08.2021, 10:04
    #40092125
RonaldLRivest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация производительности запроса, с использованием индексов.
Maxim Boguk,
varchar.
...
Рейтинг: 0 / 0
20.08.2021, 10:18
    #40092134
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация производительности запроса, с использованием индексов.
Если varchar и менять это нельзя рекомендую использовать pg_trgm
...
Рейтинг: 0 / 0
20.08.2021, 14:36
    #40092253
RonaldLRivest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация производительности запроса, с использованием индексов.
mozheyko_d
Если varchar и менять это нельзя рекомендую использовать pg_trgm

А если можно менять, то можно как то сделать без применения сторонний модулей?
...
Рейтинг: 0 / 0
20.08.2021, 18:23
    #40092340
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация производительности запроса, с использованием индексов.
RonaldLRivest
mozheyko_d
Если varchar и менять это нельзя рекомендую использовать pg_trgm

А если можно менять, то можно как то сделать без применения сторонний модулей?


Если тип date который и должен быть для даты
то
Код: sql
1.
2.
3.
(vc.DateBegin>='2020-01-01' and vc.DateBegin<='2020-12-31')
OR
(vc.DateEnd>='2020-01-01' and vc.DateEnd<='2020-12-31')



И (возможно) переписать запрос на что то более удобное для базы но тут уже надо сначала
добавить нужные индексы и посмотреть какой план получится.

Или как другой вариант вместо типа date использовать тип daterange
https://www.postgresql.org/docs/13/rangetypes.html#RANGETYPES-BUILTIN
что правильнее будет и удобнее как мне кажется.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
26.08.2021, 12:09
    #40093255
RonaldLRivest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация производительности запроса, с использованием индексов.
Maxim Boguk,
т.е. так?

select name
from Employee ep
left join Vacation vc on vc.ID_Employee = ep.ID and (vc.DateBegin>='2020-01-01' and vc.DateBegin<='2020-12-31')
OR
(vc.DateEnd>='2020-01-01' and vc.DateEnd<='2020-12-31')
where vc.ID_Employee is null


Этот запрос будет работать быстрее т.к. к нему могут применяться индексы?
...
Рейтинг: 0 / 0
26.08.2021, 13:51
    #40093283
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация производительности запроса, с использованием индексов.
RonaldLRivest
Maxim Boguk,
т.е. так?

select name
from Employee ep
left join Vacation vc on vc.ID_Employee = ep.ID and (vc.DateBegin>='2020-01-01' and vc.DateBegin<='2020-12-31')
OR
(vc.DateEnd>='2020-01-01' and vc.DateEnd<='2020-12-31')
where vc.ID_Employee is null


Этот запрос будет работать быстрее т.к. к нему могут применяться индексы?


Может работать быстрее да... именно изза индексов.
Но возможно и такой вариант придётся переписать но там уже всё проще будет.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация производительности запроса, с использованием индексов. / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]