나는 커다란 계약 테이블을 가지고 있으며 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의 다른 버전이이 인덱싱 된 뷰를 허용합니까?
statusID가 계약서에있는 경우 색인을 생성하고이를 수행하게됩니다. 그대로 우리는 많은 저장 프로 시저에서 동일한 하위 쿼리를 가지며 DB는 현재 상태가 계약서에 어떤 것인지를 지속적으로 확인해야합니다. 대부분의 경우 OPN의 현재 상태로 계약을 찾고 있습니다. 이 방법을 최적화 할 수 있습니까? – PatFromCanada
보기에 문제를 확인하기위한 Plus One – PatFromCanada