У нас есть отчет, в котором используется длинный и сложный запрос с оператором SELECT, как показано ниже:
SELECT
NVL(nazwawystawcy,'BRAK') supplier_name,
NVL(AdresDostawcy,'BRAK') supplier_address,
NVL(NrDostawcy,'BRAK') supplier_registration,
DowodZakupu document_number,
DataZakupu document_issue_date,
DataWplywu document_recording_date,
trx_id,
KodKrajuNadaniaTIN country_code,
DokumentZakupu document_type_code,
payment_split MPP,
box_number box_number,
box_amount box_amount,
box_type box_type,
display_order display_order
...
FROM table1 t1
,table2 t2
....
Недавно мы внесли изменения в этот запрос и только что изменили третий столбец SELECTed, чтобы добавить REGEXP_LIKE.
SELECT
NVL(nazwawystawcy,'BRAK') supplier_name,
NVL(AdresDostawcy,'BRAK') supplier_address,
--NVL(NrDostawcy,'BRAK') supplier_registration,
Case When (NrDostawcy is not null and regexp_like(substr(NrDostawcy,1,2),'^[a-zA-Z]*$')) Then substr(NrDostawcy,3) else NVL(NrDostawcy,'BRAK') End supplier_registration,
DowodZakupu document_number,
DataZakupu document_issue_date,
DataWplywu document_recording_date,
trx_id,
KodKrajuNadaniaTIN country_code,
DokumentZakupu document_type_code,
payment_split MPP,
box_number box_number,
box_amount box_amount,
box_type box_type,
display_order display_order
...
FROM table1 t1
,table2 t2
....
Я проверил планы объяснения обоих запросов, и оказалось, что они имеют одинаковое хеш-значение плана. Означает ли это, что на производительность не повлияет использование заполненных, неагрегированных функций SQL в столбцах SELECTed? Я считаю, что их использование в предложении WHERE влияет на производительность, но я не был уверен, относится ли то же самое к столбцам SELECTed.
Заранее извиняюсь, так как я не могу предоставить точный запрос, так как он является проприетарным и очень длинным и сложным. Я также не думаю, что смогу создать достаточно хороший образец, который соответствовал бы плану объяснения фактического запроса, поскольку он объединяет более 10 таблиц с тысячами строк данных.
Спасибо!
projection
. Вы можете проверить проекцию, чтобы понять, на каком шаге плана рассчитывается измененное значение, а затем попытаться заставить оракул вычислить его позже, если это необходимо. Влияние на производительность будет (но может быть относительно небольшим), потому что оракулу потребуется дополнительно применитьregexp_like
иsubstr
ко всем значениям столбцаNrDostawcy
- вы можете просто проверить это, изменивregexp_like
на некоторую функцию, которая спит несколько секунд, а затем возвращает переданный параметр. - person Dornaut   schedule 23.10.2020