這是一個問題的兩個部分,但首先一些背景資料:SQL查詢執行時間快,但在讀取行緩慢
我在Sybase一個TSQL查詢報告的0.328秒的執行時間,但其採取大約20-30秒才能檢索大約5000行。該查詢有兩個子查詢和一個左外部聯接。
查詢看起來大致是這樣的:
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可以包含CustomerContact中任何給定行的x個記錄。 Customer表與CustomerContact是一對一的。
現在我的問題:
怎麼來的Sybase報告的0.328秒的執行時間,但它實際上正在接近30秒的檢索查詢的行?
如何優化此查詢?
我的第一個想法是添加索引到LastModified列,但我正在處理少量的記錄。
我的第二個想法是,子查詢正在放慢速度,我應該將它們轉換爲連接。但是我無法在連接條件中使用聚合函數max,那麼如何才能獲得連接中的最大行?
感謝
您正在使用什麼版本的SQL Server?如果您使用2005+,我會發布更快的CTE版本 – Hogan 2011-04-09 17:53:54
您應該提供查詢計劃/成本分析以及任何優化查詢的幫助請求。請參閱http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc00976.1502/html/statistics/statistics25.htm – eevar 2011-04-09 18:31:09
@Hogan - 使用Sybase,但感謝您花時間提供答案。 – dmck 2011-04-09 18:40:47