2013-10-02 5 views
3

일련의 다른보기를 위해 작성한 일련의보기가 있습니다. 그들은 5k보다 적은 레코드를 반환하는 최종 뷰로 서로 빌드합니다. 이보기를 열면 실행하는 데 1 초도 채 걸리지 않습니다. WHERE collumn IS NOT NULL을 추가하면 2 분 이상 걸립니다. 이 보고서는 매우 자주 실행해야 할 필요는 없지만 매주, 매일, 때로는 더 자주 실행해야하는 보고서가 있습니다.TSQL Query of View는 오랜 시간이 걸립니다.

내 솔루션은 뷰의 데이터에서 테이블을 만들고 쿼리하는 저장 프로 시저를 만드는 것입니다. 예약 된 보고서가 자동으로 실행되기 전에 실행되도록 저장 프로 시저를 설정합니다. 이 확인을 작동하지만 업데이트 된 보고서를 가져올 때마다 수동으로 저장 프로 시저를 실행해야합니다.

더 좋은 방법이 있습니까?

제출 된 주 재무를 찾으려면 [MW_Submitted_ROY]를보십시오. 이보기는 활동 테이블과 실행 기록 데이터를 정적 테이블에 결합합니다. 나는 정적 테이블의 데이터를 활성 테이블과 동일한 형식으로 마사지했다.

SELECT  oe_po_no, cus_no, user_def_fld_1, user_def_fld_2, tot_sls_amt 
FROM   MW_Submitted_Weeks_OldMacola 
WHERE  MW_Submitted_Weeks_OldMacola.oe_po_no LIKE 'adv%' 
UNION 
SELECT  oe_po_no, cus_no, user_def_fld_1, user_def_fld_2, tot_sls_amt 
FROM   oehdrhst_sql 
WHERE  oehdrhst_sql.oe_po_no LIKE 'adv%' 

[MW_Company_Weeks]를 보면 현재 및 전년도에 재무를 제출할 수있는 가능한 모든 주를 생성 할 수 있습니다.

SELECT  MW.MW_Weeks.Year, MW.MW_Weeks.Week, MW.MW_CompanyCodes.cmp_code 
FROM   MW.MW_Weeks CROSS JOIN 
        MW.MW_CompanyCodes 
WHERE  (MW.MW_Weeks.WEDate <= GETDATE()) AND (MW.MW_Weeks.Year > YEAR(GETDATE()) - 2) 

내가보고

주이없는 저를 보여 최종보기 [MW_Missing_Weeks] 우리에게 가져다
SELECT  dbo.cicmpy.textfield2 AS [Group], dbo.cicmpy.cmp_code, dbo.cicmpy.cmp_name,   dbo.cicmpy.cmp_fadd3 AS Owner, dbo.cicmpy.SalesPersonNumber, 
        MW.MW_Submitted_ROY.user_def_fld_1 AS Year, MW.MW_Submitted_ROY.user_def_fld_2 AS Week, MW.MW_Submitted_ROY.oe_po_no AS Description, 
        MW.MW_Submitted_ROY.tot_sls_amt 
FROM   dbo.cicmpy INNER JOIN 
        MW.MW_Submitted_ROY ON dbo.cicmpy.cmp_code = MW.MW_Submitted_ROY.cus_no 
WHERE  (dbo.cicmpy.cmp_code LIKE 'C%') AND (dbo.cicmpy.cmp_status = 'a') AND (dbo.cicmpy.cmp_type = 'C') 

를 생성해야 회사 및 가치에 대해 더 많은 정보를 결합하여 [MW_Submitted_Weeks_By_RBC_ROY]보기 가 지난 회계 연도에 제출되었습니다. 여기서 'null이 아님'을 추가하면 영원히 걸릴 수 있습니다. SSMS에서

SELECT  MW.MW_Company_Weeks.Year, MW.MW_Company_Weeks.Week, MW.MW_Company_Weeks.cmp_code, bPrev.tot_sls_amt, bPrev.[Group], bPrev.cmp_name, bPrev.Owner, 
        bPrev.SalesPersonNumber, bPrev.Description 
FROM   MW.MW_Company_Weeks LEFT OUTER JOIN 
        MW.MW_Submitted_Weeks_By_RBC_ROY ON MW.MW_Company_Weeks.cmp_code = MW.MW_Submitted_Weeks_By_RBC_ROY.cmp_code AND 
        MW.MW_Company_Weeks.Year = MW.MW_Submitted_Weeks_By_RBC_ROY.Year AND MW.MW_Company_Weeks.Week = MW.MW_Submitted_Weeks_By_RBC_ROY.Week LEFT OUTER JOIN 
        MW.MW_Submitted_Weeks_By_RBC_ROY AS bPrev ON MW.MW_Company_Weeks.cmp_code = bPrev.cmp_code AND MW.MW_Company_Weeks.Year = bPrev.Year + 1 AND 
        MW.MW_Company_Weeks.Week = bPrev.Week 
WHERE  (MW.MW_Submitted_Weeks_By_RBC_ROY.cmp_code IS NULL) AND bPrev.tot_sls_amt IS NOT NULL 
+1

http://technet.microsoft.com/ko-kr/library/dd171921(v=sql.100).aspx – seekerOfKnowledge

+0

테이블 구조, 인덱스 등에 대해 자세히 알지 못해서 특정 권장 사항을 만드는 것이 정말 어렵습니다. 실행 계획을 살펴보고 속도 저하가 어디에서 발생하는지 확인하고, 인덱스가없는 경우 인덱스가 도움이 될 수있는 곳을 확인하십시오. "..not null"과 같은 소리는 일을 늦추는 큰 테이블 스캔을 유도합니다. –

+0

@DavidW 이것들은 이전에 결코 혼란스러워하지 않은 것들입니다. 실행 계획 XML을 포함 시키시겠습니까? 꽤 큽니다. – d90

답변

7

은> 디스플레이 예상 실행 계획 쿼리로 이동, 또는 Ctrl + L을했다. 계획에서 가장 높은 비율을 차지하는 부분을 찾고 "Missing Index"가 녹색인지 확인하십시오. 마우스 오른쪽 버튼을 클릭하고 "Missing Index Details"를 선택하십시오. 그러면 색인을 작성하는 코드가 작성됩니다. 색인 이름을 추가하기 만하면됩니다.

그것은 다음과 같이 보일 것입니다 : 인덱스를 생성 할 수있는 신속하고 더러운 방법입니다

/* 
USE [Your Database] 
GO 
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>] 
ON [dbo].[YourTable] ([ColA]) 
INCLUDE ([ColB],[ColC]) 
GO 
*/ 

.

쿼리 실행 계획을 사용하여 문제를 해결할 수도 있습니다. 연습이 필요합니다.

+0

technet.microsoft.com/en-us/library/dd171921(v=sql.100).aspx – seekerOfKnowledge

+1

@Bclaydon 작성한 테이블의 인덱스를 만들 것을 제안했습니다. 그것의 역사적인 데이터. 이로 인해 쿼리 실행 시간이 2 분에서 5 ~ 9 초로 단축되었습니다 !!!이제는 하루 종일 끊임없이 읽는 것처럼 테이블에 다른 인덱스를 쓰는 것이 좋습니다. 비용 절감은 40 %이지만 인덱싱을 사용하면 서버의 전반적인 성능이 저하 될 수 있습니다. 역사적인 데이터 테이블에 영향을 미칠 것으로 생각하지는 않습니다. 제안? – d90

+0

@Dininno - 테이블에 새 데이터를 추가 할 때마다 해당 테이블의 모든 인덱스에 대해 데이터를 다시 인덱싱해야합니다 (많은 인덱스를 가질 수 있습니다). 따라서 트랜잭션 테이블은 데이터가 들어올 때 성능이 저하됩니다. 그럴만한 가치가있는 서버에 대한 공격입니까? 더 중요한 것은 빠른 보고서 또는 빠른 서버입니까? 테스트를 통해 언제 어떤 일이 발생하는지 알 수 있으며 원하는 경우 인덱스를 삭제할 수 있습니다. – BClaydon

관련 문제