Есть задача вытаскивать из базы MS SQL данные по ID.
ID никак логически не связаны, поэтому сделал условие IN (...).
Пока в массиве около 50 элементов работает очень быстро.
Но в будущем может быть несколько сотен. WHERE содержит ещё пару условий, а сам запрос имеет несколько JOIN.
Если у кого-нибудь опыт или теоритические знания о том, как конструкция IN работает с большими массивами?
Каков максимальный размер массива для приемлемой работы?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
19-05-2025 04:47
>>>Есть задача вытаскивать из базы MS SQL данные по ID
Вы, часом, форумом не ошиблись? Здесь тематика обсуждений другая. Не MS SQL.
>>>Если у кого-нибудь опыт или теоретические знания о том, как конструкция IN работает с большими массивами?
Обычно, предикат in используется для проверки нескольких значений. Несколько значений, это 2, 3, 10.
Полагаю, что для современного сервера и нагрузка в 1000 не создаст проблему.
Но методологически, создавать такие запросы неправильно. Поскольку сервер БД предназначен для работы с реляционными данными, а предикат in, фактически подсовывает ему, либо линейный массив, либо набор альтернативных сравнений: ...or... or... or... . (Microsoft не раскрывает внутренний метод работы предиката.) Тем самым, заставляя сервер работать в несвойственном ему режиме.
На мой взгляд, правильнее создавать соединения с другими запросами или с таблицами. Например, соединения со временными таблицами (т.е. которые создаются с # в имени).
В подтверждение: https://learn.microsoft.com/ru-ru/sql/t-sql/language-elements/in-transact-sql?view=sql-server-ver16
"Явное включение очень большого количества значений (много тысяч значений, разделённых запятыми) в круглые скобки в предложение IN может привести к интенсивному расходованию ресурсов и возврату ошибки 8623 или 8632. Чтобы избежать этой проблемы, храните элементы списка IN в таблице и используйте вложенный запрос SELECT в предложении IN."
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.