大きなコントラクトテーブルがあり、ステータスがOpenのコントラクトをクエリする多くのストアドプロシージャがあります。契約の10%未満がオープンであり、この数はDBが大きくなるにつれて減少しています。クエリの一部を高速化するために、オープンコントラクトのインデックス付きビューを作成できると思いました。問題は、ステータスがコントラクトテーブルになく、必要なデータを取得するためにサブクエリが必要なことです。(SQL Serverは、私が調べたクエリでテーブル全体に対してクラスター化インデックススキャンを実行します)
これがビューの要約バージョンです(コントラクトテーブルから他の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')
ビューにインデックスを作成しようとすると(で一意にクラスター化されますcontractid
)、次のようになります
インデックスの作成に失敗しました
1つ以上の許可されていない構成が含まれています。(Microsoft SQL Server、エラー1936)
私が収集できるものから、問題はサブクエリの最大値ですか?
ステータスを契約テーブル(私が個人的に属すると思う場所)に置く以外に、この状況を最適化するための提案があります。これに失敗すると、他のバージョンのSQL Serverでこのインデックス付きビューが許可されますか?