Ограничения NHibernate. В с сотнями стоимости - PullRequest
1 голос
/ 17 мая 2011

Должен ли я беспокоиться о выражениях IN с сотнями значений в массиве? Например:

myCriteria.Add(Restrictions.In("Id", myArrayOfHundredsOfItems);

Что приводит к sql:

select * from MyTable where Id in (1,2,3,4, ...etc .. 900)

MSDN сообщает "Включение в предложение IN чрезвычайно большого числа значений (многих тысяч) может потреблять ресурсы и возвращать ошибки 8623 или 8632."

Хорошо, о многих тысячах не может быть и речи. Есть ли причина избегать массива из нескольких сотен пунктов?

1 Ответ

3 голосов
/ 17 мая 2011

Есть еще одно ограничение.Значения в предложении IN передаются как отдельные параметры.Есть предел параметров.Вероятно, это то же самое, что и для хранимых процедур , что составляет 2100.

У меня похожая ситуация, когда я пропускаю большое количество гидов.Я разделил его на несколько запросов, каждый из которых получил до 1000 параметров.Запросы выполняются как многокритериальные в пакете, поэтому существует только один прием в оба конца базы данных.

При использовании IN производительность может снизиться по сравнению с объединениями.В моем случае у меня нет проблем с производительностью из-за этого.Если у вас не так много параметров, это, скорее всего, не будет проблемой для вас.

Кстати, получение объектов по id также может быть реализовано:

  • Get<Entit>(id), который требует одного запроса, но только когда объект еще не находится в кэше.
  • Load<Entity>(id), который создает прокси, если объект не находится в кэше и загружается только впри доступе к свойствам.Скорее всего, мы получаем размер пакета и загружаем несколько экземпляров одновременно (предварительная выборка).

К сожалению, нет будущего - get .

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