【发布时间】:2019-02-11 23:49:00
【问题描述】:
我有一个 SQL SELECT 语句,它在 SQL Server Management Studio 中运行得非常快(5 秒),但在我的 ASP.NET 代码中运行得非常慢。
我听说这可能与参数嗅探有关。当我从 SSMS 运行 SELECT 语句时,我使用的是 SELECT。但是当我观看 SQL Profiler 时,我的 SELECT 语句作为存储过程执行,其模式为: exec sp_executesql N'SELECT foo FROM bar WHERE userid = @userid',N'@userid int',@userid=2
此 ASP.NET 代码在四分钟后超时(连接字符串设置):
SqlCommand objCommand = new SqlCommand("SELECT foo FROM bar WHERE userid = @userid", objCS);
SqlDataReader reader;
objCommand = new SqlCommand("", objCS);
objCommand.CommandType = CommandType.Text;
objCommand.Parameters.Add("@userid", SqlDbType.Int).Value = 1;
SqlDataReader reader = objCommand.ExecuteReader();
//objCommand.ExecuteReader() 超时;
此代码在 5 秒内在 SQL Server Management Studio 中执行:
DECLARE @userid AS Int = 2
SELECT foo FROM bar WHERE userid = @userid
在 5 秒内返回 60000+ 行。
如何使 ASP.NET 代码作为 SELECT 语句而不是存储过程执行,同时保留参数化存储过程的安全值?
编辑:我认为这可能与使用 SQL 语句运行代码的不同用户与在 SSMS 中运行 SQL 语句的用户有关。从代码运行的用户具有不同的服务器权限,包括对表的有限访问。 SQL 语句包含一个视图,并且用户没有对该视图中所有表的基础 SELECT 访问权限。这是否也意味着他们无法访问统计数据?
【问题讨论】:
-
作为推论,此查询在 SSMS 中运行 16 秒:DECLARE @userid AS Int = 1
-
我怀疑它是否会因为用户 ID 不同而创建不同的计划。您有多确定在使用
sp_executesql时它会产生不同的计划?您可以通过使用 ssms 中的不同用户 ID 使用sp_executesql执行查询来快速测试您的假设。 -
阅读this article。
标签: c# sql asp.net sql-server