gpt4 book ai didi

sql - 为什么 SQL 评估的 WHERE 子句为 False?

转载 作者:行者123 更新时间:2023-12-02 12:16:01 24 4
gpt4 key购买 nike

我在 SQL (2008) 中有一个查询,如果我在 WHERE 语句中包含一个不会影响结果的子句,我无法理解为什么要花这么长时间来评估。以下是查询示例:

declare @includeAll bit = 0;

SELECT
Id
,Name
,Total
FROM
MyTable
WHERE
@includeAll = 1 OR Id = 3926

显然,在这种情况下,@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

如果您使用存储过程,则可以有条件地以任一方式运行 SQL,这可能更有效。

类似于:

if @includeAll = 0 then
SELECT
Id
,Name
,Total
FROM
MyTable
WHERE Id = 3926
else
SELECT
Id
,Name
,Total
FROM
MyTable

关于sql - 为什么 SQL 评估的 WHERE 子句为 False?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com