Dapper.net의 이상한 타임 아웃 문제

dapper database-performance sql

문제

얼마 전 성능상의 이유로 dapper.net을 사용하기 시작했으며 LINQ To SQL에서 "ExecuteQuery"를 실행하는 것과 비교하여 명명 된 매개 변수 기능을 정말 좋아합니다.

그것은 대부분의 쿼리를 위해 잘 작동하지만 나는 때때로 정말로 이상한 타임 아웃을 얻는다. 가장 이상한 것은 SQL이 dapper를 통해 실행될 때만이 타임 아웃이 발생한다는 것입니다. 내가 실행 된 쿼리를 프로파일 러에서 복사 한 후 Management Studio에서 실행하면 빠르고 완벽하게 작동합니다. 그리고 그것은 단지 일시적인 문제가 아닙니다. 쿼리는 지속적으로 시간을 초과하며 Management Studio에서 계속 작동합니다.

exec sp_executesql N'SELECT Item.Name,dbo.PlatformTextAndUrlName(Item.ItemId) As PlatformString,dbo.MetaString(Item.ItemId) As MetaTagString, Item.StartPageRank,Item.ItemRecentViewCount
                    NAME_SRCH.RANK as NameRank,
                    DESC_SRCH.RANK As DescRank, 
                    ALIAS_SRCH.RANK as AliasRank, 
                    Item.itemrecentviewcount,
                    (COALESCE(ALIAS_SRCH.RANK, 0)) + (COALESCE(NAME_SRCH.RANK, 0)) + (COALESCE(DESC_SRCH.RANK, 0) / 20) + Item.itemrecentviewcount / 4 + ((CASE WHEN altrank > 60 THEN 60 ELSE altrank END) * 4) As SuperRank
                    FROM dbo.Item
                    INNER JOIN dbo.License on Item.LicenseId = License.LicenseId

                    LEFT JOIN dbo.Icon on Item.ItemId = Icon.ItemId
                    LEFT OUTER JOIN FREETEXTTABLE(dbo.Item, name, @SearchString) NAME_SRCH ON
                    Item.ItemId = NAME_SRCH.[KEY] 
                    LEFT OUTER JOIN FREETEXTTABLE(dbo.Item, namealiases, @SearchString) ALIAS_SRCH ON
                    Item.ItemId = ALIAS_SRCH.[KEY] 
                    INNER JOIN FREETEXTTABLE(dbo.Item, *, @SearchString) DESC_SRCH ON
                    Item.ItemId = DESC_SRCH.[KEY]
                    ORDER BY SuperRank DESC OFFSET @Skip ROWS FETCH NEXT @Count ROWS ONLY',N'@Count int,@SearchString nvarchar(4000),@Skip int',@Count=12,@SearchString=N'box,com',@Skip=0

그게 내가 SQL 프로파일 러에서 붙여 넣은 복사 한 쿼리입니다. 내 코드에서 이렇게 실행합니다.

            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString())) {
            connection.Open();
            var items = connection.Query<MainItemForList>(query, new { SearchString = searchString, PlatformId = platformId, _LicenseFilter = licenseFilter, Skip = skip, Count = count }, buffered: false);
            return items.ToList();
        }

나는 여기서 어디서부터 시작해야할지 모른다. 나는 단지 코드를 실행할 때 정상적으로 작동하기 때문에 더할 나위없이 진행될 무언가가있을 것이라고 생각한다.

이 스크린 샷에서 볼 수 있듯이. 이 코드는 먼저 코드를 통해 실행 된 다음 Management Studio를 통해 실행됩니다.

여기에 이미지 설명을 입력하십시오.

나는 또한이 (단지) 두 개 이상의 단어가있을 때 또는 내가 검색 문자열에 "정지"문자가있을 때 발생한다고 덧붙일 수 있습니다. 그래서 전체 텍스트 검색으로 할 일이있을 수 있지만 완벽하게 Management Studio에서 작동하므로 디버깅 방법을 파악할 수 없습니다.

그리고 문제를 더욱 악화시키기 위해 코드와 Management Studio에서 거의 동일한 데이터베이스를 사용하여 로컬 호스트에서 올바르게 작동합니다.

수락 된 답변

Dapper는 ADO.NET의 유틸리티 래퍼에 지나지 않습니다. ADN이 어떻게 작동하는지는 변경되지 않습니다. 여기에서 문제는 "ssms에서 작동하고, ado.net에서 실패합니다."라는 것이 나에게 들린다. 이것은 고유하지 않습니다.이 경우 가끔이를 찾는 것이 일반적입니다. 후보자 :

  • "set"옵션 : ado.net에서 다른 기본값이 있습니다. 특히 계산 된 + 지속 + 색인화 된 열이있는 경우 성능에 영향을 줄 수 있습니다. "set"옵션이 호환되지 않으면 해당 옵션을 사용할 수 없다고 결정할 수 있습니다. 저장된 값, 따라서 인덱스가 아니라 테이블 스캔과 재 계산이 가능합니다. 다른 유사한 시나리오가 있습니다.
  • 시스템로드 / 트랜잭션 격리 수준 / 차단; ssms에서 무언가를 실행해도 그 순간에 전체 시스템 부하가 재현되지 않습니다.
  • 캐시 된 쿼리 계획 : 때때로 더프 계획이 캐시되고 사용됩니다. ssms에서 실행하면 일반적으로 테스트에서 사용중인 매개 변수에 대해 자연스럽게 조정되는 새로운 계획이 적용됩니다. 모든 색인 통계 등을 업데이트하고 "optim for"쿼리 힌트 추가 고려

인기 답변

ADO에서 Management Studio 무한대의 CommandTimeout 30 초에 대한 기본값입니다. Query <> 호출에 대한 명령 시간 초과를 조정하십시오 (아래 참조).

var param = new { SearchString = searchString, PlatformId = platformId, _LicenseFilter = licenseFilter, Skip = skip, Count = count };
var queryTimeoutInSeconds = 120;
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString()))
{
    connection.Open();
    var items = connection.Query<MainItemForList>(query, param, commandTimeout: queryTimeoutInSeconds, buffered: false);
    return items.ToList();
}

MSDN의 SqlCommand.CommandTimeout 속성 도 참고하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow