Разница типов данных в параметре процедуры и SQL-запросе внутри него

В моей серверной процедуре у меня есть параметр varchar2, и я использую его в SQL-запросе для поиска по числовому столбцу. Приведет ли это к каким-либо проблемам с производительностью?

например:

Proc (a varchar)
is 
select * from table where deptno = a;
end

Здесь deptno — числовой столбец в таблице, а a — varchar.


person battech    schedule 04.07.2013    source источник


Ответы (1)


Это может сработать. База данных разрешит различия в типах данных, приведя DEPTNO к VARCHAR2. Это предотвратит использование оптимизатором любого (нормального) индекса, который у вас есть для этого столбца. В зависимости от объемов и распределения данных индексированное чтение не всегда может быть наиболее эффективным путем доступа, и в этом случае преобразование данных не имеет значения.

Так что зависит. Но каковы ваши варианты, если это имеет значение (у вас есть очень избирательный индекс для этого столбца)?

Одним из решений было бы применить явное преобразование данных в вашем запросе:

select * from table 
where deptno = to_number(a);

Это приведет к сбою запроса, если A содержит значение, которое не будет преобразовано в число.

Лучшим решением было бы изменить тип данных A, чтобы вызывающая программа могла передавать только числовое значение. Это возлагает ответственность за фиктивные данные туда, где они должны быть.

Наименее привлекательное решение состоит в том, чтобы оставить сигнатуру процедуры и запрос как есть и построить для столбца функциональный индекс:

create index emp_deptchar_fbi on emp(to_char(deptno));

Прочтите документацию, чтобы узнать больше об индексах на основе функций< /а>.

person APC    schedule 04.07.2013
comment
Поэтому я должен убедиться, что параметры запроса синхронизированы с параметрами процедуры, чтобы избежать влияния на производительность в долгосрочной перспективе. Спасибо :) - person battech; 04.07.2013