JPA 2.0: пакетные запросы с предложением IN - PullRequest
1 голос
/ 22 февраля 2012

Я ищу стратегию для пакетирования всех моих запросов (с предложением IN), чтобы преодолеть ограничения для баз данных по предложению IN ( См. Здесь ).

Я обычно получаю список размером от 100000 до 305000. Итак, это стало очень важным для решения.

До сих пор я пробовал две стратегии.

Стратегия 1:

  • Создайте сущность и, следовательно, таблицу с одним столбцом для хранения таких значений (можем ли мы создать временные таблицы на лету с независимым от поставщика JPA 2.0?) И использовать данные из временной таблицы в качестве подзапроса для исходный запрос перед очисткой временной таблицы.

  • Преимущество: очень производительные запросы. Очень быстро, я должен признать, что для чисел, которые я упомянул, это было в основном меньше минуты.

  • Возможный недостаток: использование временной таблицы, которая фактически является постоянной в моем случае до сих пор.

Стратегия 2:

  • Рассчитать размер партии для заданного списка ввода и для каждой партии выполнить запрос и накапливать результат.

  • Преимущество: нет временных таблиц. Легко для любых потоков в рамках одной транзакции.

  • Недостаток: большим недостатком является количество времени, необходимое для выполнения всех пакетов. Для упомянутых цифр это на данный момент неприемлемый уровень. Занимает от 5 до 15 минут!

Буду признателен за любые отзывы, предложения или улучшения от всех вас, гуру JPA.

Спасибо.

1 Ответ

1 голос
/ 22 февраля 2012

Я протестировал только до 50 000 целых чисел, но у меня есть довольно неплохие данные о производительности, связанные с разделением больших списков различными методами, с CLR и таблицей чисел, возглавляющей пакет на верхнем уровне:

Не уверен, используете ли вы целые числа или строки, но результаты должны быть примерно эквивалентны.

В целом, признаюсь, я понятия не имею, что такое JPA 2.0, но я предполагаю, что вы можете контролировать формат списков, которые он отправляет на SQL Server.

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