Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 无法在视图上创建索引,因为该视图未绑定架构_Sql Server 2008_Tsql_Sql Server 2012 - Fatal编程技术网

Sql server 2008 无法在视图上创建索引,因为该视图未绑定架构

Sql server 2008 无法在视图上创建索引,因为该视图未绑定架构,sql-server-2008,tsql,sql-server-2012,Sql Server 2008,Tsql,Sql Server 2012,我制作了一个汇总视图,我需要它与另一个视图交叉,两个视图都需要用两个字段(第一个字段是date)索引,以便提高响应时间的性能。 当我尝试这样做时,我得到以下信息: -- CREATING VIEW FOR VENTAS POR DISTRIBUIDOR, DEPARTAMENTO create view [dbo].[vw_ventas_dist_dep] as SELECT CAST(t.fecha AS DATE)fecha ,d.NombreDistribuidor distribuid

我制作了一个汇总视图,我需要它与另一个视图交叉,两个视图都需要用两个字段(第一个字段是date)索引,以便提高响应时间的性能。 当我尝试这样做时,我得到以下信息:

-- 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.

我已尝试使用SCHEMABINDING进行放置,但没有找到创建索引视图的方法。

在视图的定义中,需要使用带有SCHEMABINDING的

ALTER VIEW vw_ventas WITH SCHEMABINDING
AS
SELECT ...
FROM ...
WHERE ... ;
请查看此处的文档。但是,根据您在视图中执行的操作,索引是否意味着性能的改善


大多数情况下,索引基表会带来更好的改进,表上的附加索引也可能有助于其他查询。

(1)为什么您认为视图上的索引会提高性能?视图是否执行任何类型的聚合?索引视图的主要优点是,与对基表执行相同的计算相比,通过读取和返回非常少的行来执行聚合。(2) 错误消息对我来说似乎很清楚(在视图中添加SCHEMABINDING),但我怀疑这将是您问题的结束,或者当您创建索引时,它将神奇地加快速度。嗨,Aaron,因为我需要通过一些字段交叉两个视图,并且需要大约1分钟,我认为为我需要的字段编制索引将提高这个汇总视图的性能。@路易斯,因此,首先向基表添加适当的索引。索引视图不是魔锤。我这样做了,我的字段被索引了,只是因为列被索引了,并不意味着它将有利于您的查询。你做了什么样的调查来解释为什么你最初的查询需要一分钟?你发现了什么让你相信索引视图就是答案?我把它放在你告诉我的地方时犯了以下错误:无法模式绑定视图“dbo.vw_ventas_dist_dep2”,因为名称“hechosttransferencia”对模式绑定无效。名称必须是两部分格式,并且对象不能引用自身。怎么会这样?Radu,我必须更正什么?@Luis我已经告诉过你如何修复该错误消息。如果向视图中的所有表添加架构前缀,则该错误消息将消失。然后,如果列
monto
可为空,则您得到的下一个错误消息将是
Msg 8662,级别16,状态0/无法在视图“bar”上创建聚集索引“foo”,因为视图引用了未知值(可为空表达式的总和)。考虑仅引用和的非可空值。ISNULL()可能对这一点很有用。
然后,当您修复该问题时,您将得到另一个问题。所以你的一天会继续下去。。。