为了账号安全,请及时绑定邮箱和手机立即绑定

如何防止在 SELECT 语句中嗅探 .NET 正在变成 EXEC 的参数?

如何防止在 SELECT 语句中嗅探 .NET 正在变成 EXEC 的参数?

C#
哈士奇WWW 2022-09-04 16:47:02
我有一个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 = 2SELECT foo FROM bar WHERE userid = @userid在 5 秒内返回 60000 多行。如何使 ASP.NET 代码作为 SELECT 语句而不是存储过程执行,同时保留参数化存储过程的安全值?编辑:我认为这可能与使用SQL语句运行代码的不同用户与在SSMS中运行SQL语句的用户有关。从代码运行的用户具有不同的服务器权限,包括对表的有限访问权限。SQL 语句包含一个视图,并且用户对该视图中的所有表没有基础 SELECT 访问权限。这是否也意味着他们无法获得统计数据?
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

如果它确实是参数嗅探(您必须查看实际计划才能确定),并且您确定您有正确的索引,则可以更新查询以使用索引提示,但IMO不是最佳方法。如果可以将查询放入存储过程中,则可以使用“重新编译”标记存储过程,这样它就不会重用第一个计划。IMO,这比强制索引提示是更好的做法。


查看完整回答
反对 回复 2022-09-04
?
萧十郎

TA贡献1815条经验 获得超13个赞

您的问题与参数嗅探无关。但是使用 SSMS 和后端设置选项。每当从 SSMS 执行语句时,它都会使用 SSMS 定义的属性。您可以在

>>工具 >> SQL Server >> 高级查询执行>>选项

你将在 SSMS 中启用 SET ARITH_ABORT 选项。但你没有在你的程序中。因此,在您的过程中添加以下行并再次测试。

SET ARITHABORT ON

我对您的问题非常有信心,它将通过此得到解决。


查看完整回答
反对 回复 2022-09-04
  • 2 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号