Предположим, что у пользователей есть учетные записи 1 - n
в системе. Когда они запрашивают базу данных, они могут выбрать выбор из m
acounts, m between 1 and n
. Обычно SQL, сгенерированный для извлечения их данных, похож на
SELECT ... FROM ... WHERE account_id IN (?, ?, ..., ?)
Таким образом, в зависимости от количества учетных записей, которые пользователь имеет, это вызовет новый жесткий анализ в Oracle, а также новый план выполнения и т.д. Теперь есть много таких запросов, и, следовательно, разборки, и, возможно, кеш курсора/плана будет заполнен довольно рано, что приведет к еще большему анализу.
Вместо этого я мог бы написать что-то вроде этого
-- use any of these
CREATE TYPE numbers AS VARRAY(1000) of NUMBER(38);
CREATE TYPE numbers AS TABLE OF NUMBER(38);
SELECT ... FROM ... WHERE account_id IN (
SELECT column_value FROM TABLE(?)
)
-- or
SELECT ... FROM ... JOIN (
SELECT column_value FROM TABLE(?)
) ON column_value = account_id
И используйте JDBC для привязки java.sql.Array
(т.е. an oracle.sql.ARRAY
) к единственной переменной привязки. Понятно, что это приведет к менее жестким параметрам и меньшим курсорам в кеше для функционально эквивалентных запросов. Но есть ли что-то вроде общего недостатка производительности или любых других проблем, с которыми я мог бы столкнуться?
Например: обрабатывает ли переменная peeking аналогичным образом для varrays или вложенных таблиц? Поскольку количество данных, связанных с каждой учетной записью, может сильно различаться.
Я использую Oracle 11g в этом случае, но я думаю, что этот вопрос интересен для любой версии Oracle.