2012-07-12 95 views
0

我有一個很大的合同表,並且我們有很多查詢狀態爲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的其他版本會允許此索引視圖?

回答

3

From TechNet regarding Indexed Views in SS 2000:

有對視圖定義的語法有一些限制。 視圖定義一定不能包含以下內容:

COUNT(*)

ROWSET功能

派生表

自聯接

DISTINCT

STDEV,方差, AVG

浮動*,文本,NTEXT,圖像列

子查詢

全文謂詞(含有FREETEXT)

SUM上空的表達式

MIN,MAX

TOP

外部連接

UNION

您正在使用MAX和子查詢,這兩者都是不允許的。

要獲得有關如何解決此問題的建議,您需要共享一些數據以及您正在嘗試執行的操作。

+0

如果狀態ID是在合同上,我會索引它,並將完成它。因爲我們在許多存儲過程中都有相同的子查詢,所以DB必須不斷確定合同當前的狀態。大多數時候我們正在尋找OPN當前狀態的合同。有沒有一種方法來優化這個? – PatFromCanada 2012-07-12 16:22:27

+0

Plus One用於確認視圖問題 – PatFromCanada 2012-07-12 20:52:22

1

它不是一個「視圖」解決方案,需要更多的工作才能完成,但是您可以創建非規格化的表格來保存視圖的結果。通過這種方式,所有對未清合同的讀數都可以與該表格相對應。這將是最快的,但需要維護新表格。

0

創建一個索引視圖是安靜的difficuylt任務,因爲它有很多restirction和一個也與自連接有關。你有自己加入here.No其他意見等

這種類型的主表的其他事情,如果你只使用一個單一的狀態像'開放'在你的情況下,我會建議,而不是加入表(主表與狀態代碼)只是聲明statusid變量,然後將狀態OPEN的值存儲在那裏,然後在最終查詢中使用該值。這將避免與主表的額外連接。

我建議您在最終聲明中加入合同表之前,將臨時表中打開狀態的數據存儲在臨時表中。你可以在statusid,customerid和contractcreationdate上有一個索引。然後強制該索引將合同標識變成臨時表,如

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

現在將此臨時表與合同表一起加入。

但是在創建任何類型的索引之前,請確保這些開銷遠低於您獲得的好處。