2014-07-23 2 views
0

SQL Server 2008에서 작업합니다. 다음 테이블 "Forecast"가 있습니다.이 하위 쿼리를 피하고 인덱싱 된 뷰를 만드는 방법은 무엇입니까?

Forecast_ID | Budget_Code | IAM_ID | Forecast | Timestamp 
1   | 00-0001  | 24  | 123.41 | '01-01'2010' 
2   | 00-0001  | 10  | 111.41 | '02-02'2010' //Is Last 
3   | 00-0001  | 44  | 457.10 | '02-02'2010' //Is Last 
4   | 00-0002  | 258 | 20  | '01-05'2011' //Is Last 
5   | 00-0003  | 3  | 215  | '11-12'2013' //Is Last 
6   | 00-0003  | 31  | 85.2  | '10-01'2010' 
7   | 00-0003  | 2  | 15  | '10-01'2010' 

Budget_Code 당 마지막 "Forecasts"가있는 색인 된보기를 만들려고했습니다. 이자형. 가장 높은 타임 스탬프가있는 예측 (Budget_Code 당 하나 이상의 행).

그래서 나는 다음과 같은 쿼리를했다 :

CREATE VIEW LastForecasts 
WITH SCHEMABINDING 
AS 
    SELECT Forecast_ID, Budget_Code, IAM_ID, Forecast 
    FROM dbo.[Plan] p1 
    WHERE Timestamp = (
      SELECT MAX(Timestamp) 
      FROM dbo.[Plan] p2 
      WHERE p1.Budget_Code = p2.Budget_Code) 
GO 
CREATE UNIQUE CLUSTERED INDEX IDX_V1 
    ON LastForecasts (Forecast_ID); 
GO 

을하지만 다음과 같은 오류가 있습니다

가 하나 이상의 하위 쿼리가 포함되어 있기 때문에보기 "OperationPlanDB.dbo.LastForecasts"인덱스를 만들 수 없습니다 . 하위 쿼리 대신 조인 만 사용하도록보기를 변경하십시오. 또는이보기를 인덱싱하지 않는 것이 좋습니다.

어떻게이 하위 쿼리를 피하고 예측을 사용하여 내 뷰를 인덱싱 할 수 있습니까?

+0

어쩌면 내가 뭔가를 놓친 적이 있지만 어떤 이유가 왜 타임 스탬프 열 (내림차순 또는 오름차순, 그것은 중요하지한다) 캔트 지수 : 더 나은 대신 쿼리의 성능 쿼리 다음 그 사용을 제안 (Forecast_ID, Budget_Code, IAM_ID, Forecast)를 덮은 다음 'TOP WITH TIES'및 'ORDER BY'를 수행하십시오. – g2server

+0

@ g2server 각 타임 스탬프마다 하나의 행을 가질 수 있기 때문에'TOP WITH TIES'가 작동하지 않는다고 생각합니다 (내 예제에서는 예산 코드 00-0001 참조). – Alex

+0

ok 나는 그룹핑을 놓쳤다. 그런 경우 medhi의 접근 방식이 효과가있을 것이라고 생각합니다 (그러나 RANK()로 변경하고 Timestamp의 인덱스를 사용하여 인덱스 된 뷰를 쿼리로 대체하십시오. 인덱스가 올바르게 설정되어 있으면 성능이 비슷해야합니다). – g2server

답변

0

색인 된보기에서 하위 쿼리를 사용할 수 없습니다.

SELECT * 
FROM (
    SELECT Forecast_ID, 
      Budget_Code, 
      Forecast, 
      ROW_NUMBER() OVER (PARTITION BY Budet_Code ORDER BY Timestamp DESC) row 
    FROM dbo.[Plan] p1 
    )z 
WHERE Z.row=1 
+1

해답을 가져 주셔서 감사합니다.하지만 동일한 타임 스탬프로 여러 예측을 할 수 있다는 것을 잊어 버렸습니다. 타임 스탬프가이 Budget_Code의 마지막 일 경우 모두 가져와야합니다. 그건 그렇고, 내 예제에 다른 열을 추가한다. – Alex

+0

@Alex, ROW_NUMBER()를 RANK()로 바꾸면 해결된다. – g2server

+0

@ g2server 실제로 RANK()와 함께 작동하지만 인덱싱 된보기에서는 여전히 사용할 수 없습니다./오류 : "dbo.LastForecasts"에 인덱스를 만들 수 없습니다. 순위 또는 집계 창 함수가 포함되어 있기 때문입니다. " – Alex

관련 문제