Вопрос по производительности в sql скрипте - PullRequest
0 голосов
/ 27 сентября 2019

У меня вопрос по производительности в скрипте.У меня есть хранимая процедура, как это:

procedure my_procedure (IN document_number_parameter varchar(100))
begin
select a.id,
       b.code
from table_a a
inner join table_b b on a.b_id = b.id
where case when document_number_parameter is null then 1=1
      else b.document_number = document_number_parameter
end;

На самом деле, таблица b имеет индекс в столбце document_number.Что лучше?Этот сценарий или создать динамический запрос, используя параметр document_number_parameter и добавив в сценарий оператор 'where' по требованию? Интересно, если база данных использует полное сканирование или сканирование индекса, когда document_number_parameter не равно нулю.

Я добавил предельное предложение, но в данном случае это не актуально.Спасибо.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Вам не нужен динамический запрос.Просто поместите условие в процедуру, а не в запрос.

IF document_number_parameter IS NULL
THEN
    select a.id,
           b.code
    from table_a a
    inner join table_b b on a.b_id = b.id;
ELSE 
    select a.id,
           b.code
    from table_a a
    inner join table_b b on a.b_id = b.id
    WHERE b.document_number = document_number_parameter
END IF;
0 голосов
/ 27 сентября 2019

Вы должны реорганизовать свой запрос, избегая использования where with case и использовать if then else для выполнения правильного запроса (как предложено в anaswer @barmar) в этом случае. Поиск кода вашего запроса может быть полезен для составного индекса table_b

 on columns  (document_number, id, code )

таким образом вы можете разрешить всю информацию для table_d напрямую по индексу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...