我要为多个结构一样的表作UNION ALL查询,于是做了个视图,但却无法贾索引
总是提示:
服务器: 消息 1940,级别 16,状态 1,行 1
无法在视图 'VIEW_verify' 上创建 索引。该视图没有唯一的聚集索引。
建索引SQL 如下:
create dbo.VIEW_verify
WITH   SCHEMABINDING
AS
SELECT Czy1,Czy2,Czy3,Czy4,Czy5,Czy6,Czy7,Czy8,Czy9,Czy10,TransferMark,Spare1,Spare2,Spare3,Spare4,Spare5,Spare6,Spare7,Spare8,Spare9,Spare10
FROM (SELECT Czy1,Czy2,Czy3,Czy4,Czy5,Czy6,Czy7,Czy8,Czy9,Czy10,TransferMark,Spare1,Spare2,Spare3,Spare4,Spare5,Spare6,Spare7,Spare8,Spare9,Spare10 
        FROM dbo.zzxx340000
        UNION ALL
        SELECT Czy1,Czy2,Czy3,Czy4,Czy5,Czy6,Czy7,Czy8,Czy9,Czy10,TransferMark,Spare1,Spare2,Spare3,Spare4,Spare5,Spare6,Spare7,Spare8,Spare9,Spare10
        FROM dbo.zzxx340100
        UNION ALL
        SELECT Czy1,Czy2,Czy3,Czy4,Czy5,Czy6,Czy7,Czy8,Czy9,Czy10,TransferMark,Spare1,Spare2,Spare3,Spare4,Spare5,Spare6,Spare7,Spare8,Spare9,Spare10
        FROM dbo.zzxx340102

解决方案 »

  1.   

    --try
    create dbo.VIEW_verify
    WITH   SCHEMABINDING
    AS SELECT Czy1,Czy2,Czy3,Czy4,Czy5,Czy6,Czy7,Czy8,Czy9,Czy10,TransferMark,Spare1,Spare2,Spare3,Spare4,Spare5,Spare6,Spare7,Spare8,Spare9,Spare10 
            FROM dbo.zzxx340000
            UNION ALL
            SELECT Czy1,Czy2,Czy3,Czy4,Czy5,Czy6,Czy7,Czy8,Czy9,Czy10,TransferMark,Spare1,Spare2,Spare3,Spare4,Spare5,Spare6,Spare7,Spare8,Spare9,Spare10
            FROM dbo.zzxx340100
            UNION ALL
            SELECT Czy1,Czy2,Czy3,Czy4,Czy5,Czy6,Czy7,Czy8,Czy9,Czy10,TransferMark,Spare1,Spare2,Spare3,Spare4,Spare5,Spare6,Spare7,Spare8,Spare9,Spare10
            FROM dbo.zzxx340102
      

  2.   

    楼上的,你没有明白我的意思,我说的是要在这个视图上建立索引,索引为SPARE1
      

  3.   

    视图上使用索引的条件近乎苛刻的不可能.
    首先,必须在这个视图上建立一个聚集索引.
    然而,在视图上建立聚集索引的条件也是非常多的:对索引视图的限制
    定义索引视图的 SELECT 语句不得包含 TOP、DISTINCT、COMPUTE、HAVING 和 UNION 关键字。也不能包含子查询。SELECT 列表中不得包含星号 (*)、'table.*' 通配符列表、DISTINCT、COUNT(*)、COUNT(<expression>)、基表中的计算列和标量聚合。 非聚合 SELECT 列表中不能包含表达式。聚合 SELECT 列表(包含 GROUP BY 的查询)中可能包含 SUM 和 COUNT_BIG(<expression>);它一定包含 COUNT_BIG(*)。不允许有其它聚合函数(MIN、MAX、STDEV,...)。使用 AVG 的复杂聚合无法参与索引视图的 SELECT 列表。不过,如果查询使用这样的聚合,则优化程序将能使用该索引视图,用 SUM 和 COUNT_BIG 的简单聚合组合代替 AVG。若某列是从取值为 float 数据类型或使用 float 表达式进行取值的表达式得到的,则不能作为索引视图或表中计算列的索引键。这样的列被视为是不精确的。使用 COLUMNPROPERTY 函数决定特定计算列或视图中的列是否精确。索引视图受限于以下的附加限制: 索引的创建者必须拥有表。所有表、视图和索引必须在同一数据库中创建。
    定义索引视图的 SELECT 语句不得包含视图、行集函数、行内函数或派生表。同一物理表在该语句中只能出现一次。
    在任何联接表中,均不允许进行 OUTER JOIN 操作。
    搜索条件中不允许使用子查询或者 CONTAINS 或 FREETEXT 谓词。
    如果视图定义包含 GROUP BY 子句,则视图的 SELECT 列表中必须包含所有分组依据列及 COUNT_BIG(*) 表达式。此外,CREATE UNIQUE CLUSTERED INDEX 子句中必须只包含这些列。 
    可以创建索引的视图的定义主体必须具有确定性且必须精确,这类似于计算列上的索引要求。请参见在计算列上创建索引。数据库的兼容级别不能低于 80。不能将包含索引视图的数据库的兼容级别更改为低于 80。
    -------------------------------------------
    所以,请楼主慎用视图索引.
      

  4.   

    G. 为视图创建索引
    下面的示例将创建一个视图,并为该视图创建索引。然后,引入两个使用该索引视图的查询。USE Northwind
    GO--Set the options to support indexed views.
    SET NUMERIC_ROUNDABORT OFF 
    GO 
    SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON
    GO--Create view.
    CREATE   VIEW V1 
    WITH   SCHEMABINDING 
    AS 
       SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT 
       FROM   dbo.[Order Details] od, dbo.Orders o 
       WHERE   od.OrderID=o.OrderID 
       GROUP BY   OrderDate, ProductID
    GO--Create index on the view.
    CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID)
    GO--This query will use the above indexed view.
    SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate, ProductID
    FROM   dbo.[Order Details] od, dbo.Orders o
    WHERE   od.OrderID=o.OrderID AND ProductID in (2, 4, 25, 13, 7, 89, 22, 34)
       AND OrderDate >= '05/01/1998'
    GROUP BY OrderDate, ProductID
    ORDER BY Rev DESC--This query will use the above indexed view.
    SELECT  OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev
    FROM   dbo.[Order Details] od, dbo.Orders o
    WHERE   od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3
       AND DATEPART(yy,OrderDate) = 1998
    GROUP BY OrderDate
    ORDER BY OrderDate ASC