복붙노트

[SQL] Where 절에 따라 SQL Server 쿼리 시간 초과

SQL

Where 절에 따라 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. ==============================

    1.발생한 문제로 인해 (파라미터 스니핑 일명)가 아닌 다른 사람을 위해, 쿼리에 전달 된 매개 변수의 일부 버전에 적합한 캐시 된 쿼리 계획에 (거의 확실)입니다.

    발생한 문제로 인해 (파라미터 스니핑 일명)가 아닌 다른 사람을 위해, 쿼리에 전달 된 매개 변수의 일부 버전에 적합한 캐시 된 쿼리 계획에 (거의 확실)입니다.

    이것은 일반적인 현상이며, 종종 최신 통계 및 / 또는 심하게 조각난 인덱스 중 더욱 악화된다.

    첫 번째 단계 : 귀하의 모든 인덱스를 재 구축 및 비 인덱스 컬럼에 대한 통계가 최신 상태인지했는지 확인. (또한, 확인 클라이언트 정기적으로 예약 된 인덱스 유지 관리 작업이 있습니다)

    exec sp_msforeachtable "DBCC DBREINDEX('?')"
    go
    
    exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
    go
    

    빠른 SSMS에서, 느린 응용 프로그램에서 :이 표준 참조입니다?

    문제가 계속 인덱스를 다시 작성 및 통계를 업데이트 한 후 존재하는 경우에, 당신은 몇 가지 옵션이 있습니다 :

  2. from https://stackoverflow.com/questions/12362221/sql-server-query-time-out-depending-on-where-clause by cc-by-sa and MIT license