我是一名DBA,并且尝试从SQL Server端跟踪性能不佳的存储过程。我正在跟踪sp_completed和rpc_completed。跟踪一般的工作负载后,我看到许多使用sp_executesql的调用。我现在无法访问开发人员来检查它们的调用方式,所以我的问题是他们是显式调用sp_executesql还是将它转换为sp_executesql之类的ADO.net调用。我尝试了下面的powershell脚本并进行了跟踪,但它没有调用sp_execute
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection #1
$SqlConnection.ConnectionString = "Server=clust1;Database=repl;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand #2
$SqlCmd.Connection = $SqlConnection #2
$SqlCmd.CommandText = "test"
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter #3
$SqlAdapter.SelectCommand = $SqlCmd #3
$SqlAdapter.SelectCommand.CommandType = [System.Data.CommandType]'StoredProcedure' #4
[int]$param=111
$SQLCmd.Parameters.Add("@a",[system.data.SqlDbType]::Int) | out-Null ##5
$SQLCmd.Parameters['@a'].Direction = [system.data.ParameterDirection]::Input ##5
$SQLCmd.Parameters['@a'].value = $param ##5
$SqlCmd.prepare()
$SqlConnection.open()
$a=$SQLCmd.executenonquery()
答案 0 :(得分:0)
我执行了您的powershell代码,但没有像您一样看到sp_executesql调用。但这是预期的。 Sp_executesql是一个存储过程,供那些不使用存储过程的人使用。他们使用sp_executesql而不是仅以纯文本形式发送SELECT(例如),以方便计划重用并降低参数嗅探的风险。
但是您告诉ADO您想执行自己的存储过程,那么为什么要使用sp_executesql?相反,它将直接作为rpc_completed事件执行您的过程。
我删除了... commandtype =存储过程...,并将命令文本更改为“ SELECT * FROM sys.columns where object_id = @a”,现在我确实看到rpc_complete with sp_executesql。