wal*_*j19 8 sql sql-server sql-server-2008
我在SQL(2008)中有一个查询,我无法理解为什么要花这么长时间来评估我是否在WHERE语句中包含一个不应该影响结果的子句.以下是查询示例:
declare @includeAll bit = 0;
SELECT
Id
,Name
,Total
FROM
MyTable
WHERE
@includeAll = 1 OR Id = 3926
Run Code Online (Sandbox Code Playgroud)
显然,在这种情况下,@ includeAll = 1将评估为false; 但是,包括这会增加查询的时间,就像它总是如此.无论有没有该子句,我得到的结果是正确的:我只获得Id = 3926的1条目,但是(在我的真实世界查询中)包括该行将查询时间从<0秒增加到大约7分钟......因此它似乎正在运行查询,就好像该语句是真的,即使它不是,但仍然返回正确的结果.
任何可以解决的光都会有所帮助.另外,如果您有解决方法的建议,我会接受它.我希望有一个像这样的子句,以便我可以在存储过程中包含一个参数,使其忽略它所拥有的Id,如果设置为true则返回所有结果,但我不能允许它影响只是试图获得一条记录时的表现.
您需要查看查询计划以确定,但使用OR通常会使其在某些DBMS中进行扫描.
另外,阅读@Bogdan Sahlean对一些重要细节的回答,为什么会发生这种情况.
这可能不起作用,但你可以尝试类似的东西,如果你需要坚持直接的SQL:
SELECT
Id
,Name
,Total
FROM
MyTable
WHERE Id = 3926
UNION ALL
SELECT
Id
,Name
,Total
FROM
MyTable
WHERE Id <> 3926
AND @includeAll = 1
Run Code Online (Sandbox Code Playgroud)
如果您正在使用存储过程,则可以有条件地以任何方式运行SQL,这可能更有效.
就像是:
if @includeAll = 0 then
SELECT
Id
,Name
,Total
FROM
MyTable
WHERE Id = 3926
else
SELECT
Id
,Name
,Total
FROM
MyTable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1264 次 |
| 最近记录: |