2011-02-10 4 views
2

분기 별 테이블로 분할 된 5 년 데이터 세트가 있습니다. 나는 또한 그들 모두를 합친 마스터 뷰를 가지고있다. 사용자가 4 분의 1 이상의 데이터를 필요로하는 경우 여러 분기에 함께 참여하는 대신 마스터보기를 사용하는 경우가 많습니다.SQL Server 테이블 값 함수 성능

내 질문은 날짜 범위를 받아들이고 필요한 파티션의 레코드 만 반환하는 테이블 값 함수가 전체 마스터보기를 쿼리하는 것보다 빠르다는 것입니다.

이 내 현재 뷰의 정의입니다 :

ALTER VIEW [dbo].[loandetails_test] 
AS 
SELECT  * 
FROM   loandetails05 
where year(date) = 2005 
UNION 
SELECT  * 
FROM   loandetails06 
where year(date) = 2006 
UNION 
SELECT  * 
FROM   loandetails07 
where year(date) = 2007 
UNION 
SELECT  * 
FROM   loandetails08 
where year(date) = 2008 
UNION 
SELECT  * 
FROM   loandetails1q09 
where date >= '1/1/2009' and date < '4/1/2009' 
UNION 
SELECT  * 
FROM   loandetails2q09 
where date >= '4/1/2009' and date < '7/1/2009' 
UNION 
SELECT  * 
FROM   loandetails3q09 
where date >= '7/1/2009' and date < '10/1/2009' 
UNION 
SELECT  * 
FROM   loandetails4q09 
where date >= '10/1/2009' and date < '1/1/2010' 
UNION 
SELECT  * 
FROM   loandetails1q10 
where date >= '1/1/2010' and date < '4/1/2010' 
UNION 
SELECT  * 
FROM   loandetails2q10 
where date >= '4/1/2010' and date < '7/1/2010' 
UNION 
SELECT  * 
FROM   loandetails3q10 
where date >= '7/1/2010' and date < '10/1/2010' 
UNION 
SELECT  * 
FROM   loandetails4q10 
where date >= '10/1/2010' and date < '1/1/2011' 
union 
SELECT  * 
FROM   loandetails_CURRENT 
where date >= '1/1/2011' and date < '4/1/2011' 


GO 
+0

로 아마 씁니다. 물론 테이블 값 함수가 작성된 방법에 크게 의존 할 것입니다. 그러나 알 수있는 유일한 방법은 마스터보기를 사용하고 테이블 반환 함수를 사용하여 성능을 측정하는 것입니다. – HLGEM

답변

2

는 대답은 고체 더해야한다.

파티션은 암시 적 조건으로 설정되므로 날짜 (1/4)까지 파티션을 수행하는 경우 SQL Server는 이미 쿼리에 날짜 필터가 있다고 가정 할 때 쿼리를 만족시킬 파티션을 이미 알고 있습니다. 2 개 (또는 다수의 관련 파티션)간에 스트림 병합을 확인하는 실행 계획을 확인하십시오.

N 데이터베이스 (예 : 사일로 당 하나의 테이블)의 테이블이 사용자와 마찬가지로 마스터보기로 조인되는 경우가 있습니다. master view는 특별히이

select source=1, col1, col2, col3 
from db1.dbo.tbl 
union all 
select source=2, col1, col2, col3 
from db2.dbo.tbl 
etc 

모든 where source in (2,3)을 요청 쿼리 만 자동으로 2 DBS 검색 할 필요가 있고, 실행 계획이 많이 계시 것을 인식과 같은, 각각의 필터를 사용합니다. 수동으로 날짜 파티션 쿼리를 만든 경우

, 당신은

  1. 다음은

는 파티션을 인식하는 각 테이블 내에서,

  • 힘 최적화를 날짜 범위에 인덱스를 가질 수 있습니다 (인덱스가없는 경우에도) 작업 예제. Q1과 Q4는 계획에 나타나지 않습니다. 공개 : SQL 서버 2008 R2 Express를

    select dateadd(d, number, '20100101') TheDate, * 
    into Q1data 
    from master..spt_values 
    where type='p' and number between 1 and 370 
    and datepart(quarter, dateadd(d, number, '20100101')) =1 
    
    select dateadd(d, number, '20100101') TheDate, * 
    into Q2data 
    from master..spt_values 
    where type='p' and number between 1 and 370 
    and datepart(quarter, dateadd(d, number, '20100101')) =2 
    
    select dateadd(d, number, '20100101') TheDate, * 
    into Q3data 
    from master..spt_values 
    where type='p' and number between 1 and 370 
    and datepart(quarter, dateadd(d, number, '20100101')) =3 
    
    select dateadd(d, number, '20100101') TheDate, * 
    into Q4data 
    from master..spt_values 
    where type='p' and number between 1 and 370 
    and datepart(quarter, dateadd(d, number, '20100101')) =4 
    GO 
    
    create view Ydata 
    with schemabinding 
    as 
    select TheDate, name, number, TYPE, LOW, high, status 
    from dbo.Q1Data where TheDate >= '20100101' and TheDate < '20100401' 
    union all 
    select TheDate, name, number, TYPE, LOW, high, status 
    from dbo.Q2Data where TheDate >= '20100401' and TheDate < '20100701' 
    union all 
    select TheDate, name, number, TYPE, LOW, high, status 
    from dbo.Q3Data where TheDate >= '20100701' and TheDate < '20101001' 
    union all 
    select TheDate, name, number, TYPE, LOW, high, status 
    from dbo.Q4Data where TheDate >= '20101001' and TheDate < '20110101' 
    GO 
    
    select * from YData where TheDate between '20100601' and '20100831' 
    

    쿼리 계획

    enter image description here

    가 다시 : 업데이트 된 질문

    날짜 범위를 다루는 NEVER (몇 가지 예외를 제외하고는) 사용 날짜 열의 함수. 이렇게하려면 상대방과 비교하기 전에 테이블의 모든 레코드에 대해 함수를 실행해야합니다.

    where year(date) = 2005 
    ===> means scan the table, for each row take the year, compare to 2005 
    

    더 나은는

    where date >= '20050101' and date < '20060101' 
    ===> means given a date range, use the index to seek the range 
    
  • +0

    내 쿼리 계획 표시 인덱스는 쿼리의 날짜 범위에 필요하지 않은 파티션을 찾습니다. Enterprise Edition이 없기 때문에 SQL Server에서 만든 파티션이 아니라는 것을 지정해야합니다. 그들은 나를 수동으로 만들었습니다. – Colin

    +0

    @Colin - 수동으로 파티셔닝을 반영하기 위해 편집 된 답변 – RichardTheKiwi

    +0

    응답을 오해했을 수도 있지만 제공 한 형식으로보기를 만들려고했습니다. 뷰 정의에서 각 선택 항목의 날짜 범위를 지정 했는데도 쿼리 계획에 범위를 벗어난 파티션에 대한 검색이 계속 표시됩니다. 비용은 0 %이지만 여전히보고 있습니다. 또한 모든 파티션에 날짜 인덱스가 있습니다. – Colin