我有一个很大的合同表,并且我们有许多存储过程来查询状态为 Open 的合同。只有不到 10% 的合约是开放的,而且随着数据库的增长,这个数字正在缩小。我想我可以创建一个未结合约的索引视图,以加快我们的一些查询。问题是状态不在合同表上,我需要一个子查询来检索我想要的数据。(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
)我得到以下
索引创建失败
它包含一个或多个不允许的构造。(Microsoft SQL Server,错误 1936)
从我可以收集到的问题是子查询中的最大值?
除了将状态放在合同表上(我个人认为它所属的位置)之外,还有什么建议可以优化这种情况。如果不这样做,其他版本的 SQL Server 是否会允许此索引视图?