#sql #query-optimization
#sql #оптимизация запросов
Вопрос:
Я работаю над небольшим проектом, который генерирует SQL-запросы из списка имен столбцов. Эти столбцы распределены по нескольким таблицам, но все они находятся в одной базе данных. Некоторые столбцы не являются настоящими столбцами, т.Е. Они представляют собой псевдоколонки «диапазона», вычисляемые как разница между двумя столбцами за определенный промежуток времени. Мой код работает, но он генерирует огромный запрос с множеством объединений, внешних объединений, псевдонимов для использования в вычислениях диапазона (которые мой генератор должен отслеживать и повторно использовать по мере добавления столбцов) и т. Д.
Цель всего этого — повысить производительность за счет получения большого количества данных из SQL непосредственно из БД с минимальной последующей обработкой. Тогда мой вопрос заключается в том, будет ли значительное снижение производительности, если я буду выбирать каждый столбец по отдельности (чтобы упростить мой код генератора) и объединять результаты. Существуют ли другие (лучшие) способы сделать это без тонны трудночитаемых объединений и псевдонимов?
Ответ №1:
Если у вас есть необходимые индексы в таблице, я не думаю, что вы увидите огромное снижение производительности от объединений по сравнению с объединениями.
Но лучший способ выяснить это — просмотреть план выполнения каждого из них, чтобы вы могли принять наилучшее решение на основе предоставленной информации. И вы также сможете увидеть, где / если дополнительные индексы повысят производительность.
Ответ №2:
Возможно ли создать представление в базе данных, которое включает все необходимые вычисления и все объединения?
Тогда было бы довольно просто завершить SELECT
из этого представления.
Комментарии:
1. Вычисляемые столбцы представляют собой, например, разницу между значением на начальную дату и соответствующим значением на конечную дату. Диапазон дат является частью запроса вместе со списком имен столбцов, поэтому он может быть любым. Есть ли какой-нибудь способ создать представление, которое принимает параметры? В противном случае, я не думаю, что представления могут здесь помочь.
2. Частью моего ответа было то, что ЕСЛИ бы вы могли определить, какие вычисления вам требуются, их можно было бы достаточно легко включить в представление. Диапазон дат звучит для меня как часть предложения WHERE, так что это тоже сработает.