Максимальный размер для запроса 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 пункт в предложении?

650   4  

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

    Ничего не найдено.