视图索引问题,能者来啊

big_worm 2007-01-24 08:43:19
我要为多个结构一样的表作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
...全文
327 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bugchen888 2007-01-25
  • 打赏
  • 举报
回复
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
bugchen888 2007-01-25
  • 打赏
  • 举报
回复
视图上使用索引的条件近乎苛刻的不可能.
首先,必须在这个视图上建立一个聚集索引.
然而,在视图上建立聚集索引的条件也是非常多的:

对索引视图的限制
定义索引视图的 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。


-------------------------------------------
所以,请楼主慎用视图索引.
w75251455 2007-01-25
  • 打赏
  • 举报
回复
mack
hrb2008 2007-01-25
  • 打赏
  • 举报
回复
mk
big_worm 2007-01-24
  • 打赏
  • 举报
回复
楼上的,你没有明白我的意思,我说的是要在这个视图上建立索引,索引为SPARE1
marco08 2007-01-24
  • 打赏
  • 举报
回复
--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

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