Максимальный размер для запроса SQL Server? В статье? Есть ли лучший подход [дубликат]
Возможные Дубликаты:
T-SQL где col в ( ... )
каков максимальный размер запроса SQL Server? (# символов)
максимальный размер для предложения IN? Я думаю, что я видел что-то о том, что Oracle имеет ограничение на 1000 элементов, но вы можете обойти это с помощью ANDing 2 INs вместе. Аналогичная проблема в SQL Server?
обновление
Так что было бы лучшим подходом, если мне нужно взять, скажем, 1000 GUIDs от другого система (нереляционная база данных) и сделать "присоединиться к коду" против SQL Server? Это представить список 1000 GUID в предложение IN?
Или есть другая техника, которая работает более эффективно?
Я не проверял это, но мне интересно, могу ли я представить GUID в качестве XML-документа. Например
<guids>
<guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
<guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>
а затем выполните какое-то соединение XQuery против Doc и таблицы. Менее эффективный, чем 1000 пункт в предложении?
4 ответов:
каждый пакет SQL должен вписываться в Ограничение Размера Партии: 65,536 * Размер Сетевого Пакета.
кроме этого, ваш запрос ограничен условиями выполнения. Обычно он заканчивается размером стека, потому что x IN (a,b,c) - это не что иное, как x=A или x=b или x=c, который создает дерево выражений, подобное x=A или (x=b или (x=c)), поэтому он становится очень глубоким с большим количеством OR. SQL 7 ударил бы так около 10k значений в IN, но теперь стеки гораздо глубже (из-за x64), поэтому он может идти довольно глубоко.
обновление
вы уже нашли статью Эрланда на тему передачи списков / массивов SQL Server. С SQL 2008 у вас также есть Параметры С Табличным Значением которые позволяют передать всю DataTable в качестве одного параметра типа таблицы и присоединиться к нему.
XML и XPath-это еще одно эффективное решение:
SELECT ... FROM Table JOIN ( SELECT x.value(N'.',N'uniqueidentifier') as guid FROM @values.nodes(N'/guids/guid') t(x)) as guids ON Table.guid = guids.guid;
раскрываются максимумы SQL Server http://msdn.microsoft.com/en-us/library/ms143432.aspx (это версия 2008 года)
SQL-запрос может быть varchar (max), но отображается как ограниченный до 65,536 * размер сетевого пакета, но даже тогда то, что, скорее всего, отключит вас, - это 2100 параметров на запрос. Если SQL решит параметризовать литеральные значения в предложении in, я бы подумал, что вы сначала достигнете этого предела, но я его не проверял.
изменить : Проверьте его, даже при принудительной параметризации он выжил-я придумал быстрый тест и выполнил его с 30K элементами в предложении In. (SQL Server 2005)
на 100k элементов, это заняло некоторое время, а затем упал с:
Msg 8623, Уровень 16, Состояние 1, Строка 1 Обработчик запросов исчерпал внутренние ресурсы и не удалось предоставить план запроса. Это редкое событие и требуется только для очень сложных запросов или запросов, которые ссылаются на очень большое количество таблицы или разделы. Пожалуйста, упростите запрос. Если вы считаете, что получили это сообщение по ошибке, обратитесь в Службу поддержки для получения дополнительной информации.
Так что 30k можно, но только потому, что вы можете это сделать - не значит, что вы должны :)
Edit: Продолжение из-за дополнительного вопроса.
50k работал, но 60k выпал, так что где-то там на моей испытательной установке кстати.
с точки зрения того, как сделать это объединение значений без используя большое предложение in, лично я бы создал временную таблицу, вставил значения в эту временную таблицу, индексировал ее, а затем использовал ее в соединении, давая ей лучшие возможности для оптимизации соединений. (Генерация индекса в таблице temp создаст для него статистику, которая поможет оптимизатору, как правило, хотя 1000 GUID точно не найдут статистику слишком полезной.)
в пакете 65536 * Размер Сетевого Пакета который 4k так 256 МБ
однако, в остановится путь до этого, но это не точно.
вы в конечном итоге с ошибками памяти, но я не могу вспомнить точную ошибку. Огромное В любом случае будет неэффективной.
Edit: Remus напомнил мне: ошибка связана с "размером стека"
можете ли вы загрузить GUID в таблицу царапин, а затем сделать
... WHERE var IN SELECT guid FROM #scratchtable
Comments