문제

한 동료는 쿼리가 매우 길어 졌기 때문에 일부 테이블에서 인덱싱을 보라고 요청했습니다. 한 시간 넘게.

select count(1)
from databaseA.dbo.table1
inner join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)

다른 데이터베이스에 유의하십시오. 이것은 DatabaseB에서 실행되었습니다

표 1과 2의 레코드는 2 백만 개가 넘었습니다. 표 3에는 12 개의 기록이있었습니다.

쿼리 계획을 살펴 보았고 Optimizer는 Table3을 사용하여 중첩 루프 인덱스를 테이블 1과 2로 추구하기로 결정했습니다.

나의 첫 번째 가정은 테이블 1 & 2에서 통계가 심각하게 엉망이되었지만 통계를 업데이트하기 전에 조인 힌트를 추가하려고 시도했다.

select count(1)
from databaseA.dbo.table1
inner HASH join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)

결과는 15 초 안에 반환되었습니다.

제 시간이 부족한 이후로 결과를 그에게 전달했지만 이것이 길을 가로 질러 문제가 발생할 수 있을까 걱정됩니다.

통계 문제를 다시 방문하고 그런 식으로 문제를 해결해야합니까? 나쁜 쿼리 계획이 별도의 데이터베이스에서 가입 한 결과로 인해 발생했을 수 있습니까?

누구든지 당신의 경험에 따라 몇 가지 아이디어를 제공 할 수 있습니까?

도움이 되었습니까?

해결책

나는 먼저 통계를 의심 할 것이다.

의심 할 여지없이, 힌트는 99%의 사례에서 힌트를 피하고 절대적으로 필요한 증거가있을 때만 사용해야합니다.

다른 팁

테이블의 통계 및 색인을 먼저 확인하십시오. 색인 힌트는 문제를 일으킬 수 있습니다. 테이블의 데이터가 변경되면 최적화가 항상 해시를 사용하도록 강요했기 때문에보다 효율적인 계획을 선택할 수 없습니다.

중첩 루프가 가장 적합하지 않습니까? 표 3의 12 개의 레코드를 취하고 표 1의 12 개의 레코드와 일치하고 표 2의 12 개의 레코드와 일치합니다.

그렇지 않으면 해시 조인은 주문을 시행 할 것입니다. 즉, 표 1과 표 2에서 1 백만 개의 레코드를 해시 한 다음 표 3의 12 개의 레코드에 가입합니다.

나는 두 계획에 대한 통계를 살펴 보았습니다. 그리고 루프 조인이 실제로 더 효율적이라고 생각하지만 차단되었거나 해시 조인이 캐시 된 데이터를 활용하고 있다고 생각합니다.

그러나 - 예 - 일반적으로, 힌트는 최후의 수단입니다.

링크 된 서버와 관련된 느리게 실행되는 쿼리는 Collation과 관련이있을 수 있습니다. 배경은 여기를 참조하십시오. http://blogs.msdn.com/pssql/archive/2008/02/14/how-it-works-linked-servers-and-collation-comatibility.aspx해시 결합은 힌트가 Sortorder를 강제하여 성능 이득을 설명합니다.

옵션을 설정하는 방법은 다음과 같습니다.

EXEC master.dbo.sp_serveroption 
    @server=N'databaseA', 
    @optname=N'collation compatible', 
    @optvalue=N'true'

EXEC master.dbo.sp_serveroption 
    @server=N'databaseA', 
    @optname=N'use remote collation', 
    @optvalue=N'false'

-에디

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