【问题标题】:SQL 'OR' causing time outSQL 'OR' 导致超时
【发布时间】:2013-08-06 23:07:10
【问题描述】:

在本地,此查询运行良好( 我已经重建了索引、统计数据等。这将时间缩短到了 2:15。
经过调查,我发现问题围绕着 or 语句开头的行 AND (a.p = '123456789' or ... 如果我将查询重组为使用联合,则查询需要 那么,这个“或”是什么导致客户时间跳了 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 语句。

【问题讨论】:

  • 1) 选择 * 将显示所有列/数据,并且会占用大量时间。 2)当使用左连接时,您可能只关注右表上不存在的数据,然后您必须在左连接语句而不是 where 子句中指定过滤器。 3)并且可能您的 where 子句应该只过滤右表中的空值,原则上您想知道左表中是否没有任何匹配项。 4) 并尝试显式使用内连接 (ON) 而不是通过 where 子句连接它。 (加入优化)

标签: sql timeout conditional union


【解决方案1】:

使用 JOINS 代替 IN () 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多