gpt4 book ai didi

sql - 奇怪的 SQL Server 查询问题

转载 作者:行者123 更新时间:2023-12-04 07:08:14 26 4
gpt4 key购买 nike

所以我在 SQL Server 存储过程中遇到了这个奇怪的问题。基本上我有这个漫长而复杂的过程。像这样的东西:

SELECT Table1.col1, Table2.col2, col3
FROM Table1 INNER JOIN Table2
Table2 INNER JOIN Table3
-----------------------
-----------------------
(Lots more joins)
WHERE Table1.Col1 = dbo.fnGetSomeID() AND (More checks)
-----------------------
-----------------------
(6-7 More queries like this with the same check)

问题是检查表1.Col1 = dbo.fnGetSomeID()末尾的WHERE子句。函数 dbo.fnGetSomeID() 返回一个简单的整数值 1。所以当我硬编码值 1 时,函数调用应该是 SP 只需要大约 15 秒。但是当我用 WHERE 子句中的函数调用替换它时,大约需要 3.5 分钟。

所以我这样做:
DECLARE @SomeValue INT
SET @SomeValue = dbo.fnGetSomeID()
--Where clause changed
WHERE Table1.Col1 = @SomeValue

所以现在这个函数只被调用一次。但是还是一样的3.5分钟。所以我继续这样做:
DECLARE @SomeValue INT
--Removed the function, replaced it with 1
SET @SomeValue = 1
--Where clause changed
WHERE Table1.Col1 = @SomeValue

仍然需要3.5分钟。为什么会影响性能?以及如何让它消失?

最佳答案

即使@SomeValue 设置为 1,当你有

WHERE Table1.Col1 = @SomeValue

SQL Server 可能仍将 @SomeValue 视为变量,而不是硬编码的 1,这会相应地影响查询计划。由于 Table1 链接到 Table2,Table2 链接到 Table3 等,运行查询的时间量被放大。另一方面,当你有
WHERE Table1.Col1 = 1

查询计划被 Table1.Col1 锁定在一个常数值 1 上。只是因为我们看到
WHERE Table1.Col1 = @SomeValue

作为“硬编码”,并不意味着 SQL 以相同的方式看待它。每个可能的笛卡尔积都是一个候选,@SomeValue 需要为每个乘积进行评估。
因此,标准建议适用 - 检查您的执行计划,如果需要重写查询。

另外,这些连接列是否已编入索引?

关于sql - 奇怪的 SQL Server 查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776235/

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