2013-09-27 1 views
0

저는 초보자이기 때문에 도움을받을 수 있기를 바랍니다. 나는 SQL 서버 2008R2에서 작업 모두가 함께 결합 네 개의 테이블에서 구성되어 전망을 해요 :이 SQL보기의 속도를 높이려면 어떻게합니까?

SELECT DISTINCT ad.award_id, 
       bl.funding_id, 
       bl.budget_line, 
       dd4.monthnumberofyear AS month, 
       dd4.yearcalendar  AS year, 
       CASE 
        WHEN frb.full_value IS NULL THEN '0' 
        ELSE frb.full_value 
       END     AS Expenditure_value, 
       bl.budget_id, 
       frb.accode, 
       'Actual'    AS Type 
FROM dw.dbo.dimdate5 AS dd4 
     LEFT OUTER JOIN dbo.award_data AS ad 
        ON dd4.fulldate BETWEEN ad.usethisstartdate AND 
              ad.usethisenddate 
     LEFT OUTER JOIN dbo.budget_line AS bl 
        ON bl.award_id = ad.award_id 
     LEFT OUTER JOIN dw.dbo.fctresearchbalances AS frb 
        ON frb.el3 = bl.award_id 
         AND frb.element4groupidnew = bl.budget_line 
         AND dd4.yearfiscal = frb.yr 
         AND dd4.monthnumberfiscal = frb.period 

뷰는 9 열 150 만 행 성장하고있다. 이보기에서 선택 *은 모든 행에 대해 20 분이 걸렸습니다. 조인 된 테이블의 필드에 인덱스를 추가하고이를 10 분으로 향상 시켰습니다. 내 질문에 더 빨리 실행되도록 선택할 수있는 다른 방법은 무엇입니까?

감사합니다. 바이올렛.

+2

SSMS에서 실행 중일 때 병목 현상이 어디 있는지 보려면'실제 실행 계획 포함 '을 사용 했습니까? – christiandev

+0

[SQL Profiler ??] (http://msdn.microsoft.com/en-us/library/ff650699.aspx) –

답변

0

사례 명세서를 없애보십시오.

행 수가 150 만 개인 경우 전체 집합이 아닌 해당 행 집합에서 흥미로운 경우 fctResearchBalances의 행을 먼저 합친 다음 조인을 수행 할 수 있습니다.

은 (는 액세스 플랜을 보지 않고 당신이 혜택을 누릴 수있는 그 밖의 무엇을 결정하기 위해 조금 어렵습니다.)

+1

선택의 경우 조금 더 많은 CPU 사용,이 경우 전혀 중요하지 않음을 의미 함 –

0

1 당신은 버퍼 캐시를 가지고 저장 프로 시저를 사용할 수 있습니다. 2 - 당신은 인덱스 된 뷰를 사용할 수 있습니다. 이것은 스키마 바인딩 된 뷰에 인덱스를 만드는 것을 의미합니다. 3- 조인에서 쿼리 힌트를 사용하여 쿼리 옵티 마이저에 특별한 종류의 조인을 사용하도록 지시 할 수 있습니다. 4 테이블 파티셔닝을 사용할 수 있습니다.

0
SELECT DISTINCT --#1 - potential bottleneck 
        ad.award_id 
       , bl.funding_id 
       , bl.budget_line 
       , [month] = dd4.monthnumberofyear 
       , [year] = dd4.yearcalendar 
       , Expenditure_value = ISNULL(frb.full_value, '0') 
       , bl.budget_id 
       , frb.accode 
       , [type] = 'Actual' 
    FROM dbo.dimdate5 dd4 
    LEFT JOIN dbo.award_data ad ON dd4.fulldate BETWEEN ad.usethisstartdate AND ad.usethisenddate 
    LEFT JOIN dbo.budget_line bl ON bl.award_id = ad.award_id 
    LEFT JOIN dbo.fctresearchbalances frb ON frb.el3 = bl.award_id --#2 - join by multiple columns 
     AND frb.element4groupidnew = bl.budget_line 
     AND dd4.yearfiscal = frb.yr 
     AND dd4.monthnumberfiscal = frb.period 
+0

Can 당신은 당신의 테이블이나 실행 계획의 DDL을 제공한다. – Devart

0

CASE 문은 정확히 어떤 문제가 얘기하지만 단지 몇 가지 포인터를 제공하는 것은 불가능 대한 추가 정보를 원하시면없이

COALESCE(frb.full_value,'0') AS Expenditure_value 

에 의해 대체 될 수있다. LEFT JOINS가 너무 많으면 조인 순서가 달라질 수 있습니다. 포함 된 열이 포함 된 표준 색인 또는 표지 색인이 있습니까? 커버 인덱스가없는 경우 기본 키가 조인에서 중요합니다. 조인 조건의 모든 기본 키 열을 포함하면 쿼리의 속도가 빨라집니다.

그런 다음 데이터를 살펴보십시오. 이러한 테이블 간의 외래 키에 대한 모든 LEFT JOINS 기반이 필요합니까? 키에 따라 LEFT JOIN은 INNER JOIN과 같을 수 있습니다. LEFT JOINS와 함께 DISTINCT가 정말 유용합니까?

얼마나 많은 RAM이 있습니까? SQL Server의 경우 8GB 이상 1.5m 행이 필요 없습니다. 이러한 조인을 최적화해야합니다.

관련 문제