sql-server - mssql 모니터링 쿼리




웹에서 실행될 때 쿼리 시간이 초과되지만 SSMS에서 실행될 때 초고속 쿼리가 실행됩니다. (5)

Entity Framework를 사용하는 경우 문자열 값에 대한 쿼리 매개 변수가 nvarchar로 데이터베이스에 전송된다는 것을 알고 있어야합니다. 비교할 데이터베이스 열이 varchar 인 경우 데이터 정렬에 따라 인덱스를 피하는 "IMPLICIT CONVERSION"이 필요할 수 있습니다.

마지막으로이 기사에 감사드립니다. https://www.sqlskills.com/blogs/jonathan/implicit-conversions-that-cause-index-scans/

내가 유지 관리하는 웹 응용 프로그램에서 SQL 시간 초과 원본을 디버깅하려고합니다. 나는 C # 코드의 소스 코드를 가지고 있으므로 정확히 어떤 코드가 실행되고 있는지 알 수 있습니다. 타임 아웃 한 SQL 코드를 실행하는 줄까지 응용 프로그램을 디버깅했으며 SQL 프로파일 러에서 실행되는 쿼리를 보았습니다.

웹에서이 쿼리를 실행하면 30 초 후에 시간이 초과됩니다. 그러나 프로파일 러에서 제시된대로 쿼리를 잘라내어 붙여 넣을 때 SSMS에 넣고 실행하면 거의 즉시 반환됩니다. ARITHABORT를 웹에서 사용중인 연결에서 OFF로 설정 한 것을 추적했습니다 (즉, SSITH 세션에서 ARITHABORT를 OFF로 설정하면 오랜 시간 동안 실행되고 다시 ON으로 설정하면 실행 됨). 매우 빠르게). 그러나, ARITHABORT에 대한 설명을 읽고, 그것은 적용되지 않는 것 ... 난 단지 간단한 SELECT를하고있어 전혀 산술 연산이 없다 .. WHERE 조건을 가진 단 하나의 INNER JOIN :

왜 ARITHABORT OFF가이 컨텍스트에서이 동작을 일으키는 것입니까 ?? SSMS에서 해당 연결에 대한 ARITHABORT 설정을 변경할 수있는 방법이 있습니까? SQL Server 2008을 사용하고 있습니다.


나는 webapp (ASP.NET)에서 약 3 분이 소요되는 동안 SMSS에서 SP로 전화를 걸려고 할 때도 2 초가 걸리는 것과 같은 문제가 발생합니다.

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


따라서 C # 코드는 어떤 방법을 사용하여 SQL Server에 임시 SQL 쿼리를 보내고 있습니까? 저장 프로 시저 사용을 고려 했습니까? 아마도 누가 호출했는지에 상관없이 동일한 성능 (적어도 엔진에서는)을 보장 할 것입니다.

왜? ARITHABORT 설정은 쿼리를 실행하는 방법을 결정할 때 (특히 계획 일치) 옵티마이 저가 확인하는 작업 중 하나입니다. 캐시의 계획은 SSMS와 동일한 설정을 가질 수 있으므로 캐시 된 계획을 사용하지만 반대 설정을 사용하면 C # 코드가 다시 컴파일 (또는 캐시에서 실제 잘못된 계획에 부딪 힐 수 있습니다)이 발생합니다. 확실히 많은 경우에 성능을 해칠 수 있습니다.

이미 저장된 프로 시저를 호출하는 경우 (사용자가 의도 한 것 같지만 쿼리를 게시하지 않은 경우) 저장 프로 시저의 잘못된 쿼리 (또는 쿼리)에 OPTION (RECOMPILE)을 추가 할 수 있습니다. 이것은 그 문장이 항상 재 컴파일된다는 것을 의미하지만, 그것은 당신이 타격을 가하는 것 같은 나쁜 계획의 사용을 막을 수 있습니다. 또 다른 옵션은 저장 프로 시저가 컴파일 될 때 SET ARITHABORT ON을 사용하여 일괄 처리가 실행되는지 확인하는 것입니다.

마지막으로 SSMS에서 ARITHABORT 설정을 변경하는 방법을 묻는 것 같습니다. 나는 당신이 당신의 코드에서 ARITHABORT 설정을 강요 할 수있는 방법을 묻는 것을 의미한다고 생각한다. C # 응용 프로그램에서 임시 SQL을 계속 전송하기로 결정한 경우 물론 명령을 세미콜론으로 구분 된 여러 문장으로 된 텍스트로 보낼 수 있습니다 (예 :

SET ARITHABORT ON; SELECT ...

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


매개 변수 스니핑을 수정하기 위해 코드를 변경할 수있는 경우 알려지지 않은 힌트를위한 최적화가 최선의 선택입니다. 코드를 변경할 수 없다면 가장 좋은 옵션은 exec sp_recompile 'name of proc'입니다.이 옵션은 하나의 저장된 proc 만 새로운 실행 계획을 얻도록합니다. proc을 삭제하고 다시 만들면 비슷한 결과가 발생하지만 사용자가 삭제 한 동안 누군가가 proc을 실행하려고하면 오류가 발생할 수 있습니다. DBCC FREEPROCCACHE는 캐시 된 계획을 모두 삭제하여 대량의 트랜잭션 생산 환경에서 많은 시스템 중단을 유발할 수 있습니다. arithabort를 설정하는 것은 문제의 해결책이 아니지만 매개 변수 스니핑이 문제인지를 발견하는 데 유용한 도구입니다.


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

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

 DBCC DROPCLEANBUFFERS
 DBCC FREEPROCCACHE

최신 정보

대부분의 사람들은이 문제가 매우 드물게 발생하는 것으로 보이며, 위의 기술은 적절한 일회성 해결 방법입니다. 그러나 특정 쿼리에서이 문제가 두 번 이상 나타나는 경우이 문제에 대한 장기적인 해결책은 이 문서 에서 설명하는 OPTIMIZE FOROPTION(Recompile) 과 같은 쿼리 힌트를 사용하는 것입니다.





arithabort