gpt4 book ai didi

sql-server - ADO.NET 命令和 SQL 查询计划

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

我一直在阅读查询计划以及如何最大限度地减少 SQL Server 为同一基本查询创建的重复计划。例如,如果我理解正确,发送带有内联值的查询可能会导致 2 个不同的查询计划。过于简化的示例:

"SELECT FirstName FROM Members WHERE LastName = 'Lee'"
"SELECT FirstName FROM Members WHERE LastName = 'MacGhilleseatheanaich'"

使用存储过程可以避免这种情况,因为它可以确保查询哈希相同。 “LastName”作为参数传递,例如:

CREATE PROCEDURE sp_myStoredProcedure
@LastName varchar(100)
AS
SELECT FirstName FROM Members WHERE LastName = @LastName
Go

现在,我的问题是这是否同样适用于 Command 对象(例如 ADO.NET 中的 SQLClient.SQLCommand)。我问的原因是字符串参数没有定义最大长度,如上面的代码所示。采取以下代码:

MyCmd.CommandText = "SELECT FirstName FROM Members WHERE LastName = @LastName"
MyCmd.Parameters.AddWithValue("@LastName", "Lee")

然后:

MyCmd.Parameters.Clear()
MyCmd.Parameters.AddWithValue("@LastName", "MacGhilleseatheanaich")

由于 @LastName 尚未向 SQL Server 声明为具有定义的最大长度,因此当我以这种方式执行命令时,SQL Server 是否会为每个不同的值创建一个新的查询计划?

我的问题主要来自阅读.NET 3.5 中的 LINQ2SQL 如何通过定义不同的参数长度( http://damieng.com/blog/2009/12/13/sql-server-query-plan-cache )来错过缓存。由于使用 Command 对象时也没有定义长度,所以它不会有同样的问题吗?

最佳答案

您的参数化查询实际上作为对系统存储过程sp_executesql的调用发送到服务器,该存储过程非常擅长通过比较的哈希值来尽可能地重用查询计划。未填充的语句掩码以及计划的语句掩码仍然存在于缓存中,因此如果可能并且服务器认为其合适,您就有很好的机会重用计划(也可能存在参数嗅探问题)。

还值得一提的是Simple Parameterization几乎可以保证第一个示例中的两个语句实际上最终会使用相同的计划。

关于sql-server - ADO.NET 命令和 SQL 查询计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8155214/

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