woo*_*gie 6 sql t-sql sql-server view common-table-expression
所以,我刚刚发现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
Run Code Online (Sandbox Code Playgroud)
以及创建索引的代码
create unique clustered index [TestIndexName] on [dbo].[MyView]
( pat_id asc, drug_class asc, counts asc)
Run Code Online (Sandbox Code Playgroud)
Aar*_*and 13
您无法使用CTE索引视图.即使视图可以有SCHEMABINDING.这样想吧.为了索引视图,它必须满足两个条件(以及许多其他条件):( a)它已被创建WITH SCHEMABINDING,(b)它不包含CTE.为了schemabind视图,它并没有需要满足,它不包含CTE的条件.
我不相信有一个视图有CTE的情况,并且会从索引中受益.这是你的实际问题的外围,但我的直觉是你试图索引这个视图以神奇地使它更快.索引视图不一定比基表的查询更快 - 出于某种原因存在限制,并且只有特定的用例才有意义.请注意不要盲目地将所有视图编入索引作为魔术"快速"按钮.还要记住,索引视图需要维护.因此,它会增加工作负载中影响基表的任何和所有DML操作的成本.
SCHEMABINDING是不是只是用于索引视图.它也可用于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
Run Code Online (Sandbox Code Playgroud)
现在,您可以创建一个非索引视图,只在这两个索引视图之间进行连接,并且它将使用索引(您可能必须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
Run Code Online (Sandbox Code Playgroud)
现在,这一切都假设预先聚合此信息是值得的 - 如果您不经常运行此查询,但数据经过大量修改,则最好不要创建索引视图.
另请注意,每个+ 组合SUM(std_cost)的ClaimSums视图都是相同的,因为它只聚合到.我猜有可能是在那个应该是加入标准的一部分太表,但我不知道.如果是这种情况,我认为这可以折叠到单个索引视图.pat_iddrug_classpat_iddrug_classclaims
| 归档时间: |
|
| 查看次数: |
12360 次 |
| 最近记录: |