gpt4 book ai didi

sql - SQL 'clever enough' 是在一个简单的地方优化掉一个 NULL 检查吗?

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

诚然,标题可能有点令人困惑,所以我将从一个例子开始。

我有一个包含大量数据的表。我将日期传递给存储过程,该存储过程将用作非常标准的 select 上的 where 的一部分:

@MinDate DATETIME

SELECT *
FROM MyTable
WHERE (@MinDate IS NULL OR DatePublished >= @MinDate)

这工作正常,但是数据库是否为每条记录评估 @MinDate?即它是否命中了 where 并且每次都必须检查是否为 null?如果是这样,将其重构为:

@MinDate DATETIME

IF(@MinDate IS NULL)
SELECT *
FROM MyTable
ELSE
SELECT *
FROM MyTable
WHERE DatePublished >= @MinDate

编辑:请忽略一些小的语法错误,为了简单起见,我已将其断章取义。我要问的前提仍然很清楚。

最佳答案

SQL Server 确实在其索引和统计信息中包含空值,但它是否有用取决于列的选择性。如果您有很多空值,那么扫描可能比查找更有效,因为无论如何您最终都会阅读相同或更多的页面。

所以,是的,SQL Server 会尝试为您的查询生成一个有效的计划,但它最终会做什么取决于数据和可用索引(如果启用,它还可以自动构建统计信息)。通过查看查询计划很容易验证。

顺便说一句,您的第二个查询返回与第一个查询不同的结果(无法承受有效的 TSQL 语法)。

关于sql - SQL 'clever enough' 是在一个简单的地方优化掉一个 NULL 检查吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33518450/

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