在本地,此查询运行良好(<1sec),但在客户端,它需要大约3分钟(使用不同的执行计划)
我重建了索引、统计数据等。这将时间缩短到2:15
经过调查,我发现问题围绕着开头的或语句AND (a.p = '123456789' or ...
如果我重构查询以使用并集,则该查询将<1秒
那么,是什么"或"导致客户端时间跳跃2分钟以上
select *
from foo_main A with(nolock)
where a.i = a.i
and (IsNull(A.v, '0') = '1')
and (IsNull(A.d, '') = 'CODE_B')
and A.c in ('CODE_B')
AND (a.p = '123456789' or
a.p IN (SELECT DISTINCT f.ui
FROM foo_faculty f
LEFT JOIN foo_unit ff ON (f.ui = ff.ui)
LEFT JOIN unit u ON (ff.ui = u.ui AND
f.c = u.c),
foo_Personnel p, foo_System s, unit u1
WHERE s.P = p.P
AND s.s = 'G'
AND s.R = 'R4'
AND p.ui = '1q2w3e4r5t6y'
AND p.ui = u1.ui
AND p.i = u1.i
AND u.i = u1.i
AND u.dI LIKE u1.DI + '%' COLLATE
SQL_Latin1_General_CP1_CS_AS))
order by lname, fname
感谢您的帮助!
对不起,我之前应该提到,select *
不是原始代码的一部分。我对它进行了更改,以最大限度地减少代码量,这样每个人都可以更容易地找到or语句。
使用JOIN而不是IN()子句。