[SQL] Where 절에 따라 SQL Server 쿼리 시간 초과
SQLWhere 절에 따라 SQL Server 쿼리 시간 초과
나는 3 기능과 여기에 게시 너무 복잡 그 아래에 몇 가지 다른 뷰를 사용하는 쿼리가 있습니다. 1 개 이상의 검색 키를 두에서 쿼리가 쿼리 당 오초에 대해 분할 소요 실행 시간을 주위에 취할 수있는 쿼리를 일으키는 가진, 최고 수준의 쿼리를 실행할 때 내가 경험하고 이상한 일이다.
여기에 최고 수준의 쿼리는 다음과 같습니다
Select *
from dbo.vwSimpleInvoice i
inner join dbo.vwRPTInvoiceLineItemDetail d on i.InvoiceID = d.InvoiceID
어디서 조항이 추가 할 때 :
Where i.InvoiceID = 109581
쿼리 실행 3 초 정도 걸립니다. 마찬가지로 나는 어디 조항이 추가 할 때 :
Where i.InvoiceID = 109582
그것은 3 초 정도 걸립니다.
나는이를 추가 할 때 where 절을하지만 :
Where i.InvoiceID in (109581, 109582)
나는 약 50 분 쿼리를 죽일 수 있었다, 그것은 어떤 결과를 반환하지 않습니다.
이는 SQL 서버 2008 R2 Express를 실행하는 원격 클라이언트의 서버에서 발생한다. 내가 (SQL 서버 2008 R2 익스프레스도) 로컬로 실행하면, 나는 절은 반환 약 30 초 정도 지난 거대한 지연을하지 않습니다. 클라이언트는하지만 나보다 훨씬 더 많은 데이터가 있습니다.
이 문제 해결을 시작하는 어떤 생각?
편집하다:
코멘트 후에 내가 처음이 개 조항의 성능을 개선하지만, 세 번째에 영향을 미치지 아니하는 인덱스와 통계를 다시 아래. 나는 다음 쿼리와 함께 주변에 연주하고, 발견이 내가 그것을로 재 작성하는 경우 :
Select *
from dbo.vwSimpleInvoice i
inner join
(Select * from dbo.vwRPTInvoiceLineItemDetail) d on i.InvoiceID = d.InvoiceID
Where i.InvoiceID in (109581, 109582)
예상 수준으로 성능을 반환, 약 200 밀리 초. 지금은 더 발생하는 것과 같이 그 어느 때보 다 신비화하고 ...
편집 2 :
사실, 내가 잘못입니다. 그것은 같은 쿼리를 재 작성되지 않았습니다, 내가 실수로 재 작성하는 동안 Where 절을 변경 :
Where d.InvoiceID in (109581, 109582)
(d I로 변경됨).
그럼에도 불구하고 이것이 내부에 엄청난 차이가 회원 가입 등 만드는 이유에 손실의 비트에?
또한 편집 :
더욱이 주위에 재생, 나는 아직도 그것을 이해할 수 없습니다.
Select InvoiceId from tblInvoice Where CustomerID = 2000
보고:
80442, 4988, 98497, 102483, 102484, 107958, 127063, 168444, 168531, 173382, 173487, 173633, 174013, 174160, 174240, 175389
Select * from dbo.vwRPTInvoiceLineItemDetail
Where InvoiceID in
(80442, 4988, 98497, 102483, 102484, 107958, 127063, 168444, 168531, 173382, 173487, 173633, 174013, 174160, 174240, 175389)
실행 : 31 행 110 밀리 반환
Select * from dbo.vwRPTInvoiceLineItemDetail
Where InvoiceID in
(Select InvoiceId from tblInvoice Where CustomerID = 2000)
실행 : 31 행은 65 분 반환
해결법
-
==============================
1.발생한 문제로 인해 (파라미터 스니핑 일명)가 아닌 다른 사람을 위해, 쿼리에 전달 된 매개 변수의 일부 버전에 적합한 캐시 된 쿼리 계획에 (거의 확실)입니다.
발생한 문제로 인해 (파라미터 스니핑 일명)가 아닌 다른 사람을 위해, 쿼리에 전달 된 매개 변수의 일부 버전에 적합한 캐시 된 쿼리 계획에 (거의 확실)입니다.
이것은 일반적인 현상이며, 종종 최신 통계 및 / 또는 심하게 조각난 인덱스 중 더욱 악화된다.
첫 번째 단계 : 귀하의 모든 인덱스를 재 구축 및 비 인덱스 컬럼에 대한 통계가 최신 상태인지했는지 확인. (또한, 확인 클라이언트 정기적으로 예약 된 인덱스 유지 관리 작업이 있습니다)
exec sp_msforeachtable "DBCC DBREINDEX('?')" go exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS" go
빠른 SSMS에서, 느린 응용 프로그램에서 :이 표준 참조입니다?
문제가 계속 인덱스를 다시 작성 및 통계를 업데이트 한 후 존재하는 경우에, 당신은 몇 가지 옵션이 있습니다 :
from https://stackoverflow.com/questions/12362221/sql-server-query-time-out-depending-on-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오류 준비된 문을 저장 프로 시저를 호출하려고 (0) | 2020.05.30 |
---|---|
[SQL] SQL 서버의 날짜를 비교하는 방법 (0) | 2020.05.30 |
[SQL] 합니까 오라클은 숫자 데이터 유형에 대한 후행 제로를 저장? (0) | 2020.05.30 |
[SQL] 지정된 값이 열 이름을 선택 (0) | 2020.05.30 |
[SQL] 어떻게 올바르게 삽입 줄 바꿈에 NVARCHAR (0) | 2020.05.29 |