2014-12-02 326 views
3

我执行嵌套的SELECT来创建派生表,hourly,它使我得到一个功能的可用性的小时平均值。使用hourly,我平均所有这些值以获得日平均值,并且我想创建日均平均值的索引视图。我的查询如下:无法创建索引视图,因为我引用派生表

CREATE VIEW DailyView WITH SCHEMABINDING AS 
SELECT hourly.Feature, 
     AVG(hourly.AvgAvailability) AS AvgAvailability, 
     CAST(hourly.DateTime AS date) AS Date FROM 
     (SELECT DISTINCT 
         SC.Feature, 
         AVG(SA.Availability) AS AvgAvailability, 
         SA.DateAndHour AS DateTime 
     FROM dbo.ServiceAvailability AS SA LEFT OUTER JOIN 
       dbo.ServiceCatalog AS SC ON SA.ServiceID = SC.ServiceID 
GROUP BY SC.Feature, SA.DateAndHour) hourly 
GROUP BY hourly.Feature, CAST(hourly.DateTime AS date) 
GO 
CREATE UNIQUE CLUSTERED INDEX IDX_V1 ON DailyView(Date) 
GO 

但是,我不能创建一个索引视图这种方式,因为我得到以下错误:

Cannot create index on view "Reporting.dbo.DailyView" because it references derived table "hourly" (defined by SELECT statement in FROM clause). Consider removing the reference to the derived table or not indexing the view.

这对我来说是很重要的指标这一观点,因为我们将处理大量的数据,但我不知道如何在没有派生表的情况下获得嵌套平均值。

+2

您可以创建视图*而不需要子查询,并创建一个聚集索引,然后在需要时加入该子查询? – 2014-12-02 21:50:19

+2

在创建索引视图之前,您是否尝试过各种性能调整方法,例如索引,将CAST(hourly.DateTime AS date)'转换为包含索引等的计算列。 – 2014-12-02 21:55:16

+0

这两个好的建议。我会研究这些。 – wemblem 2014-12-02 22:07:31

回答

1

问题不在于子查询本身。 您无法在索引视图中使用AVG。使用SUM和COUNT_Big代替,所以当你查询这个视图时,你可以计算出平均值。 LEFT JOINs也是不允许的。只有内部联接

您可以检查是否可以在与正确的索引结合进行更改后为派生表创建索引视图。