使用CHARINDEX更新所选条目

时间:2014-04-24 13:11:54

标签: sql sql-server vb.net

我的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个条目大约需要一分钟)。

我已经做过的提高绩效的事情:

  • 根据需要创建索引
  • 设置SET NOCOUNT ON; / SET NOCOUNT OFF;
  • 在我的表中使用dbo.以及在VB.NET中调用SP时使用.CommandText = "dbo.sp_UpdateEntries"

我查看了它的执行计划,似乎步骤Clustered Index Update需要大约60%的运营成本。

如何提高此操作的性能?在这里正确使用CHARINDEX吗?

1 个答案:

答案 0 :(得分:3)

如果从字符串构造查询,则charindex()不是最有效的操作。相反,构建一系列比较。我不知道@sAllTheIds的格式是什么,但这样的事情可能有用:

'WHERE 1=0'+replace(@sAllTheIds, ',', ' OR myGuid = ')

对于其他数据类型,我建议只使用in,但GUID更难。此外,您可能需要在比较列表中为GUID设置字符串分隔符或强制转换操作。