Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Много элементов в списке IN  [new]
ply
Member

Откуда:
Сообщений: 75
Нужно выбрать записи, ID которых не входит в определенный список
Получился запрос такого вида
SELECT * FROM table1 WHERE id not in ('10000001','10000002'....'1099999')

Всего в списке может быть до 30 000 значений
Правильно ли я делаю, или есть какая-то другая(более быстрая\правильная) контрукция?
29 дек 11, 10:08    [11843917]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
Elena85
Member

Откуда:
Сообщений: 34
ply,
можно все эти значения сложить в табличную переменную/временную таблицу и с ней джойниться
29 дек 11, 10:10    [11843926]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
ply
Member

Откуда:
Сообщений: 75
Elena85
ply,
можно все эти значения сложить в табличную переменную/временную таблицу и с ней джойниться

Сказать честно, я ожидал хоть каких-то аргументов. А так, переписать в блокнотик номера и сравнить по ним тоже можно.
29 дек 11, 10:25    [11844014]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
ply
Elena85
ply,
можно все эти значения сложить в табличную переменную/временную таблицу и с ней джойниться

Сказать честно, я ожидал хоть каких-то аргументов. А так, переписать в блокнотик номера и сравнить по ним тоже можно.
Если список произвольный и всегда разный, то ваш метод совершенно нормальный.

Если список постоянный (или изредка редактируемый), то лучьше его держать в постоянной таблице.
То есть можно определить этот
ply
ID которых не входит в определенный список
"определенный список"
29 дек 11, 10:31    [11844049]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
ply
Member

Откуда:
Сообщений: 75
alexeyvg
Если список произвольный и всегда разный, то ваш метод совершенно нормальный.

Спасибо. Список у меня разный.
29 дек 11, 10:36    [11844091]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
aleks2
Guest
alexeyvg
Если список постоянный (или изредка редактируемый), то лучьше его держать в постоянной таблице.
То есть можно определить этот
ply
ID которых не входит в определенный список
"определенный список"

Ответ неверный. При 30000шт упорядоченная таблица (с кластерным индексом) даст существенный выигрыш в сравнении с "просто списком".
29 дек 11, 10:40    [11844117]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
aleks2
alexeyvg
Если список постоянный (или изредка редактируемый), то лучьше его держать в постоянной таблице.
То есть можно определить этотпропущено...
"определенный список"

Ответ неверный. При 30000шт упорядоченная таблица (с кластерным индексом) даст существенный выигрыш в сравнении с "просто списком".
+100500
29 дек 11, 10:54    [11844207]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5117
ply
Всего в списке может быть до 30 000 значений

а этот список у вас откуда берётся?
29 дек 11, 11:12    [11844329]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
iap
aleks2
пропущено...

Ответ неверный. При 30000шт упорядоченная таблица (с кластерным индексом) даст существенный выигрыш в сравнении с "просто списком".
+100500
А из чего такой вывод? Разве в плане не будет по любому сканирования этой таблицы в 30000 записей? Что тут даст кластерный индекс, по нему ведь искать или сортировать не надо?
29 дек 11, 11:16    [11844354]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
alexeyvg
iap
пропущено...
+100500
А из чего такой вывод? Разве в плане не будет по любому сканирования этой таблицы в 30000 записей? Что тут даст кластерный индекс, по нему ведь искать или сортировать не надо?
Правда, нужно учитывать not in

Если в выборке, которая получается изначально, только немного записей попадает в переданный список, то выйгрыш будет, если из выборки должны исключиться все 30000 переданных ИД, то по моему разницы нет.
29 дек 11, 11:19    [11844370]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
ply
Member

Откуда:
Сообщений: 75
Дедушка
а этот список у вас откуда берётся?

Список берется из БД на другом сервере. Синхронизирую данные.
29 дек 11, 12:13    [11844818]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
ply
Дедушка
а этот список у вас откуда берётся?

Список берется из БД на другом сервере. Синхронизирую данные.

