我有一個很大的合同表,並且我們有很多查詢狀態爲Open的合同的存儲過程。不到10%的合同是開放的,隨着數據庫增長,這個數字正在縮小。我以爲我可以創建一個索引視圖的開放合同,以加快我們的一些查詢。問題是狀態不在合同表上,我需要一個子查詢來檢索我想要的數據。 (SQL Server將做一個聚集索引掃描上的查詢我已經看過整個表)帶有最大子查詢的SQL Server 2000索引視圖
這裏是視圖的濃縮版(我刪除從合同表中的其他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
)我得到以下
創建失敗,指數
它包含一個或多個不允許的構造。 (Microsoft SQL Server,錯誤1936)
從我能收集它是最大的子查詢是問題??
除了將合約表上的狀態(我個人認爲它屬於這個表),有沒有任何建議來優化這種情況。否則SQL Server的其他版本會允許此索引視圖?
如果狀態ID是在合同上,我會索引它,並將完成它。因爲我們在許多存儲過程中都有相同的子查詢,所以DB必須不斷確定合同當前的狀態。大多數時候我們正在尋找OPN當前狀態的合同。有沒有一種方法來優化這個? – PatFromCanada 2012-07-12 16:22:27
Plus One用於確認視圖問題 – PatFromCanada 2012-07-12 20:52:22