APP下载

关于SQL视图优点和缺点的浅探

2017-12-28李素奇射阳县中医院

数码世界 2017年12期
关键词:数据表视图语句

李素奇 射阳县中医院

关于SQL视图优点和缺点的浅探

李素奇 射阳县中医院

在SQL中查询数据时,一般从设计SELECT语句开始,将需要查询的字段写下来,而每次你要来查询数据时(同样的条件下),那么就需要重复输入一样的查询语句,效率低下。但将这个经常要重复使用的查询语句创建成视图,就简单了!我们在程序设计的时,要先了解视图的优点和缺点,这样就可以扬长避短,更合理的来使用它。

视图 优点 缺点

在SQL Server数据库中,表定义了数据的编排方式和结构。在SQL Server数据库中查看存储的数据的方法也不是唯一的,可通过定义SQL Server数据库的数据视图来展现。使用SELECT…FROM语句从一个或多个表中导出数据形成视图,这些表我们称之为基表。当然 我们也可以从一个、多个视图中生成新的视图。视图又可称为虚表,是因为在数据库中存有导出视图的查询语句,但是查询出的相关视图定义的数据在数据库中并未增加,在生成的视图中看到的数据是基于实际的表中数据,两者在操作上并没有区别,但两者之间的差异在本质是不同的。视图并没有保存任何记录,它存储的是查询语句,其查询的记录实际来自于数据表,也可以为多张数据表,所以说视图应用的宽度很大!我们可以根据各种查询要求来创建不同视图,且不会增加SQL Server数据库中现有的数据量。

1 视图的优点

1.1 视图的简易性:为了将重复、复杂的操作简化,我们可以把复杂的查询直接定义为视图。这样就使用户所需要的SQL Server数据库结构视图更具“个性化”。

1.2 视图的安全性:为了保护表的安全性,我们往往根据使用的类别、范围来划分数据库表的操作权限,当然有时这也存在一定的局限性,这时就可以在视图上通过REVOKE和GRANT命令给用户授予操作权限。通过这样的视图,他们只能修改或查询视图显示的数据,而不能修改SQL Server数据库表中不可见的数据。

1.3 数据的隔离变化:有时数据库的表重新组合或发生变化更改,我们只需要重新定义视图,还是可以在该视图上取得一致、没有变化的数据。

1.4 视图维护的简易型:有时可以根据where条件中过滤,用过滤后查询出来的数据集组成视图。我们会发现调试查询比调试视图要更复杂。在跟踪视图过程中时,更加容易分析各个步骤中的错误,这是因为视图的组成部分包含了所有的执行步骤。

2 视图的缺点

2.1 视图的性能:SQL Server对视图的查询是直接被转化为对表的查询,所以当视图由一个或者复杂的多表查询生成时,即使该视图只包含一个很简单的查询,SQL Server也需要比直接对基本表查询花费更多的时间。

2.2 视图的修改限制:当视图只涉及到简单的基本表时,我们修改视图中行或列中的数据,很方便,但是如果该视图由复杂的多表查询生成时,可能数据并不能被修改。

3 创建视图的分类

3.1 水平视图:创建视图时,限制了只能够存取表中的规定的一些数据行,即SQL Server数据库中表中行的子集。

3.2 投影视图:创建视图时,限制了只能够存取表中的规定的一些数据列,即SQL Server数据库中表中列的子集。如在医院信息管理系统(HIS系统)数据库中我们只关心挂号表(allpat表)中病人的姓名、身份证号及金额。所以可以创建如下视图:

Create view allpat_v

As

Select pat_name,sfz_no,je from allpat

在投影视图中,SQL Server数据库管理员可以按用户的需求生成专用视图,这个专用视图只由所需要的列组成。

3.3 联合视图:当我们使用视图时的一个原因就是多表查询的简化,在多个表中提取数据生成联合视图,查询出的结果被当做一个单独的“可见表”。这种视图一旦生成,就可以查询这些视图来替代多表查询的请求,提高了查询的效率。当然在定义视图时,外连接不能用。

3.4 视图的视图:即在视图的基础上创建视图,不同于基于表创建的视图。

4 视图应用的实例

有三张数据表:allpat、mzappitem和mzdj,其中allpat的记录为1万条左右,mzdj中的数据为10万条mzappitem 100万条以上,现在以 allpat.pre_no=mzdj.pre_no and mzdj.dj=mzappitem.dj为关联进行数据筛选。这时做了个SQL SERVER视图info,运行该视图的查询,花时4秒得到了结果。

现根据特殊需求来编写有一个游标的循环的存储过程,该游标反复300次循环,且在每次循环时都对info使用了查询。

循环游标体(重复300次)

select @pre_no=pre_no from info where dj_id=@id --其中@pre_no @id均为变量

update mzdj1 set pre_no =@ pre_no where dj_id=@id

在执行上述存储过程时,需要花费大于2分钟的时间,进行分析后,运行效率的低下在于对info视图的扫描上,尽管单独对该视图进行查询耗时1秒,但重复读取情况耗费了太多的时间。

如何既能有效的使用视图,又能高效的运行呢?故此按如下修改存储过程:

具体思路是:创建一个临时表,把所需的数据先插入进去,再运行存储过程。

create table #temp ( id nvarchar(20), pre_no nvarchar(20))

查询info视图,将记录插入到#temp临时表中.. 循环游标体(重复500次)

select @pre_no=pre_no from #temp where dj_id=@id --其中@pre_no,@id均为变量

update mzdj1 set pre_no =@ pre_no where dj_id=@id}

运行后该存储过程只花费10秒的时间。

综上所述我们知道每种视图都有各自的使用规则及范围,使用不恰当就会拖累性能,而使用得恰当则会使性能提升,所以在定义视图时,需谨慎权衡视图的优点和缺点。

总之,对视图的善加运用可以让我们在对数据库的设计、管理及使用都更加有效率、更加方便。

[1] 微软公司,SQL Server数据库程序设计,高等教育出版社,2005.

[2] 杨正洪郑齐健郑齐心郑齐燕等,SQL Server关系数据库管理与开发指南,机械工业出版社,2000

[3] sql之浅谈视图的作用,红黑联盟,2014.

[4]sql server 函数与视图的使用,wgw5363240的专栏,2016.

猜你喜欢

数据表视图语句
湖北省新冠肺炎疫情数据表(2.26-3.25)
湖北省新冠肺炎疫情数据表
湖北省新冠肺炎疫情数据表
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
Django 框架中通用类视图的用法
我喜欢
冠词缺失与中介语句法损伤研究
QH165点焊机器人数据库开发技术