22,300
社区成员




if exists(select * from sysobjects where name='vw_user')
drop view vw_user
GO
--创建视图
CREATE view vw_user
as
select top 99 percent 姓名=name,等级=grade,积分=point
from users order by grade desc,point desc
go
go
--分别从视图和表中查询数据
select * from vw_user--查出来的顺序和我的排序这段排序的不一样。郁闷了。出什么问题了,求教。
select * from users
/*
姓名 等级 积分
-------------------------------------------------- ----------- -----------
李明 2 2200
何大 2 2100
张五 1 1890
赵七 1 1670
(4 行受影响)
id name grade point
----------- -------------------------------------------------- ----------- -----------
1 何大 2 2100
2 李明 2 2200
3 张五 1 1890
4 赵七 1 1670
(4 行受影响)
*/
select TOP 100 percent * from tb
---->相当于
select * from tb
set showplan_all on
go
select top 100 percent 姓名=name,等级=grade,积分=point
from users order by grade desc,point desc
select 姓名=name,等级=grade,积分=point
from users order by grade desc,point desc
go
set showplan_all off
/*
StmtText
---------------------------------------------------------------------------------------------------
select top 100 percent 姓名=name,等级=grade,积分=point
from users order by grade desc,point desc 1 1 0 NULL
|--Sort(ORDER BY:([test].[dbo].[users].[grade] DESC, [test].[dbo].[users].[point] DESC))
|--Clustered Index Scan(OBJECT:([test].[dbo].[users].[PK__users__705EA0EB]))
select 姓名=name,等级=grade,积分=point
from users order by grade desc,point desc 2 4 0
|--Sort(ORDER BY:([test].[dbo].[users].[grade] DESC, [test].[dbo].[users].[point] DESC))
|--Clustered Index Scan(OBJECT:([test].[dbo].[users].[PK__users__705EA0EB]))
(6 行受影响)
*/
解析视图上的索引
Microsoft® SQL Server™ 2000 查询优化器确定给定查询是否能从使用数据库中定义的任何索引中获益。索引包括索引视图和基表索引。当满足下列条件时,SQL Server 查询优化器使用索引视图:
下列会话选项均设置为 ON:
ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIERS
NUMERIC_ROUNDABORT 会话选项设置为 OFF。
查询优化器查找视图索引列与查询中的元素之间的匹配部分,如:
WHERE 子句中的搜索条件谓词。
联接操作。
聚合函数。
估计的索引使用成本是查询优化器考虑使用的所有访问机制中的最低成本。
除 SET 选项的要求外,查询优化器使用上述规则确定表索引是否包含查询。查询中无须再指定其它选项以使用索引视图。
查询不必在 FROM 子句中显式引用索引视图,查询优化器即可使用该索引视图。如果查询所引用的基表中的列也同时存在于索引视图中,并且,查询优化器估计使用索引视图将提供最低成本的访问机制,则查询优化器会选择索引视图,其方式类似于当查询中不直接引用基表索引时选择基表索引。当视图中包含非查询所引用的列时,只要视图提供覆盖一个或多个查询所指定列的最低成本选项,查询优化器即可能选择该视图。
使用 EXPAND VIEWS 选项可防止使用视图索引进行查询。可使用 NOEXPAND 视图提示强制优化器使用在 FROM 子句中指定的索引视图上的索引。不过,建议让查询优化器动态地决定各查询使用的最佳访问方法。只在经测试证实 EXPAND 和 NOEXPAND 可显著提高性能的特定情形中使用它们。
EXPAND VIEWS 选项指定对于整个查询,查询优化器不应使用任何视图索引。
查询优化器不使用任何索引视图,除非在 FROM 子句中指定了视图。当查询优化器评估覆盖查询中所引用列的低成本方法时,它将忽略所有视图索引。
查询优化器将 FROM 子句中引用的索引视图视为标准视图。查询优化器将视图的逻辑纳入查询执行计划中,并从基表中动态生成结果集。查询优化器忽略在视图上定义的索引。
当指定视图为 NOEXPAND 时,查询优化器将考虑使用视图上定义的任何索引。通过在可选的 INDEX() 子句中指定 NOEXPAND,可强制查询优化器使用指定索引。只能为索引视图指定 NOEXPAND,而不能为还未建立索引的视图指定 NOEXPAND。
视图索引
Microsoft® SQL Server™ 2000 支持在视图上定义索引。视图有时也称为虚拟表,这是由于视图返回的结果集与包含行和列的表具有相同的常规格式,并且在 SQL 语句中可以相同的方式引用视图和表。非索引视图的结果集不永久存储在数据库中。每当查询引用视图时,SQL Server 便动态地将生成视图结果集所需的逻辑合并到由基表中的数据生成完整的查询结果集所需的逻辑中。生成视图结果的过程称为视图具体化。有关更多信息,请参见视图解析。
对于涉及对大量的行进行复杂处理的非索引视图,为引用视图的每个查询动态生成结果集的开销会很大。这类视图包括聚集大量数据或联接许多行的视图。若经常在查询中引用这类视图,可通过在视图上创建唯一聚集索引来提高性能。在视图上创建唯一聚集索引时将执行该视图,并且结果集在数据库中的存储方式与带聚集索引的表的存储方式相同。有关用于存储聚集索引的结构的更多信息,请参见聚集索引。
在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在 FROM 子句中命令视图。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。
在视图上创建聚集索引可存储创建索引时生成的结果集。索引视图还自动反映自创建索引后对基表数据所做的更改,这一点与在基表上创建的索引相同。当对基表中的数据进行更改时,索引视图中存储的数据也反映数据更改。视图的聚集索引必须唯一,从而提高了 SQL Server 在索引中查找受任何数据更改影响的行的效率。
必须设置特定的 SET 选项后才能在视图上创建索引。只有当执行语句的连接具有相同的选项设置时,查询优化器才考虑对后续 SQL 语句使用索引。有关更多信息,请参见影响结果的 SET 选项。
与基表上的索引相比,对索引视图的维护可能更复杂。只有当提高的视图结果检索速度超过了修改所需的开销时,才应在视图上创建索引。这样的视图通常包括映射在相对静态的数据上、处理多行以及由许多查询引用的视图。
在视图上创建的第一个索引必须是唯一聚集索引。在创建唯一聚集索引后,可创建其它非聚集索引。视图上的索引命名规则与表上的索引命名规则相同。唯一区别是表名由视图名替换。
若除去视图,视图上的所有索引也将被除去。若除去聚集索引,视图上的所有非聚集索引也将被除去。可分别除去非聚集索引。除去视图上的聚集索引将删除存储的结果集,并且优化器将重新像处理标准视图那样处理视图。
尽管 CREATE UNIQUE CLUSTERED INDEX 语句仅指定组成聚集索引键的列,但视图的完整结果集将存储在数据库中。与基表上的聚集索引一样,聚集索引的 B 树结构仅包含键列,但数据行包含视图结果集中的所有列。