Это вопрос из двух частей, но сначала некоторая справочная информация:
У меня есть запрос 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 в условии Join, так как я могу получить только строку max в моем объединении?
Спасибо