这是一个问题的两个部分,但首先一些背景资料: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