SQL索引视图的效率怎样?

jiewenxu 2010-03-25 10:59:58
问一下。查阅资料发现SQL视图无法提高查询的效率,是因为它只表示一个SELECT语句并不储存结果集。而我又看到索引视图可以提高查询效率,是因为索引视图可以存储结果集(这句话对吗?)
请教一下索引视图的原理是什么?为什么能提高查询效率?
还有,临时表是建立在内存中的吗?我在网上看到有这样的说法

我的程序中,我想要这样一种效果,我想用指定复杂查询语句生成一个临时表。这个表能像视图那样,自身储存有一个查询语句。但是它又像一个临时表——它的结果集可以以我设定的一段时间在本地缓存起来,而不只是一个句子。我还希望这个表能根据自身的timeout来自动重建

请问SQL中有类似这样的功能吗?还是我只能手动实现?
...全文
782 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xujihui2571 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fredrickhu 的回复:]
引用 11 楼 jiewenxu 的回复:
引用 10 楼 guguda2008 的回复:
就我的理解来说,索引视图类型于多表间的包含性列索引,它的B树中的键值由视图输出的值组成,这些值可以是来自多个表的复杂计算的结果。在提高了冗余性以后,查询速度当然就加快了


领教。那么就是说索引视图的结果集确实以实体存在,作为查询结果的一个COPY保存在数据库中

索引视图是具体化的视图,它的……
[/Quote]
索引视图类似 ORACLE中的物化视图,和一般的视图不同,索引视图实际上物化成表了,例如一张表有100W条数据,假如你对这张表建了一张视图,从中查询10条记录,当你查询这张视图是,实际上还是到这100W条记录中去查询,假如你对这10条记录建立了索引视图,当你查询这张视图时,只是从这10条记录中去查询,但是这当中有个问题是,查询速度的确提高了很多,但是对这张表的维护的效率必然是降低了,所以我觉得,索引视图更适合在OLAP的数据库中使用,不适合在OLTP的数据库中使用 这是我个人的理解
--小F-- 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jiewenxu 的回复:]
引用 10 楼 guguda2008 的回复:
就我的理解来说,索引视图类型于多表间的包含性列索引,它的B树中的键值由视图输出的值组成,这些值可以是来自多个表的复杂计算的结果。在提高了冗余性以后,查询速度当然就加快了


领教。那么就是说索引视图的结果集确实以实体存在,作为查询结果的一个COPY保存在数据库中
[/Quote]
索引视图是具体化的视图,它的结果集是经过计算的,并且存储在数据库中
jiewenxu 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 guguda2008 的回复:]
就我的理解来说,索引视图类型于多表间的包含性列索引,它的B树中的键值由视图输出的值组成,这些值可以是来自多个表的复杂计算的结果。在提高了冗余性以后,查询速度当然就加快了
[/Quote]

领教。那么就是说索引视图的结果集确实以实体存在,作为查询结果的一个COPY保存在数据库中
guguda2008 2010-03-27
  • 打赏
  • 举报
回复
就我的理解来说,索引视图类型于多表间的包含性列索引,它的B树中的键值由视图输出的值组成,这些值可以是来自多个表的复杂计算的结果。在提高了冗余性以后,查询速度当然就加快了
guguda2008 2010-03-27
  • 打赏
  • 举报
回复
视图也称为虚拟表,因为视图所返回的结果集的一般格式与表相同,都是由列和行组成,而且在 SQL 语句中引用视图的方式也与引用表的方式相同。标准视图的结果集不是永久地存储在数据库中。每次查询引用标准视图时,SQL Server 2005 都会在内部将视图的定义替换为该查询,直到修改后的查询仅引用基表。然后,它将照常运行所得到的查询。有关详细信息,请参阅视图解析。

对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图。如果在查询中频繁地引用这类视图,可通过对视图创建唯一聚集索引来提高性能。对视图创建唯一聚集索引后,结果集将存储在数据库中,就像带有聚集索引的表一样。

对视图创建索引的另一个好处是:优化器可以在未直接在 FROM 子句中指定某一视图的查询中使用该视图的索引。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。有关详细信息,请参阅解析视图的索引。

对基表中的数据进行更改时,数据更改将反映在索引视图中存储的数据中。视图的聚集索引必须唯一,这一要求提高了 SQL Server 在索引中查找受任何数据更改影响的行的效率。

jiewenxu 2010-03-27
  • 打赏
  • 举报
回复
顶一下
yhtapmys 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 guguda2008 的回复:]
第一个问题,索引视图就是对某些列建立了索引视图,并根据视图的定义对该索引进行相应的维护。因为有了索引,所以查询效率高。
第二个问题,临时表存储在TEMDB中,而不是内存中,所有数据在被引用时都会被放到内存内的缓冲区中,临时表也是这样

