我的ASP.NET-WebApplication中有一个GridView
简单地说,GridView包含两列,一列带有GUID,另一列带有一个复选框
在GridView的顶部有一个名为" Update selected entries
"的按钮,它会更新已检查的条目。
我用这样的字符串收集已检查的条目:
Dim sAllTheIDs As String = ""
For Each dRow As GridViewRow In myGridView.Rows
If dRow.RowType = DataControlRowType.DataRow Then
If DirectCast(dRow.FindControl("myCheckBox"), CheckBox).Checked Then
sAllTheIDs &= myGridView.DataKeys(dRow.RowIndex).Value.ToString() & ", "
End If
End If
Next
'remove the ", " to make it a valid parameter
If sAllTheIDs.Length > 0 Then
sAllTheIDs = sAllTheIDs.Remove(sAllTheIDs.Length - 2, 2)
End If
upadte本身是使用存储过程完成的,如下所示:
declare @sSQL nvarchar(max)
set @sSQL = 'UPDATE dbo.myTable ' +
'SET myColumn = myValue ' +
'WHERE CHARINDEX(CAST(myGUID as nvarchar(50)),@sAllTheIDs) > 0 '
exec sp_executesql @sSQL, N'@sAllTheIDs as nvarchar(4000)', @sAllTheIDs
这似乎工作得很好,但如果有30多个GUID,它超过30秒的默认超时(更新50个条目大约需要一分钟)。
我已经做过的提高绩效的事情:
dbo.
以及在VB.NET中调用SP时使用.CommandText = "dbo.sp_UpdateEntries"
我查看了它的执行计划,似乎步骤Clustered Index Update
需要大约60%的运营成本。
如何提高此操作的性能?在这里正确使用CHARINDEX
吗?
答案 0 :(得分:3)
如果从字符串构造查询,则charindex()
不是最有效的操作。相反,构建一系列比较。我不知道@sAllTheIds
的格式是什么,但这样的事情可能有用:
'WHERE 1=0'+replace(@sAllTheIds, ',', ' OR myGuid = ')
对于其他数据类型,我建议只使用in
,但GUID更难。此外,您可能需要在比较列表中为GUID设置字符串分隔符或强制转换操作。