所以,我刚刚发现 SQL Server 2008 不允许您在定义中使用 CTE 索引视图,但它允许您alter
要添加的查询with schemabinding
在视图定义中。这有充分的理由吗?出于某种我不知道的原因,这是否有意义?我的印象是WITH SCHEMABINDING
的主要目的是允许您为视图建立索引
新增并改进了更多查询操作
;with x
as
(
select rx.pat_id
,rx.drug_class
,count(*) as counts
from rx
group by rx.pat_id,rx.drug_class
)
select x.pat_id
,x.drug_class
,x.counts
,SUM(c.std_cost) as [Healthcare Costs]
from x
inner join claims as c
on claims.pat_id=x.pat_id
group by x.pat_id,x.drug_class,x.counts
以及创建索引的代码
create unique clustered index [TestIndexName] on [dbo].[MyView]
( pat_id asc, drug_class asc, counts asc)
您无法使用 CTE 为视图建立索引。尽管景色can have SCHEMABINDING
。这样想吧。为了对视图建立索引,它必须满足两个条件(以及许多其他条件):(a) 它已被创建WITH SCHEMABINDING
(b) 它不包含 CTE。为了模式绑定视图,它确实not需要满足不包含CTE的条件。
我不相信存在视图具有 CTE 的情况and将受益于被索引。这与您的实际问题无关,但我的直觉是您正在尝试索引此视图以神奇地使其更快。索引视图不一定比针对基表的查询快——存在限制是有原因的,并且只有在特定的用例中它们才有意义。请注意,不要盲目地将您的所有视图索引为神奇的“更快”按钮。另请记住,索引视图需要维护。因此,它将增加工作负载中影响基表的所有 DML 操作的成本。
模式绑定是not仅用于索引视图。也可以用
诸如 UDF 之类的东西可以帮助说服决定论,可以用于
视图和函数以防止更改底层架构,以及
在某些情况下,它可以提高性能(例如,当 UDF
不受模式限制,优化器可能必须创建一个表假脱机
处理任何底层 DDL 更改)。所以请不要认为它是
奇怪的是,您可以架构绑定视图,但无法对其建立索引。
索引视图需要它,但这种关系不是相互的。
对于您的具体场景,我建议这样做:
CREATE VIEW dbo.PatClassCounts
WITH SCHEMABINDING
AS
SELECT pat_id, drug_class,
COUNT_BIG(*) AS counts
FROM dbo.rx
GROUP BY pat_id, drug_class;
GO
CREATE UNIQUE CLUSTERED INDEX ON dbo.PatClassCounts(pat_id, drug_class);
GO
CREATE VIEW dbo.ClaimSums
WITH SCHEMABINDING
AS
SELECT pat_id,
SUM(c.std_cost) AS [Healthcare Costs],
COUNT_BIG(*) AS counts
FROM dbo.claims
GROUP BY pat_id;
GO
CREATE UNIQUE CLUSTERED INDEX ON dbo.ClaimSums(pat_id);
GO
现在您可以创建一个非索引视图,该视图仅在这两个索引视图之间进行联接,并且它将利用索引(您可能必须使用NOEXPAND
在较低版本上,不确定):
CREATE VIEW dbo.OriginalViewName
WITH SCHEMABINDING
AS
SELECT p.pat_id, p.drug_class, p.counts, c.[Healthcare Costs]
FROM dbo.PatClassCounts AS p
INNER JOIN dbo.ClaimSums AS c
ON p.pat_id = c.pat_id;
GO
现在,这一切都假设值得预先聚合这些信息 - 如果您不经常运行此查询,但数据修改很多,那么最好不要创建索引视图。
另请注意,SUM(std_cost)
来自ClaimSums
每个视图的视图都是相同的pat_id
+ drug_class
组合,因为它仅聚合到pat_id
。我想可能有一个drug_class
in the claims
表也应该是连接标准的一部分,但我不确定。如果是这样的话,我认为这可以折叠为单个索引视图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)