Для контекста, в зависимости от базы данных, которую вы используете, это похоже на динамический предикат c IN
с выражениями значения строки. Если поддерживается, вы также можете написать:
WHERE (t1.column1, t1.column2, t1.column3, t1.column4, t1.column5, t1.column6) IN (
('c11', 'c12', 'c13', 'c14', 'c15', 'c16'),
('c21', 'c22', 'c23', 'c24', 'c25', 'c26'),
...
)
Такие длинные списки IN
превратятся в проблемы не только в клиентских библиотеках, которые генерируют динамические c SQL, но и на стороне сервера. Вы упомянули переменные связывания, возможно, старый используемый вами API все-таки не использовал переменные связывания, а встроил все значения в запрос. Я видел, что это намного лучше в Oracle для больших наборов параметров, так что это один из случаев, когда встроенные значения могут быть лучше, чем переменные связывания .
Так как вы ' Используя Hibernate, вы можете попробовать включить
<property name="hibernate.criteria.literal_handling_mode" value="bind"/>
См. HHH-9576 и этот ответ
Возможно, даже лучшее решение с использованием массивов
Вышеприведенное (возможно) поможет восстановить предыдущую производительность, с которой вы столкнулись, но в зависимости от размера списка IN
могут быть и лучшие решения. Я написал в блоге об альтернативе, в которой вы можете использовать массивы вместо отдельных значений привязки, в случае, если вы используете Oracle или PostgreSQL.
Возможно, даже лучшее решение, использующее временные таблицы
Другой вариант, который я часто видел, - это использовать временные таблицы в форме (при условии Oracle):
CREATE GLOBAL TEMPORARY TABLE predicates (
column1 VARCHAR2(100),
column2 VARCHAR2(100),
column3 VARCHAR2(100),
column4 VARCHAR2(100),
column5 VARCHAR2(100),
column6 VARCHAR2(100)
)
И затем, перед выполнением запроса , пакетно вставьте все различные значения предикатов в эту таблицу, а затем наполовину соедините ее:
WHERE (t1.column1, t1.column2, t1.column3, t1.column4, t1.column5, t1.column6) IN (
SELECT column1, column2, column3, column4, column5, column6
FROM predicates
)
Если у вас нет временных таблиц, вы можете вместо этого попробовать обычные таблицы и добавить в нее столбец транзакции_id, очистка содержимого вручную после ваших запросов.