2012-07-12 2 views
0

나는 커다란 계약 테이블을 가지고 있으며 Open 상태 인 계약서를 쿼리하는 많은 저장 프로 시저가 있습니다. 계약의 10 % 미만이 공개되어 있으며 DB가 커짐에 따라이 수치는 줄어들고 있습니다. 쿼리의 속도를 높이기 위해 공개 계약의 인덱싱 된 뷰를 만들 수 있다고 생각했습니다. 문제는 계약 테이블에 상태가 없기 때문에 원하는 데이터를 검색하기 위해 하위 쿼리가 필요하다는 것입니다. 여기 최대 하위 쿼리가있는 SQL Server 2000 인덱싱 된보기

뷰의 압축 된 버전 (I가 계약 테이블에서 30 다른 열을 제거)

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE VIEW [dbo].[vw_OpenContractsIndexed] 
WITH SCHEMABINDING 
AS 
SELECT  c.ContractID 
FROM   dbo.NMPT_Contract AS c INNER JOIN 
         dbo.NMPT_ContractStatus AS cs ON c.ContractID = cs.ContractID AND cs.ContractStatusCreated = 
          (SELECT  MAX(ContractStatusCreated) AS Expr1 
          FROM   dbo.NMPT_ContractStatus AS cs2 
          WHERE  (ContractID = c.ContractID)) INNER JOIN 
         dbo.CMSS_Status AS s ON cs.StatusID = s.StatusID 
WHERE  (s.StatusCode = 'OPN') 
입니다 (SQL Server는 내가 살펴 보았다 쿼리에서 전체 테이블에 클러스터 된 인덱스 스캔을 수행)

내가 색인
실패

창조 그것은 하나 개 이상의 허용되지 않는 구조를 포함하고 다음 (독특한 contractid에 클러스터) 뷰에 인덱스 내가 할을 만들려고합니다. (Microsoft SQL Server, 오류 1936)

내가 수집 할 수있는 것은 문제가되는 하위 쿼리의 최대 값입니다.

계약서 테이블 (내가 개인적으로 속한다고 생각하는)에 상태를 올리는 것 외에이 상황을 최적화하기위한 제안 사항이 있습니다. SQL Server의 다른 버전이이 인덱싱 된 뷰를 허용합니까?

답변

3

From TechNet regarding Indexed Views in SS 2000:

은 뷰 정의의 구문에 대한 몇 가지 제한 사항이 있습니다. 뷰 정의는 다음과 같은 포함 할 수 없습니다 :

COUNT (*)

ROWSET 기능

파생 테이블

을 자체 조인

DISTINCT

STDEV, VARIANCE, AVG

플로트 *, 텍스트, NTEXT, 이미지 열

하위 쿼리

전체 텍스트 조건 (FREETEXT 포함) 가능 표현식

MIN, MAX

TOP

을에

SUM

실외 합계

UNION

MAX과 하위 쿼리는 모두 허용되지 않습니다.

이 문제를 해결하는 방법에 대한 조언을 얻으려면 일부 데이터와 수행하려는 작업을 공유해야합니다.

+0

statusID가 계약서에있는 경우 색인을 생성하고이를 수행하게됩니다. 그대로 우리는 많은 저장 프로 시저에서 동일한 하위 쿼리를 가지며 DB는 현재 상태가 계약서에 어떤 것인지를 지속적으로 확인해야합니다. 대부분의 경우 OPN의 현재 상태로 계약을 찾고 있습니다. 이 방법을 최적화 할 수 있습니까? – PatFromCanada

+0

보기에 문제를 확인하기위한 Plus One – PatFromCanada

1

"보기"솔루션이 아니며 더 많은 작업이 필요하지만보기의 결과를 저장할 비정규 화 테이블을 만들 수 있습니다. 이렇게하면 열린 계약에 대한 모든 읽기가 해당 테이블에 적용될 수 있습니다. 이것은 가장 빠르지 만 새 테이블을 유지 관리해야합니다.

0

인덱스 된 뷰를 만드는 것은 매우 많은 수정 작업이 필요하며 자체 조인과 관련된 작업이기 때문에 조용한 작업입니다. 너는 여기에 자기 조인이있어. 다른보기들도 없어.

너는 'OPEN'과 같은 단 하나의 상태를 사용한다면 너는이 종류의 주인 표를 위해 다른 것, 상태 코드 포함)는 statusid 변수를 선언 한 다음 상태 OPEN에 대한 값을 저장 한 다음 최종 쿼리에서 해당 값을 사용합니다. 이렇게하면 마스터 테이블과의 추가 조인을 피할 수 있습니다.

최종 명세서의 계약 테이블에 가입하기 전에 임시 테이블에 열린 상태에 대한 데이터를 저장하는 것이 좋습니다. statusid, customerid 및 contractcreationdate에 대한 색인을 가질 수 있습니다. 그런 다음이 인덱스를 사용하여 계약서를

select contractid into #temp from NMPT_ContractStatus 
where statusid [email protected] group by contractid   
having  datefield = max(datefield) 

과 같이 계약 테이블에 넣으십시오.이 임시 테이블을 계약 테이블과 조인하십시오.

그러나 모든 종류의 색인을 만들기 전에 이러한 오버 헤드가 현재 얻는 이점보다 훨씬 적어야합니다.