我有一个SQL SELECT语句,它在SQL Server Management Studio中运行得非常快(5秒),但从我的 ASP.NET 代码中运行得非常慢。
我读过这可能与参数嗅探有关。当我从 SSMS 运行 SELECT 语句时,我使用的是 SELECT。但是当我观看SQL事件探查器时,我的SELECT语句作为具有模式的存储过程执行:exec sp_executesql N'SELECT foo FROM bar,其中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() 上超时;
此代码在 SQL Server Management Studio 中执行,时长 5 秒:
DECLARE @userid AS Int = 2
SELECT foo FROM bar WHERE userid = @userid
在 5 秒内返回 60000 多行。
如何使 ASP.NET 代码作为 SELECT 语句而不是存储过程执行,同时保留参数化存储过程的安全值?
编辑:我认为这可能与使用SQL语句运行代码的不同用户与在SSMS中运行SQL语句的用户有关。从代码运行的用户具有不同的服务器权限,包括对表的有限访问权限。SQL 语句包含一个视图,并且用户对该视图中的所有表没有基础 SELECT 访问权限。这是否也意味着他们无法获得统计数据?
慕的地10843
萧十郎
相关分类