【发布时间】:2010-11-17 12:34:27
【问题描述】:
不久前,我从一位 DBA 朋友那里学到了一个技巧,可以加快某些 SQL 查询的速度。我记得他提到这与 SQL Server 如何编译查询有关,并且查询路径被强制使用索引值。
这是我的原始查询(需要 20 秒):
select Part.Id as PartId, Location.Id as LocationId
FROM Part, PartEvent PartEventOuter, District, Location
WHERE
PartEventOuter.EventType = '600' AND PartEventOuter.AddressId = Location.AddressId
AND Part.DistrictId = District.Id AND Part.PartTypeId = 15
AND District.SubRegionId = 11 AND PartEventOuter.PartId = Part.Id
AND PartEventOuter.EventDateTime <= '4/28/2009 4:30pm'
AND NOT EXISTS (
SELECT PartEventInner.EventDateTime
FROM PartEvent PartEventInner
WHERE PartEventInner.PartId = PartEventOuter.PartId
AND PartEventInner.EventDateTime > PartEventOuter.EventDateTime
AND PartEventInner.EventDateTime <= '4/30/2009 4:00pm')
这是“优化”查询(不到 1 秒):
select Part.Id as PartId, Location.Id as LocationId
FROM Part, PartEvent PartEventOuter, District, Location
WHERE
PartEventOuter.EventType = '600' AND PartEventOuter.AddressId = Location.AddressId
AND Part.DistrictId = District.Id AND Part.PartTypeId = 15
AND District.SubRegionId = 11 AND PartEventOuter.PartId = Part.Id
AND PartEventOuter.EventDateTime <= '4/28/2009 4:30pm'
AND NOT EXISTS (
SELECT PartEventInner.EventDateTime
FROM PartEvent PartEventInner
WHERE PartEventInner.PartId = PartEventOuter.PartId
**AND EventType = EventType**
AND PartEventInner.EventDateTime > PartEventOuter.EventDateTime
AND PartEventInner.EventDateTime <= '4/30/2009 4:00pm')
谁能详细解释为什么它运行得这么快?我只是想更好地理解这一点。
【问题讨论】:
-
您是否尝试过查看查询计划?
-
因为 eventtype 上有索引?
-
你没有这个字段的索引吗?
-
请注意,如果 EventType 可以为 NULL,则 2 个查询不相同(因为如果 EventType 为 NULL,则 EventType = EventType 不会为真)。
-
检查 EventType IS NOT NULL 并没有加快查询速度。
标签: sql optimization query-optimization performance