2014-04-24 3 views
0

ASP.NET-WebApplication에 GridView가 있습니다.
간단히 말해 GridView에는 GUID가있는 열과 확인란이있는 열이 있습니다.
GridView 위에 "Update selected entries"이라는 버튼이 있습니다.이 버튼은 잘 체크 된 항목을 업데이트합니다.

나는이 같은 문자열의 체크 항목을 수집 :
CHARINDEX를 사용하여 선택된 항목을 업데이트하십시오.

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 개 항목 업데이트에는 약 1 분 소요)를 초과합니다.

상황이 이미 성능 증가했다 :/SET NOCOUNT OFF

  • 세트 NOCOUNT ON SET 필요

    • 생성 된 인덱스를; 나는 그것의 실행 계획을 보았다

    VB.NET에서 SP (.CommandText = "dbo.sp_UpdateEntries")를 호출하고 단계 Clustered Index Update는 약 60 %의 동작을 취 것으로 보인다 경우에도 내 테이블 dbo. 등을 사용하여

  • 소송 비용.

    이 작업의 성능을 어떻게 향상시킬 수 있습니까? CHARINDEX을 올바르게 사용하고 있습니까?

  • 답변

    3

    문자열에서 쿼리를 구성하는 경우 charindex()이 가장 효율적인 작업이 아닙니다. 대신 일련의 비교를 구성하십시오. 나는 @sAllTheIds의 형식이 무엇인지 모르겠지만, 이런 식으로 뭔가를 작동 할 수 있습니다 : 다른 데이터 유형의

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

    , 난 그냥 in를 사용하고 있지만 GUID가 더 어렵다 건의 할 것입니다. 또한 비교 목록에 GUID에 대한 문자열 구분 기호 또는 캐스트 작업이 필요할 수도 있습니다.

    +0

    감사합니다. 이것은 좋은 아이디어입니다. 시도해보십시오! – seph

    관련 문제