#sql #oracle #performance
#sql #Oracle #Производительность
Вопрос:
У меня вопрос о структурировании запроса. В моем выборе я сначала создаю предварительный выбор «портфолио» с относительно большими данными, примерно 2 миллиона строк. В этой подготовке я создаю случай, который просматривает значения из разных столбцов, и результат затем используется в других частях предложения with .
Может быть, лучше будет пример:
with portfolio as
(
select case when column_a like '%_V' and substr(column_b,10,1)='2' then column_b
when column_c is not null then column_c
when column_c is null and column_d is not null then column_d
else column_b end as id_user,x.* from table1 x
),
group_a as
(
select * from portfolio where substr(id_user,1,1) in ('a','b','c')
),
group_b as
(
select * from portfolio where substr(id_user,1,1) in ('a','b','f')
),
group_c as
(
select * from portfolio where substr(id_user,1,1) in ('f','g','h')
),
group_d as
(
select * from portfolio where substr(id_user,1,1) in ('d','f','h')
)
select * from ....
Итак, мой вопрос — лучше ли ограничить substr(id_user,1,1) в определении портфеля, если я знаю, что это будет только в (‘a’, ‘b’, ‘c’, ‘d’, ‘f’,’g’,’h’)?
Я не очень разбираюсь в планах SQL-запросов, но мои рассуждения заключались в том, что если я использую некоторые другие условия для строк портфолио, которые я извлекаю в подвыборках группы (которые я использую, я просто не включил их в пример), то программе не нужно будет перебирать все значения user_id, и она будетсэкономьте некоторое время, прежде всего, за счет возможности запуска подстроки во всем портфолио.
В скрипте я использую другие части id_user (другие подстроки), поэтому я хочу, чтобы весь user_id был выходным od portfolio .
Спасибо, я надеюсь, вам ясно, чего я хочу достичь.
Комментарии:
1. Вы используете MySQL или Oracle?
2. Являются ли столбцы a, b и c в таблице1? Это сбивает с толку, потому что позже они становятся символами ‘a’, ‘b’, ‘c’.
3. О, извините, что попал туда по ошибке. Я использую Oracle
4. Вы можете изменить свой оператор case на: case когда a, например, ‘%_V’ и substr(b,10,1) =’2′, тогда b else объединяются (c, d,b) end
5. @DavidAldridge Спасибо, я немного реструктурирую его. Это уже был не очень красивый фрагмент кода, который я «завещал» от кого-то другого — он был структурирован как объединения, где данные портфеля были в каждом из них, я реструктурировал его в CTE, и время выполнения уже сократилось с 60 до 6 минут. Мне было просто любопытно узнать некоторые другие методы повышения производительности 🙂