无法在视图上创建索引,因为视图未绑定架构 [重复]

Posted

技术标签:

【中文标题】无法在视图上创建索引,因为视图未绑定架构 [重复]【英文标题】:Cannot create index on view because the view is not schema bound [duplicate] 【发布时间】:2017-01-10 20:49:49 【问题描述】:

我已经制作了一个汇总视图,我需要它与另一个视图交叉,两个视图都需要由 2 个字段(第一个字段是日期)索引,以便我可以提高响应时间的性能。 当我尝试这样做时,我收到以下消息:

-- CREATING VIEW FOR VENTAS POR DISTRIBUIDOR, DEPARTAMENTO
create view [dbo].[vw_ventas_dist_dep] as 
SELECT CAST(t.fecha AS DATE)fecha
,d.NombreDistribuidor distribuidor
,u.Nombre departamento
,sum(tr.monto) monto
 from HechosTransferencia tr inner join DimensionTiempo t on tr.DimensionTiempoId=t.DimensionTiempoId
inner join DimensionDistribuidor d on d.DimensionDistribuidorId=tr.DimensionDistribuidorId
  inner join DimUbigeo u on u.DimDepartamentoId=tr.DimDepartamentoId and u.DimProvinciaId='' and u.DimDistritoId=''
WHERE        (t.Fecha BETWEEN DATEADD(MONTH, DATEDIFF(MONTH, - 3, GETDATE()) - 3, 0) AND GETDATE())
 -- and t.fecha between  '2016-12-19' and '2016-12-20'  and d.NombreDistribuidor='auren S.A.'
 and tr.TipoDestino='PDV' and tr.TipoOperacion='Transferencia'
group by CAST(t.fecha AS DATE),d.NombreDistribuidor,u.Nombre ;
GO

CREATE UNIQUE CLUSTERED INDEX PK_fecha ON vw_ventas
(
    fecha,  -- date field
    distribuidor -- string field
);

Msg 1939, Level 16, State 1, Line 1
Cannot create index on view 'vw_ventas' because the view is not schema bound.

我已尝试放置 WITH SCHEMABINDING,但没有办法制作索引视图。

【问题讨论】:

(1) 为什么您认为视图上的索引会提高性能?视图是否执行任何类型的聚合?与对基表执行相同计算相比,索引视图的主要优势在于通过读取和返回非常少量的行来执行聚合。 (2) 错误消息对我来说似乎很清楚(将 WITH SCHEMABINDING 添加到视图中),但我怀疑这将是您的问题的结束,或者当您创建索引时,它会神奇地使事情变得更快。 嗨 Aaron,因为我需要通过某些字段跨越两个视图并且它需要大约 1 分钟,我认为索引我需要的字段将提高这个汇总视图的性能。 @Luis 因此,首先向基表添加适当的索引。索引视图不是魔锤。 A little more detail here. 我这样做了,我的字段也被索引了 列被索引并不意味着它会对您的查询有益。您对为什么原始查询需要一分钟进行了哪些调查?您发现了什么让您相信索引视图就是答案? 【参考方案1】:

您需要在视图的定义中使用WITH SCHEMABINDING

ALTER VIEW vw_ventas WITH SCHEMABINDING
AS
SELECT ...
FROM ...
WHERE ... ;

在此处查看CREATE VIEW 的文档。但是,根据您在视图中执行的操作,索引是否意味着您的性能有所提高。

在大多数情况下,对基表进行索引会带来更好的改进,并且在您的表上添加额外的索引也可能有助于其他查询。

【讨论】:

我把它放在你告诉我的地方出现了以下错误:无法模式绑定视图'dbo.vw_ventas_dist_dep2',因为名称'HechosTransferencia'对于模式绑定无效。名称必须采用两部分格式,并且对象不能引用自身。 怎么拉杜,我必须纠正什么? @Luis 我告诉过你如何修复该错误消息。如果您为视图中的所有表添加模式前缀,该错误消息将消失。然后,如果列monto 可以为空,那么您收到的下一条错误消息将是Msg 8662, Level 16, State 0 / Cannot create the clustered index "foo" on view "bar" because the view references an unknown value (SUM aggregate of nullable expression). Consider referencing only non-nullable values in SUM. ISNULL() may be useful for this. 然后当您修复它时,您将收到另一条错误消息。所以你的一天将继续......

以上是关于无法在视图上创建索引,因为视图未绑定架构 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中的架构绑定视图上创建索引

视图未绑定架构?

创建视图索引

SQL Server - 使用当前 GetDate 筛选器创建架构绑定索引视图

SQL Server里面啥样的视图才能创建索引

SQL Server:无法在视图上创建索引,因为它引用派生表。