Тогда лучше его предварительно сохранять во временную таблицу.
BOL
Включение очень большого количества значений (много тысяч) в предложение IN может привести к интенсивному расходованию ресурсов и возврату ошибки 8623 или 8632. Чтобы избежать этой проблемы, храните элементы списка IN в таблице.
Ошибка 8623.
Обработчик запросов исчерпал внутренние ресурсы и поэтому не предоставил план запроса. Это редкое событие, которое может происходить только при очень сложных запросах или запросах, которые обращаются к очень большому числу таблиц или секций. Упростите запрос. Если предполагается, что это сообщение получено по ошибке, свяжитесь со службой поддержки пользователей для получения дополнительных сведений.
Ошибка 8632.
Внутренняя ошибка: был достигнут предел служб выражений. Проверьте потенциально сложные выражения в запросе и постарайтесь их упростить.
29 дек 11, 12:22    [11844874]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Интересно, а такое решение когда применимо?
11403903
29 дек 11, 16:42    [11846962]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
trew
Интересно, а такое решение когда применимо?
11403903
Вопрос можно сформулировать по-другому:
а когда индексы для множества значений в IN() помогают, а когда нет?

Очевидно, что если значения собрать в таблицу заранее и построить индекс,
то во время самого запроса входимость значения поля в это множество
будет проверяться с помощью индекса.

В то время как остальные методы должны приводить к парсингу строки
для каждого значения поля таблицы. Если, конечно, сервер не построит
таблицу элементов IN() самостоятельно...

Я так думаю.
29 дек 11, 17:04    [11847118]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
iap
trew
Интересно, а такое решение когда применимо?
11403903
Вопрос можно сформулировать по-другому:
а когда индексы для множества значений в IN() помогают, а когда нет?

Очевидно, что если значения собрать в таблицу заранее и построить индекс,
то во время самого запроса входимость значения поля в это множество
будет проверяться с помощью индекса.

В то время как остальные методы должны приводить к парсингу строки
для каждого значения поля таблицы. Если, конечно, сервер не построит
таблицу элементов IN() самостоятельно...

Я так думаю.


30 000 в IN () вообще может не скомпилироваться! У меня как раз недавно именно такой запрос (ad-hoc сгенеренный .NET Framework) и упал с Internal Server error. Выборка из 1-й таблицы где ID IN(...)
30 дек 11, 06:54    [11848944]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5117
ну... собственно, если глянуть мануал так и написано
"Включение очень большого количества значений (много тысяч) в предложение IN может привести к интенсивному расходованию ресурсов и возврату ошибки 8623 или 8632"
другое дело, что интересно оценить насколько это "много тысяч" - много
30 дек 11, 10:03    [11849265]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Дедушка
ну... собственно, если глянуть мануал так и написано
"Включение очень большого количества значений (много тысяч) в предложение IN может привести к интенсивному расходованию ресурсов и возврату ошибки 8623 или 8632"
другое дело, что интересно оценить насколько это "много тысяч" - много
На моей памяти 2005 падал и на тысячах трех... 1с -блин любит такие запросы генериить... Особенно до SP3.

Сообщение было отредактировано: 30 дек 11, 11:13
30 дек 11, 11:13    [11849551]     Ответить | Цитировать Сообщить модератору
 Re: Много элементов в списке IN  [new]
Александр Волок (def1983)
Member

Откуда: Rotterdam
Сообщений: 4959
Кудряшка
iap
пропущено...
Вопрос можно сформулировать по-другому:
а когда индексы для множества значений в IN() помогают, а когда нет?

Очевидно, что если значения собрать в таблицу заранее и построить индекс,
то во время самого запроса входимость значения поля в это множество
будет проверяться с помощью индекса.

В то время как остальные методы должны приводить к парсингу строки
для каждого значения поля таблицы. Если, конечно, сервер не построит
таблицу элементов IN() самостоятельно...

Я так думаю.


30 000 в IN () вообще может не скомпилироваться! У меня как раз недавно именно такой запрос (ad-hoc сгенеренный .NET Framework) и упал с Internal Server error. Выборка из 1-й таблицы где ID IN(...)

Да, увы не смогу привести статью где был пример, когда при 64 и более значениях в IN (.., ..) оптимизатор ведет себя уже не так приятно как джоин с таблицей-переменной или же exists()
30 дек 11, 23:51    [11852265]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить