2010-01-23 2 views
2

나는이 질문이 :실행 계획을 신뢰할 수 있습니까?

With CTE(comno) as 
(select distinct comno=ErpEnterpriseId from company) 
select id=Row_number() over(order by comno),comno from cte 

select comno=ErpEnterpriseId,RowNo=Row_number() over (order by erpEnterpriseId) from company group by ErpEnterpriseId 


SELECT erpEnterpriseId, ROW_NUMBER() OVER(ORDER BY erpEnterpriseId) AS RowNo 
FROM 
( 
    SELECT DISTINCT erpEnterpriseId 
    FROM Company 
) x 

그 중 세 가지가 동일한 비용과 실제 실행 plans..why 어떻게 그렇게를 반환 모든?

답변

1

쿼리 최적화 도구를 사용하면 가장 효율적인 실행 계획에 입력하는 쿼리를 최적화하려고합니다. 즉, 여러 쿼리가 가장 효율적으로 평가되는 SAME 문으로 최적화 될 수 있습니다.

쿼리를 최적화하고 어떤 것이 가장 잘 수행되는지 알아 내려고 할 때해야 할 중요한 일은 쿼리를 시도하고 성능을 비교하는 것입니다. SQL 프로파일 러 추적을 실행하여 각 버전의 지속 시간/읽기 횟수를 확인하십시오. 나는 대개 각 버전의 쿼리를 3 번 ​​실행하여 평균값을 비교합니다. 매번 누락 된 결과를 방지하기 위해 실행 계획과 데이터 캐시를 지우십시오.

옵티마이 저는 this MSDN article을 읽어야합니다.

1

간단하면 옵티마이 저는 모든 명령문을 동일한 명령문으로 돌리고 있습니다.

+0

안녕하세요, 오타 비오, 확답이 아닌 대답을 부탁드립니다 .. – TonyP

+0

그건 내 대답이고 나는 그것에 충실합니다. –

0

같은 말을하는 방법이 여러 가지 인 영어와 마찬가지로 세 가지 쿼리 모두 동일한 데이터를 요구하고 있습니다. SQL 엔진 (쿼리 최적화 프로그램)은이를 알고 있으며 당신이 묻는 것을 알만큼 충분히 똑똑합니다.

더욱 적절하게 엔진에는 사용자가 알지 못하거나 알지 못하는 정보 - 데이터의 구성 및 인덱싱 방법 -이 있습니다. 이 정보를 사용하여 데이터를 얻는 가장 좋은 방법이 무엇인지에 대한 자신의 결정을 내리고 있으며, 그것이 무엇을하고 있는지를 결정합니다.

옵티 마이저를 무시할 수있는 방법이 있지만 실제로 수행중인 작업을 모르는 경우 성능이 저하 될 수 있습니다. 그래서 가장 좋은 방법은 가독성과 유지 보수성을 위해 (또는 다른 사람에게) 어떤 식 으로든 쿼리를 작성하는 것입니다.

관련 문제