문제

내가 유지 관리하는 웹 응용 프로그램에서 SQL 타임 아웃 소스를 디버깅하려고합니다. C# 코드의 소스 코드가 뒤에 있으므로 어떤 코드가 실행 중인지 정확히 알고 있습니다. Application을 바로 아래로 내려 놓은 SQL 코드를 실행하는 라인으로 바로 디버깅했으며 SQL Profiler에서 쿼리가 실행되는 것을 봅니다.

이 쿼리가 웹에서 실행되면 30 초 후에 시간이 소요됩니다. 그러나 프로파일 러에 제시된대로 정확하게 쿼리를 자르거나 붙여 넣고 SSM에 넣고 실행하면 거의 즉시 반환됩니다. 나는 웹이 사용중인 연결에서 Arithabort가 꺼져있는 문제를 추적했습니다 (즉, SSMS 세션에서 Arithabort를 끄면 오랫동안 실행되면 다시 켜면 실행됩니다. 매우 빠르게). 그러나 Arithabort에 대한 설명을 읽으면 적용되지 않는 것 같습니다 ... 나는 간단한 선택 만하고 있으며, 산술이 전혀 수행되지 않습니다.

왜 Arithabort 가이 맥락 에서이 동작을 일으킬 것인가 ?? SSMS에서 해당 연결에 대한 Arithabort 설정을 변경할 수있는 방법이 있습니까? SQL Server 2008을 사용하고 있습니다.

도움이 되었습니까?

해결책

따라서 C# 코드는 어떤 방법을 사용하여 Ad Hoc SQL 쿼리를 SQL Server로 전송하고 있습니까? 저장된 절차 사용을 고려해 보셨습니까? 그것은 아마도 누가 그것을 불렀는지에 관계없이 동일한 성능 (적어도 엔진에서)을 보장 할 것입니다.

왜요? Arithabort 설정은 쿼리를 실행하는 방법을 결정할 때 최적화기가 보는 것 중 하나입니다 (특히 계획 일치를 위해). 캐시의 계획이 SSMS와 동일한 설정을 가질 수 있으므로 캐시 된 계획을 사용하지만 반대편으로 C# 코드를 설정하면 재 컴파일을 강요하고 있습니다 (또는 아마도 실제로 누르고있을 것입니다. 나쁜 캐시에서 계획) 많은 경우에 성능을 상하게 할 수 있습니다.

저장된 절차를 이미 호출하는 경우 (쿼리를 게시하지 않았지만, 의도했지만) 저장된 절차에서 문제 쿼리 (또는 쿼리)에 옵션 (재 컴파일)을 추가 할 수 있습니다. 이것은 그러한 진술이 항상 다시 컴파일 될 것이라는 것을 의미하지만, 당신이 타격을 받고있는 나쁜 계획의 사용을 막을 수 있습니다. 또 다른 옵션은 저장 프로 시저가 컴파일되면 세트 Arithabort를 사용하여 배치가 실행되는지 확인하는 것입니다.

마지막으로 SSMS에서 Arithabort 설정을 변경할 수있는 방법을 묻는 것 같습니다. 나는 당신이 묻는 것이 코드에서 Arithabort 설정을 강요 할 수있는 방법입니다. C# 앱에서 Ad Hoc SQL을 계속 보내기로 결정한 경우 물론 세미 콜론으로 여러 문장이있는 텍스트로 명령을 보낼 수 있습니다.

SET ARITHABORT ON; SELECT ...

이 문제가 발생한 이유에 대한 자세한 내용은 Erland Sommarskog의 위대한 기사를 참조하십시오.

다른 팁

이 답변 이 문제를 해결하는 방법이 포함되어 있습니다.

데이터베이스에서 다음 명령을 실행하면 Arithabort 설정에 관계없이 모든 쿼리가 예상대로 실행됩니다.

 DBCC DROPCLEANBUFFERS
 DBCC FREEPROCCACHE

업데이트

대부분의 사람들 이이 문제가 거의 발생하지 않는 것 같습니다. 위의 기술은 괜찮은 일회성 수정입니다. 그러나 특정 쿼리 가이 문제를 두 번 이상 보여 주면이 문제에 대한보다 장기적인 해결책은 다음과 같은 쿼리 힌트를 사용하는 것입니다. OPTIMIZE FOR 그리고 OPTION(Recompile), 설명대로 이 기사.

이 문제가 여러 번 전에 문제가 있었지만 저장된 Proc를 삭제하고 재현하는 동일한 문제가있는 저장 절차가있는 경우 문제가 해결됩니다.

파라미터 스니핑이라고합니다. 향후이 문제를 피하기 위해 저장된 Proc의 매개 변수를 항상 로컬 화해야합니다.

나는 이것이 원래 포스터가 원하는 것이 아니라 같은 문제를 가진 사람을 도울 수 있다는 것을 이해합니다.

엔티티 프레임 워크를 사용하는 경우 문자열 값에 대한 쿼리 매개 변수는 기본적으로 NVARCHAR로 데이터베이스로 전송되면 데이터베이스 열을 입력 한 경우 콜레이션에 따라 쿼리 실행 계획이 "암시 적 변환"단계가 필요할 수 있습니다. 전체 스캔을 강요합니다. 비싼 쿼리 옵션에서 데이터베이스 모니터링을 검토하여 실행 계획을 표시하여 확인할 수 있습니다.

마지막 으로이 기사 에서이 행동에 대한 설명 :https://www.sqlskills.com/blogs/jonathan/implicit-conversions-tat-cause-index-scans/

나는 같은 문제가 있었고 "Recompile을 사용하여"절차를 실행하여 고정되었습니다. 매개 변수 스니핑을 사용해 볼 수도 있습니다. 내 문제는 SQL 캐시와 관련이있었습니다.

코드를 변경하여 매개 변수 스니핑 최적화를 수정하여 알 수없는 힌트가 최선의 선택입니다. 코드를 변경할 수없는 경우 가장 좋은 옵션은 Exec SP_Recompile 'Proc'라는 것이며, 이는 저장된 Proc 만 새로운 실행 계획을 얻도록 강요합니다. Proc를 떨어 뜨리고 재현하면 비슷한 효과가 있지만 누군가가 Proc를 떨어 뜨리는 동안 Proc를 실행하려고하면 오류가 발생할 수 있습니다. DBCC FreeproCchache는 모든 캐시 된 요금제를 떨어 뜨릴 수있는 모든 캐시 계획을 중단하여 시스템을 혼란스럽게 할 수 있습니다. Arithabort를 설정하는 것은 문제에 대한 해결책이 아니라 매개 변수 스니핑이 문제인지 여부를 발견하는 데 유용한 도구입니다.

SMS에서 SP를 호출하려고 할 때 2 초가 걸렸고 WebApp (ASP.NET)에서 약 3 분이 걸렸습니다.

제안 된 모든 솔루션을 시도했습니다 sp_recompile, DBCC FREEPROCCACHE 그리고 DBCC DROPCLEANBUFFERS 그러나 아무것도 내 문제를 해결하지 못했지만 매개 변수 스니핑을 시도했을 때 트릭을 수행했으며 잘 작동했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top