最后一个问题,不知道你的意思是不是一个能够定时刷新的表,你可以通过建立一个作业也定时执行一段SQL语句,当然也包括插入数据到一个你定义的表里。不知道是不是你要……
[/Quote]
鸭子棒棒
htl258_Tony 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beirut 的回复:]
第一
应用索引视图的优点
在实施索引视图前,分析数据库工作负荷。运用查询及各种相关工具(比如:SQL Profiler)方面的知识来确定可从索引视图获益的查询。频繁发生聚合和联接的情况最适合使用索引视图。无论是否频繁发生,只要某个查询需要很长的响应时间,同时快速获得响应的开销很高,那么就适合使用索引视图。例如,一些开发人员发现为高级主管们在月末运行的报告,创建预先计算和存储查询的应答的索引视图……
[/Quote]UP
jiewenxu 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 guguda2008 的回复:]
第一个问题,索引视图就是对某些列建立了索引视图,并根据视图的定义对该索引进行相应的维护。因为有了索引,所以查询效率高。
第二个问题,临时表存储在TEMDB中,而不是内存中,所有数据在被引用时都会被放到内存内的缓冲区中,临时表也是这样

最后一个问题,不知道你的意思是不是一个能够定时刷新的表,你可以通过建立一个作业也定时执行一段SQL语句,当然也包括插入数据到一个你定义的表里。不知道是不是你要……
[/Quote]

那么,索引视图到底是否根据引用表创建了一个结果集?还是它只根据结果集创建了相应的索引却不包含数据?
黄_瓜 2010-03-25
  • 打赏
  • 举报
回复
第一
应用索引视图的优点
在实施索引视图前,分析数据库工作负荷。运用查询及各种相关工具(比如:SQL Profiler)方面的知识来确定可从索引视图获益的查询。频繁发生聚合和联接的情况最适合使用索引视图。无论是否频繁发生,只要某个查询需要很长的响应时间,同时快速获得响应的开销很高,那么就适合使用索引视图。例如,一些开发人员发现为高级主管们在月末运行的报告,创建预先计算和存储查询的应答的索引视图很有用。

不是所有的查询都能从索引视图中获益。与一般索引类似,如果未使用索引视图,就无法从中受益。在这种情况下,不仅无法实现性能改善,而且会在磁盘空间、维护和优化方面产生额外的成本。然而,当使用索引视图时,可大大改善(在数量级上)数据访问。这是因为查询优化器使用存储在索引视图(大幅降低了查询执行的成本)中预先计算的结果。

查询优化器仅考虑对具有高成本的查询使用索引视图。从而避免出现这样的情况:在查询优化成本高于使用索引视图所节约的成本时尝试匹配各种索引视图。在成本少于 1 的查询中很好使用索引视图。

guguda2008 2010-03-25
  • 打赏
  • 举报
回复
第一个问题,索引视图就是对某些列建立了索引视图,并根据视图的定义对该索引进行相应的维护。因为有了索引,所以查询效率高。
第二个问题,临时表存储在TEMDB中,而不是内存中,所有数据在被引用时都会被放到内存内的缓冲区中,临时表也是这样

最后一个问题,不知道你的意思是不是一个能够定时刷新的表,你可以通过建立一个作业也定时执行一段SQL语句,当然也包括插入数据到一个你定义的表里。不知道是不是你要的。
东那个升 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
SQL code
---索引视图

索引视图是具体化的视图

--创建索引视图
create view 视图名 with schemabinding
as
select 语句
go

---创建索引视图需要注意的几点
1. 创建索引视图的时候需要指定表所属的架构
--错误写法
create view v_f with schemabinding
as
selec……
[/Quote]

UP
--小F-- 2010-03-25
  • 打赏
  • 举报
回复
---索引视图

索引视图是具体化的视图

--创建索引视图
create view 视图名 with schemabinding
as
select 语句
go

---创建索引视图需要注意的几点
1. 创建索引视图的时候需要指定表所属的架构
--错误写法
create view v_f with schemabinding
as
select
a.a,a.b,b.a,b.b
from
a join b
on
a.id=b.id
go

---正确写法:
create view v_f with schemabinding
as
select
*
from
dbo.a join dbo.b
on
a.id=b.id
go


2.在创建索引视图的select语句时,不使用*,必须指定具体的列名
--错误写法
create view v_f with schemabinding
as
select
a.a,a.b,b.a,b.b
from
dbo.a join dbo.b
on
a.id=b.id
go

---正确写法
create view v_f with schemabinding
as
select
a.a,a.b,b.a,b.b
from
dbo.a join dbo.b
on
a.id=b.id
go

3.在创建索引视图的select 语句中,不能存在重复的列名,这个不举例了

4. 只能为索引视图创建唯一聚集索引
--正确的写法
create unique clustered index ix_uniquetb on v_tb
go

--错误的写法
create clustered index ix_uniquetb on v_tb
go



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2010/01/12/5183068.aspx

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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