Bob*_*Bob 6 sql t-sql sql-server
下面的查询快速返回初始结果然后变得非常慢.
SELECT A.Id
, B.Date1
FROM A
LEFT OUTER JOIN B
ON A.Id = B.Id AND A.Flag = 'Y'
AND (B.Date1 IS NOT NULL AND A.Date >= B.Date2 AND A.Date < B.Date1)
Run Code Online (Sandbox Code Playgroud)
表A有2400万条记录,表B有50万条记录.
表A的索引位于列:Id和Date
表B的索引在列上:Id,Date2,Date1 - Date1可为空 - 索引是唯一的
第一个11米的记录返回得非常快,然后突然变得非常慢.执行计划显示使用了索引.
但是,当我删除条件A.Date <B.Date1时,查询再次变快.
你知道应该怎样做才能提高性能吗?谢谢
更新: 我更新了查询以显示结果中需要表B的字段.当我有条件"B.Date1不为空"时,您可能会想到为什么我使用左连接.那是因为我发布了简化查询.我的性能问题即使是这个简化版本.
你可以尝试使用EXISTS.它应该更快,因为一旦找到匹配就停止寻找更多行,而不像JOIN所有行必须被提取和连接.
select id
from a
where flag = 'Y'
and exists (
select 1
from b
where a.id = b.id
and a.date >= b.date2
and a.date < b.date1
and date1 is not null
);
Run Code Online (Sandbox Code Playgroud)