Это вопрос из двух частей, но сначала немного справочной информации:
У меня есть запрос TSQL в Sybase, который сообщает о времени выполнения 0,328 секунды, однако для получения примерно 5000 строк требуется около 20-30 секунд. Запрос имеет два подзапроса и левое внешнее соединение.
Запрос выглядит примерно так:
SELECT CustomerContact.Id, Customer.Name, ...
, CustomerContacts.LastName, CustomerContacts.FirstName
, ( SELECT max(LastModified)
FROM ContactPhone
WHERE ContactPhone.ContactID = CustomerContact.ID
) as PhoneLastModified
, ( SELECT max(LastModified)
FROM ContactEmail
WHERE ContactEmail.ContactID = CustomerContact.ID
) as EmailLastModified
FROM CustomerContacts
LEFT OUTER JOIN Customer
ON Customer.ID = CustomerContact.CustomerId
WHERE (PhoneLastModified > '2011-01-01'
OR EmailLastModified > '2011-01-01')
Что я делаю, так это выбираю записи клиентов на основе даты последнего изменения любой связанной контактной информации. ContactPhone и ContactEmail могут содержать x записей для любой заданной строки в CustomerContact. Таблица Customer соответствует таблице CustomerContact.
Теперь мой вопрос:
Почему Sybase сообщает о времени выполнения 0,328 секунды, но на самом деле для получения строк в запросе требуется около 30 секунд?
Что я могу сделать, чтобы оптимизировать этот запрос?
Моей первой мыслью было добавить индексы к столбцам LastModified, но я имею дело с небольшим количеством записей.
Моя вторая мысль заключается в том, что подзапросы замедляют работу, и что я должен преобразовать их в соединения. Но я не могу использовать агрегатную функцию max в условии соединения, так как же мне получить только максимальную строку в моем соединении?
Спасибо