2014-09-15 2 views
2

비교적 복잡한 설정이 있습니다. IBM DB2 서버 인 3 개의 연결된 서버와 함께 SQL Server 2012를 사용하고 있습니다. 세 가지 연결된 서버의 테이블을 조인하여 데이터를 가져 오는 여러 쿼리가 있습니다. 사용하고있는 버전의 특성 때문에 일부 OLAP 함수를 직접 사용할 수 없습니다. 업그레이드가 옵션이 아니기 때문에 해결 방법은 뷰를 만들고 뷰에서 해당 함수를 실행하는 것이 었습니다. 현재 직면 한 한 가지 문제는 뷰에서 ORDER BY을 사용하면 뷰가 실행되는 데 필요한 시간이 거의 세 배가된다는 것입니다.VIEW를 실행하면 ORDER BY가 너무 많은 시간이 걸립니다.

SELECT으로 만 실행하면 24 초가 걸릴 수 있습니다. (예, 여기서 우스운 이야기를하는 것을 알지만 여전히 쿼리를 수정할 수 없기 때문에 문제를 해결할 수 있습니다. DB2 서버에서는 order by이 내 편이 다.) ORDER BY을 사용할 때 어떤 열을 주문했는지에 따라 68 초에서 80 초가된다. 지금은 OpenQuery으로 허용 되었기 때문에 나는 schemabound보기를 만들 수 없습니다. 어쨌든보기를 만들 때 ORDER BY을 사용할 수 없다는 것을 읽었습니다. 시도하지는 않았지만 여러 번 사용할 수 있도록 주문해야합니다. 열은보기 좋지 않은데,보기에는별로 좋지 않지만 ... 몰라요.

일반적으로 SQL에 대한 간단한 지식이 있기 때문에 최선의 선택이 무엇인지 잘 모르겠습니다. 실행 시간이 고정 된 경우에도 전체 쿼리에 필요한 시간과 비교할 때 내 Order by 절이 너무 많은 시간을 소비하는 것을 원하지 않습니다. 쿼리를 직접 실행하면 최대한 빠르게 만들 수 있습니다. 뷰를 사용하지 않고 ORDER BY을 초기 query에 추가하면 원래 시간은 24 초가되고 36까지 증가합니다. 같은 ORDER BY 함수가 뷰에서 실행될 때의 퍼센티지는 여전히 성능보다 훨씬 낫습니다.

제 질문은 - 무엇 때문에 ORDER BY이 너무 느리게 실행되고 원래 쿼리의 일부였던 것처럼 빠르게 만들 수 있습니까? 걸리는 엄청난 시간을 줄일 수 있습니까?

+0

, 당신 때문에에 의해 주문과 뷰를 정의해서는 안됩니다 (반드시) 명령 받다. 전화를 할 때 명시 적으로 주문해야합니다. 명시 적으로 순서화 할 때 속도가 느리면 순서에 따라 사용중인 소스 컬럼에 인덱스가 있는지 확인하십시오. – Oliver

답변

1

보기는 다른 실행 계획을 사용하는 쿼리와 다른 실행 계획을 사용합니다. 제 견해로 이것은 약간의 견해의 결점입니다. ORDER BY은 특히 비싼 명령이므로 실행 계획의 차이를 매우 눈에 띄게 만듭니다.

쿼리를 실행하는 것과 동일한 실행 계획을 사용하는 것처럼 보였으므로이 문제점에 대한 대안은 테이블 반환 함수 경로로 이동하는 것입니다. 여기

표 반환 함수의 괜찮은 쓰기 - 업 : 당신이 실제로하지 않습니다 뷰를 호출 할 때 내가 이해에서 http://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx