例如:
SELECT *
FROM Table t
WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key)
Run Code Online (Sandbox Code Playgroud)
如果@key IS NULL的计算结果为true,那么@key IS是否为NULL并且@key = t.Key是否已计算?
如果不是,为什么不呢?
如果是,是否有保证?它是ANSI SQL的一部分还是特定于数据库?
如果是数据库特定的,SqlServer?甲骨文?MySQL的?
参考:短路评估
假设这category_id是表的索引键(不是主键)books.以下两个SQL语句之间有什么区别吗?
SELECT * FROM books WHERE author='Bill' AND category_id=1
SELECT * FROM books WHERE category_id=1 AND author='Bill'
Run Code Online (Sandbox Code Playgroud)
我想首先过滤记录category_id然后再author过滤比以相反顺序过滤它们更快.SQL引擎是否足够智能以这种方式实现?
我在表中有两个索引字段 - type和userid(单个索引,而不是复合索引).
types字段值非常有限(假设它只有0或1),因此50%的表记录具有相同的值type.userid另一方面,值来自更大的集合,因此具有相同userid值的记录量很小.
这些查询中的任何一个都会比另一个运行得更快:
select * from table where type=1 and userid=5
select * from table where userid=5 and type=1
Run Code Online (Sandbox Code Playgroud)
此外,如果两个字段都没有编入索引,它会改变行为吗?
WHERE子句中列的顺序是否会影响性能?
例如
假设我把一个具有更高潜力的专栏放在首位,反之亦然?
从性能的角度来看,我的SQL WHERE语句的顺序是否有所不同?
例如
SELECT ... FROM ...
WHERE a > 1
AND b < 2
Run Code Online (Sandbox Code Playgroud)
会比这更快/更慢吗?
SELECT ... FROM ...
WHERE b < 2
AND a > 1
Run Code Online (Sandbox Code Playgroud)
让我们假设我事先知道a > 1会缩小结果集.
另外,如果我按照WHERE语句的顺序加入两个或更多表,这有关系吗?
我在where子句中有一组条件
WHERE
d.attribute3 = 'abcd*'
AND x.STATUS != 'P'
AND x.STATUS != 'J'
AND x.STATUS != 'X'
AND x.STATUS != 'S'
AND x.STATUS != 'D'
AND CURRENT_TIMESTAMP - 1 < x.CREATION_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
首先执行以下哪些条件?我正在使用oracle.
我会在执行计划中获得这些细节吗?(我没有权限在数据库中这样做,否则我会尝试)
有没有办法明确说明发生WHERE条件的顺序?我意识到查询优化器将查看WHERE子句的所有部分,以确定满足查询的最有效方法,如以下答案中所述:
但是,有没有办法检查其他条件会依赖的条件?这些线程的答案之一涉及到我所追求的,但没有提供解决方案:
select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0
Run Code Online (Sandbox Code Playgroud)
这可能会失败,因为可以在确定table_name字段是否为数字之前评估CAST(因此会为无效转换引发错误).
当然必须有办法实现这一目标吗?