|
|
|
Junior Member
      
участник
Last Login: 26.02.2007 14:03
Сообщ.: 14,
Visits: 16
|
|
Запрос просит что-то вроде
Select contactid from contact where (contactid in ('id1', 'id2')) and (contactid not in ('id2', 'id3'))
при чём множества в скобках имеют по 13000 элементов шириной в 12 символов.
Такой запрос сервер пытался обработать 45 минут, но потом мне надоело ждать. Аналогичный запрос с таким же количеством элементов, но только на пересечение или на дополнение множеств срабатывает за 2-3 минуты.
Как оптимизировать этот запрос? Или в чём тут проблема? Contactid - это non-clustered primary key index field.
Теоретически можно было бы вообще не отправлять запрос потому что все ключи есть, но вроде в T-SQL нельзя делать запросы с голыми множествами без таблицы (или можно?), но клиентская машина наверно будет работать очень долго, это ж максимум 13000^2 сравнений данных типа char(12).
Какие ещё есть способы?
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833,
Visits: 16 863
|
|
| Предлагаю сначала запихнуть данные в таблицы. А затем использовать запрос следующего вида: SELECT ID FROM Contact WHERE ID IN
(SELECT ID FROM TblYes WHERE ID NOT IN (SELECT ID FROM tblNo)) Или использовать JOIN. Но в IN неоптимально в данном случае это пихать.
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833,
Visits: 16 863
|
|
| Кстати, если сервер 2005, то используй EXCEPT & INTERCEPT.
|
|
|
|