Есть ли максимальный размер для массива после оператора T-SQL IN? - PullRequest
2 голосов
/ 23 ноября 2011

Мне поручено следующее: клиент хочет прочитать число (возможно, тысячи) значений из файла csv.Я должен использовать эти значения в SQL-выражении select следующим образом:

SELECT * FROM myTable WHERE myTable.Value IN (cvsValue1, csvValue 2, ..., csvValueN)

Вопрос: будет ли эта работа работать с произвольным числом значений CSV и будет ли она работать хорошо для большого числа значений?1004 *

Мне нужно будет сохранить SQL как строку внутри моего приложения C # для дальнейшего использования.(если это имеет значение для альтернативных решений)

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Производительность действительно низкая с оператором IN и большим количеством значений (иногда ваш запрос не делает этого и вылетает).

Я делаю это так

"

SELECT cast(Items as int) as id INTO #table_temp
FROM dbo.split(@str_ids_comma,',')

SELECT * 
FROM myTable 
WHERE EXISTS(
SELECT *
FROM  #table_temp
WHERE id = myTable.Value
)

» определение разделения можно найти здесь: http://www.sqlservercentral.com/articles/Tally+Table/72993/

2 голосов
/ 23 ноября 2011

Вы действительно не хотите этого делать.Было бы лучше вывести эти значения в индексированную таблицу и использовать IN в качестве подзапроса (который обычно реализует SEMI JOIN ( больше информации ) против массива строк (который обычно реализуется какпоследовательность операций OR.

из BOL :

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

Ошибка 8623:

В обработчике запросов закончились внутренние ресурсы, и он не смог произвестиплан запроса. Это редкое событие, ожидаемое только для чрезвычайно сложных запросов или запросов, которые ссылаются на очень большое количество таблиц или разделов. Пожалуйста, упростите запрос. Если вы считаете, что получили это сообщение по ошибке, свяжитесь со службой поддержки клиентов длядополнительная информация.

Ошибка 8632:

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

0 голосов
/ 23 ноября 2011

Я предполагаю, что максимально допустимое количество элементов в списке для оператора IN зависит от базы данных. Я читаю где-то, думаю, потому что у меня была похожая проблема, что OracleXE имеет ограничение в 1000 элементов списка. Вы должны изучить это для вашей конкретной базы данных.
Что касается альтернативного решения, вы можете разбить этот запрос на несколько пакетов, если список содержит меньшее количество элементов.

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