SqlServer在视图上创建索引的条件

在视图上创建索引需要三个条件:

一、视图必须绑定到架构。

要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击右键,属性,选中“绑定到架构”。

二、索引必须是唯一索引。  www.2cto.com

要做到这点,在 CREATE INDEX 中必须指定 UNIQUE。

三、索引必须是聚集索引。

要做到这点,在 CREATE INDEX 中必须指定 CLUSTERED。

例:

CREATE VIEW viewFoo WITH SCHEMABINDING

AS

SELECT id...

CREATE UNIQUE CLUSTERED INDEX index_viewFoo ON viewFoo(id)

***************************************************************

视图的要求

在视图上创建聚集索引之前,该视图必须满足下列要求:

当执行   CREATE   VIEW   语句时,ANSI_NULLS   和   QUOTED_IDENTIFIER   选项必须设置为   ON。OBJECTPROPERTY   函数通过   ExecIsAnsiNullsOn   或   ExecIsQuotedIdentOn   属性为视图报告此信息。

为执行所有   CREATE   TABLE   语句以创建视图引用的表,ANSI_NULLS   选项必须设置为   ON。

视图不能引用任何其它视图,只能引用基表。

www.2cto.com

视图引用的所有基表必须与视图位于同一个数据库中,并且所有者也与视图相同。

必须使用   SCHEMABINDING   选项创建视图。SCHEMABINDING   将视图绑定到基础基表的架构。

必须已使用   SCHEMABINDING   选项创建了视图中引用的用户定义的函数。

表和用户定义的函数必须由   2   部分的名称引用。不允许使用   1   部分、3   部分和   4   部分的名称。

视图中的表达式所引用的所有函数必须是确定性的。OBJECTPROPERTY   函数的   IsDeterministic   属性报告用户定义的函数是否是确定性的。有关更多信息,请参见确定性函数和非确定性函数。

www.2cto.com

视图中的   SELECT   语句不能包含下列   Transact-SQL   语法元素:

选择列表不能使用   *   或   table_name.*   语法指定列。必须显式给出列名。

不能在多个视图列中指定用作简单表达式的表的列名。如果对列的所有(或只有一个例外)引用是复杂表达式的一部分或是函数的一个参数,则可多次引用该列。例如,下列选择列表是非法的:

SELECT   ColumnA,   ColumnB,   ColumnA

执行   CREATE   INDEX   语句的用户必须是视图的所有者。

当执行   CREATE   INDEX   语句时,下列   SET   选项必须设置为   ON:

ANSI_NULLS     www.2cto.com

ANSI_PADDING

ANSI_WARNINGS

ARITHABORT

CONCAT_NULL_YIELDS_NULL

QUOTED_IDENTIFIERS

必须将选项   NUMERIC_ROUNDABORT   选项设置为   OFF。

视图不能包含   text、ntext   或   image   列,即使在   CREATE   INDEX   语句中没有引用它们。

如果视图定义中的   SELECT   语句指定了一个   GROUP   BY   子句,则唯一聚集索引的键只能引用在   GROUP   BY   子句中指定的列。

时间: 2024-10-15 12:58:08

SqlServer在视图上创建索引的条件的相关文章

SQLServer中在视图上使用索引(转载)

在SQL Server中,视图是一个保存的T-SQL查询.视图定义由SQL Server保存,以便它能够用作一个虚拟表来简化查询,并给基表增加另一层安全.但是,它并不占用数据库的任何空间.实际上,在你查询它之前,视图并不做任何事情. 索引视图 在SQL Server 2000和2005中,你能够给视图增加索引.但是,如果视图只是一个保存在数据库中的查询定义,在运行前没有自己的数据,你如何给那个定义建立一个索引呢?嗯,这比较麻烦. 索引视图是一个已被物化或保存在数据库中的视图.当基本表更新时,给视

对于大量left join 的表查询,可以在关键的 连接节点字段上创建索引。

问题: 大量的left join 怎么优化 select a.id,a.num,b.num,b.pcs,c.num, c.pcs,d.num,d.pcs,e.num,e.pcs,a.x, a.y from a left join b.id=a.id and b.time=a.time left join c.id=a.id and b.time=a.time left join d.id=a.id and b.time=a.time left join e.id=a.id and b.time=

oracle 物化视图及创建索引

物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体查询性能的提高,并没有实质上的好处. 1.物化视图的类型:ON DEMAND.ON COMMIT 二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性:而ON COMMIT是说,一旦基表有了C

物化视图,索引视图,函数索引,创建索引时使用DESC

老板交给的一个任务,搜了一下资料,觉得还是总结一下比较好.假如以后用到了呢?围绕两个主题:一是视图上能够建索引,二是在创建索引时是否可以使用DESC关键字. 一.能否在视图上创建索引 因为普通的视图并没有存储实际的信息,它所操作的数据来自于基本表,所以在普通视图上不可以创建索引. 在oracle中执行如下的语句,会报"视图不适用于此处"的错误 create view test_car as select license from cars; create index index_vew

SQL语句-创建索引

  语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100GO USE 库名GOIF EXISTS (SELECT * FROM SYSINDEXES WHERE NAME='IX_TEST_TNAME')--检测是否已经存在IX_TEST_TNAME索引DROP INDEX TEST.IX_TEST_TNAME--如果存在则删除 --创建索引CREATE NONCLUSTERED INDEX IX_TEST_TNAME

列上加索引时事有条件

在列上加索引时事有条件的:1.经常被查询的列2.order by子句中使用的列3.是外键或者主键的列4.列是唯一的列5.两个或多个列经常同时出现在where子句中或者连接条件中 一般来说,应该在这些列上创建索引: 1在经常需要搜索的列上,可以加快搜索的速度: 2在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构: 3在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度: 4在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的: 5在经常需要排序的列上

SQLServer 语句-创建索引

语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100GO /*实例*/USE 库名GOIF EXISTS (SELECT * FROM SYSINDEXES WHERE NAME='IX_TEST_TNAME')--检测是否已经存在IX_TEST_TNAME索引DROP INDEX TEST.IX_TEST_TNAME--如果存在则删除 --创建索引CREATE NONCLUSTERED INDEX IX_TEST_TN

SQLServer 语句-创建索引【转】

语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100GO /*实例*/USE 库名GOIF EXISTS (SELECT * FROM SYSINDEXES WHERE NAME='IX_TEST_TNAME')--检测是否已经存在IX_TEST_TNAME索引DROP INDEX TEST.IX_TEST_TNAME--如果存在则删除 --创建索引CREATE NONCLUSTERED INDEX IX_TEST_TN

在计算列中创建索引提高性能

前言:在理解计算列上的索引之前,先了解计算列的基本知识.计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以是用一个或多个运算符连接的上述元素的任意组合.表达式不能为子查询.默认情况下,计算列是一个虚拟的列,并且可以在调用时重新计算,直到在CREATE TABLE或者ALTER TABLE 命令中使用PERSISTED.如果列定义成PERSISTED,会存放计算值,并存放在原始列上更新后的汇总值,不能对计算列进行INSERT.UPDATE. 准备工作: