TSQL НЕ СУЩЕСТВУЕТ Почему этот запрос такой медленный?

Отладка приложения, которое запрашивает SQL Server 05, не может изменить запрос, но требует оптимизации.

Выполнение всех выборок по отдельности выполняется быстро ‹1 с, например: выберите * из acscard, выберите идентификатор из сотрудника... При объединении это занимает 50 секунд.

Лучше установить для неинтересных полей accesscardid значение null или '' при использовании EXISTS?

  SELECT * FROM ACSCard
    WHERE NOT EXISTS
     ( SELECT Id FROM Employee 
              WHERE Employee.AccessCardId = ACSCard.acs_card_number )
    AND NOT EXISTS
     ( SELECT Id FROM Visit 
               WHERE Visit.AccessCardId = ACSCard.acs_card_number ) 
  ORDER by acs_card_id

person Mobs    schedule 16.12.2010    source источник


Ответы (2)


Есть ли у вас индексы для Employee.AccessCardId, Visit.AccessCardId и ACSCard.acs_card_number?

person Ted Elliott    schedule 16.12.2010
comment
Это должен быть комментарий к исходному вопросу... Не ответ. - person Saul Dolgin; 16.12.2010
comment
Индексы решили проблему - не верится, что их не было с самого начала! - person Mobs; 16.12.2010

Предложение SELECT не оценивается в предложении EXISTS. Этот:

WHERE EXISTS(SELECT 1/0
               FROM EMPLOYEE)

... должно вызвать ошибку деления на ноль, но это не так. Но вам нужно что-то добавить в предложение SELECT, чтобы запрос был допустимым — неважно, NULL это или строка нулевой длины.

В SQL Server, NOT EXISTS (и NOT IN) лучше, чем подход LEFT JOIN/IS NULL, если сравниваемые столбцы не допускают значение NULL (значения с обеих сторон не могут быть NULL). Сравниваемые столбцы должны быть проиндексированы, если они еще не проиндексированы.

person OMG Ponies    schedule 16.12.2010