SQL'OR'导致超时

时间:2013-08-06 23:07:11

标签: sql timeout conditional union

在本地,此查询运行正常(<1秒),但在客户端,它需要大约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 *不是原始代码的一部分。我将其更改为最小化代码量,以便每个人都可以更轻松地找到或声明。

1 个答案:

答案 0 :(得分:0)

使用JOINS而不是IN()子句。