一段时间内未发生变化的视图现在因算术溢出而失败。我已经确定了导致问题的行,它是一个“旧”行,已经存在多年并且没有变化。该行不构成最终结果集的一部分,因此看起来我在
CAST
子句中执行的 SELECT
操作正在过滤数据集之前进行评估。
相关列未在任何
JOIN
或 WHERE
条件下被引用,因此没有理由在过滤之前对其进行评估。
我尝试了各种方法来使其被过滤掉,包括基础表上的
FORCE ORDER
查询提示和UPDATE STATISTICS
(以防这会导致查询优化器失效),但没有成功。
有没有办法告诉优化器首先过滤数据?我不想篡改数据以使其发挥作用。
看来我在 SELECT 子句中执行的 CAST 操作正在过滤数据集之前进行评估。
对于 SQL Server 来说,这已经是可能的......甚至很常见......生成这样的执行计划至少可以追溯到 SQL Server 2000(可能更久)。有许多 SQL Server 可能决定在过滤数据之前评估这些表达式,并且您几乎无法强制事情以其他方式工作。
通常,这表明您的模式存在设计问题,但对于难以修复的现有系统,您可能需要切换到较新的
TRY_CAST()
方法。