我遇到了这个问题:
我想问一下我是否使用了查询
SELECT * FROM table WHERE 0=1
或
SELECT TOP 0 * FROM table
它会立即返回列名,还是继续解析整个表,最后返回零结果?
我有一个包含10,000行的生产表 - 它会检查每行的WHERE
条件吗?
答案 0 :(得分:31)
SQL Server查询优化器非常智能,可以确定此WHERE
条件 永远不会 在任何行上生成true
结果,所以它实际上并不打算扫描桌子。
如果您查看此类查询的实际执行计划,很容易看到 nothing 正在完成并且查询立即返回:
答案 1 :(得分:15)
MySql非常智能,可以检测到它,并知道无法做到这一点。
desc SELECT * FROM table WHERE 0=1;
答案 2 :(得分:5)
在查询中
SELECT * FROM table WHERE 0=1
WHERE
子句永远不会成立,因此SQL Server不会扫描您的所有表。
并在查询中
SELECT TOP 0 * FROM table
您正在指定TOP 0
,因此SQL Server非常智能,因此它永远不会扫描您的表以返回0行。
两个查询都只返回列标题。
答案 3 :(得分:2)
两个查询都用于获取一组空表;
SELECT TOP 0 * FROM table
SELECT * FROM table WHERE 0=1
以及实现以下目标: