SQL数据库

2024-05-23

SQL数据库(共12篇)

SQL数据库 篇1

并发性可以定义为允许多个进程同时操作共享数据的能力。在不互相干扰的前提下, 并发执行的用户进程的数量越多, 数据库系统的并发性就越强。随着信息化的普及和互联网的飞速发展, 应用程序的用户越来越多, 对并发性的要求也就越来越高。在许多情况下, 对并发性的处理直接关系到一个项目的成败。

1 数据库的并发问题

如果没有锁定且多个用户同时访问一个数据库, 则当他们的事务同时使用相同的数据时可能会发生数据不一致问题, 这就是并发问题。他包括:

1.1 丢失更新。

当两个或多个事务选择同一行, 然后基于最初选定的值更新该行时, 会发生丢失更新问题

1.2 未确认的相关性 (脏读) 。

当第二个事务选择其他事务正在更新的行时, 会发生未确认的相关性问题。

1.3 不一致的分析 (非重复读) 。

当第二个事务多次访问同一行而且每次读取不同的数据时, 会发生不一致的分析问题。

1.4 幻象读。

当对某行执行插入或删除操作, 而该行属于某个事务正在读取的行的范围时, 会发生幻象读问题。

2 SQL Server的并发处理机制

SQL Server使用锁定确保事务完整性和数据一致性。锁定可以防止用户读取正在由其他用户更改的数据, 并可以防止多个用户同时更改相同的数据。大多数情况下, 你不用关心如何为资源加锁, 使用什么类型的锁, 这些都是SQL Server自动控制的。但可以通过了解锁并在应用程序中自定义锁来设计更有效的应用程序。

2.1 锁粒度

SQL Server具有多粒度锁定, 允许一个事务锁定不同类型的资源。锁定在较小的粒度可以增加并发但需要较大的开销, 因为如果锁定了许多行, 则需要控制更多的锁。锁定在较大的粒度就开发而言是相当昂贵的, 因为锁定整个表限制了其他事务对表中任意部分进行访问, 但要求的开销较低, 因为需要维护的锁较少。

SQL Server可以锁定的资源如表1所示:

2.2 锁模式

SQL Server使用不同的锁模式锁定资源, 这些锁模式确定了并发事务访问资源的方式。SQL Server支持的锁模式如表2所示:

2.3 隔离级别

前面已经介绍了锁模式和锁资源的粒度级别, 它们可以在一定程度上控制并发。在这个基础上, 隔离级别定义了各个并发事务之间的隔离程度。SQL Server定义了四种隔离级别, 分别是未提交读、提交读、可重复读和可串行读。这四种隔离级别允许不同类型的行为, 如表3所示:

2.4 新增的快照机制

SQL Server2005中引入了一项被称为行版本控制的技术。利用该技术, 在事务修改数据之前会在tempdb数据库中存储一份具有一致性的数据副本, 这样当进程需要读取数据时, 不必请求资源上的共享锁, 可以直接从tempdb数据库的版本存储区中读取, 因此它不会与写进程发生冲突, 从而提高了并发性。

3 提高系统并发性的一些措施

通过了解SQL的并发控制机制, 我们根据减少锁、减少保持锁的时间、减少冲突的原则, 提出一些提高系统并发性的措施:

3.1 优化SQL语句的性能, 尤其是SELECT语句的性能。首先, 减少SQL语句的运行时间可以缩短该语句在资源上保持锁的时间, 从而允许更多的互斥操作。其次, 多数SELECT语句的性能问题都是因没有合适的索引, 或者即使有索引但未利用索引所导致的。通过创建合适的索引或优化SQL语句使之利用索引, 从而也就避免了在表中的所有行或整个表上保持锁。

3.2 使用尽量短的事务, 尤其是要避免在事务执行期间与用户交互。这样可以减少锁的保持时间。

3.3 在读写操作过多导致大量死锁的系统中使用快照隔离级别或已提交读快照隔离级别, 但这时要特别注意优化tempdb数据库。

3.4 如果不能使用快照, 则尽量使用较低的隔离级别。隔离级别越低, 允许的并发性越高, 反之亦然。

3.5 采用合适的RAID磁盘阵列系统。数据文件适合使用RAID10磁盘阵列, 而日志文件通常使用RAID1就足够了。另外, 因为日志是连续写入的, 把日志文件和数据文件放在同一个磁盘驱动器会推迟数据操作, 所以, 最好把日志文件放到单独的磁盘驱动器。

3.6 对大量数据使用分区表, 通过把请求均匀分布到各个分区来提高并发性。但要注意把每个分区放到不同的磁盘驱动器才能最大限度地发挥它的优化作用。

3.7 通过复制把数据库发布到多个物理的服务器, 以实现数据库级的负载均衡。

参考文献

[1]李春葆.数据库原理与应用[M].北京:清华大学出版社, 2006.

SQL数据库 篇2

题目:

学习报告

系:数学科学系 专

业:数学与应用数学 年

级:1301B 姓

名:曹占营 学

号:1331110101 任课教师:杨锋英

2015年 12 月 30日

C#数据库学习报告

在日常生活中,我们和朋友、亲戚联系,会广泛用到通讯录,因此这门课程以通讯录开发为案例,教我们学习软件开发。

软件开发是一项非常注重实践工作,不可能只凭看书、看视频就学会软件开发,必须扎扎实实、一行一行的编写代码,不断积累项目经验,才能真正掌握编程技术,所以我们要亲自上级编写程序,才能真正掌握软件开发技术。

本书分为基础篇、进阶篇、高级篇,由浅入深地介绍了基于C#的数据库编程技术,所用的开发工具为Visual Studio 2008、SQL Server 2005以及Access 2007。

学习数据库的内容是从数据库、数据表的创建和修改开始的,表是建立关系数据库的基本结构,用来存储数据具有已定义的属性,在表的操作过程中,有查看表信息、查看表属性、修改表中的数据、删除表中的数据及修改表和删除表的操作。从课程中让我更明白一些知识,查询可以通过SQL语言进行完成,这样加深了查询语句的基本结构,让我们能更好的掌握其中语句,方便于我们后面的学习和应用。表是数据最重要的一个数据对象,表的创建好坏直接关系到数数据库的成败,表的内容是越具体越好,但是也不能太繁琐,以后在实际应用中多使用表,对表的规划和理解就会越深刻。在编程方面是需要我们对于编程有逻辑思维能力及一定的编程技巧。在数据库中插入表、表中的信息等都需要注意,不然很容易出错。

在基础篇中,详细讲解了通讯录系统的设计、开发和安装部署这样一个完整过程,对各个任务进行详细讲解。基础篇学习分为9个任务,分别为系统分析与设计、用户登录、主窗体设计、联系人分组管理、联系人管理、用户密码修改、数据库备份与恢复、设计“关于”窗体、系统安装与部署。学完基础篇,即可开发出一个功能较为完备的通讯录系统。在联系人管理任务学习中,由于在Contact表中保存的是分组编号,而窗体上要显示的是分组名称,所以在查询语句中需要级联查询,即SQL语句为”select Contact.Id, Name, Phone, Email, QQ, GroupName from Contact, ContactGroup where Contact.GroupId = ContactGroup.Id”。为了实现代码复用,可以提供查询功能,根据用户选择的擦寻天剑,拼接产生SQL语句。同时为了支持模糊查询,还在SQL语句中用了like语句。通过SqlDataAdapter的Fill方法填充数据集,获取数据。数据集中有了数据以后,我们只需设置DataGridView控件的DataSource属性,就可以显示数据了。

在进阶篇中,介绍了企业项目开发中广发用到的参数化SQL语句、存储过程使用及定义数据库操作类,分为3个任务学习,分别为使用参数化SQL语句、使用存储过程、使用自定义数据库操作类,进一步提高我们的数据库编程能力。在使用存储过程任务学习中,了解到存储过程是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。在性能方面,存储过程有如下的优点。(1)与编译,存储过程预先编译好放在数据库内,减少编译语句所花的时间。(2)缓存,编译好的存储过程会进入缓存,所以对于经常执行的存储过程,除了第一次执行外,其他次执行的书都会有明显提高。(3)减少网络传输,特别对于处理一些数据的存储过程,不必像直接用SQL语句实现那样多次传送数据到客户端。通过前面的学习,细细体会对数据库的操作,可以发现,这么多操作其实可以分为4种。(1)对数据库进行非连接式查询操作,返回多条记录。这种操作可以通过SqlDataAdapter对象的Fill方法来完成,即把查询得到的结果填充到DataTable(或DataSet)对象中。(2)对数据库进行连接式查询操作,返回多条查询记录。这种操作可以通过SqlCommand对象的ExecuteReader方法来完成,返回SqlDataReader对象。(3)从数据库中检索单值。这种操作可以通过SqlCommand对象的ExecuteNonQuery方法来完成。ExecuteScalar方法返回的是Object类型,需要根据实际情况进行类型转换。(4)对数据库执行增、删、改操作。这种操作可以通过SqlCommand对象的ExecuteNonQuery方法来完成,返回增、删、改操作后数据库中受影响的行数。

在高级篇中,分为4个任务学习,分别为开发基于三层构架的通讯录程序、开发基于Access的通讯录程序、实现基于抽象工厂模式的三层架构、使用MD5加密用户密码。首先详细讲解了基于三层构架的通讯录程序开发过程以及如何开发一个基于Access的通讯录系统。最后,介绍了如何采用MD5加密技术对用户密码加密。MD5加密技术也是实际项目开发中广泛用到的,通过MD5加密用户密码,可以提高程序的安全性。“三层架构”一词中的“三层”是指:“表示层”、“业务逻辑层”、“数据访问层”。表示层:位于最外层,离用户最近。用于显示和接收用户输入的数据,为用户提供一种交互式操作界面。表示层的常见形式为WinFrom和WebForm。业务逻辑层:负责处理用户输入的信息,或者是将这些信息发送给数据访问层进行保存,或者是调用数据访问层中的函数再次读出这些数据。业务逻辑层也可以包括一些对“商业逻辑”描述代码在里面。数据访问层:仅实现对数据的保存和读取操作。可以访问数据库系统、二进制文件、文本文档或是XML文档。

在这一学期有限的几次实验课后,我虽然没有学会很多,但也学会了一些简单的操作,我学会了一些简单的数据运算,会建立一些简单的表。有时候在做实验时,对于实验中的一些东西我不怎么了解,但我还会去做,因为我想只有多练习才能熟练,也才能理解掌握知识。我不知道这一门课对其他同学来说怎么样,但对我来说却有些难,但我会努力。因为我认为它对我以后考计算机二级有很大的帮助。

SQL数据库 篇3

一、对 SQL Server 2000进行安全配置

首先对操作系统进行安全配置,保证操作系统处于安全状态。然后对要使用的操作数据库软件进行安全审核,如ASP、PHP脚本等,这是很多基于数据库的WEB应用可能常出现的安全隐患,过滤掉脚本中类似 @、 / 等字符,防止被构造恶意SQL语句。再安装SQL Server2000后打上sp1、 sp2补丁。

二、确认SQL服务器系统安装在NTFS分区,且应用权限控制列表

如果入侵者得到对数据库系统存取操作权限,该层权限可以阻止入侵者进一步破坏数据。

配置方法:找到SQL Server安装文件夹,默认安装在“C:Program Files Microsoft SQL Server”目录下。鼠标右键,选择“属性”。注意“共享”属性选项卡,设定为“不共享”。点击安全选项,只允许许可的用户访问该文件夹。

三、使用协议加密

SQL Server 2000使用Tabular Data Stream协议来进行网络数据交换,此协议所有的网络传输,如数据库内容、密码等都是明文的,是很大的安全隐患。它能被其他人在网络中截获,所以在条件容许情况下,最好使用SSL来加密协议。

四、修改或删除SA账户

修改或删除SA账户配置方法:打开SQL中的企业管理器,在工具选项卡中选择SQL server配置属性,点服务器设置,勾选允许“对系统目录直接进行修改”,然后打开查询分析器,登陆进去输入:

update sysxlogins set name=你要改成的名字 where sid=0x01

update sysxlogins set

sid=0xE765555BD44F054F89CD0076A06EA823where name=你要改成的名字。然后,在企业管理器中刷新登陆,可以看到SA变成了修改后的账户名,选中该账户名点击右键,出现删除的选项,即可执行删除SA账户操作。

五、使用安全的密码策略,禁用默认登录

很多数据库账号的密码过于简单,这跟系统密码过于简单是一个道理。SQL Server的“SA”账户在默认状态下是空密码,使用如下配置方法修改密码:

开始→所有程序→Microsoft SQL Server→企业管理器,展开控制台根目录,选择“安全性”,点击“登录”,用户列表中可以看到SA用户。双击打开,更改用户密码,设定一个足够复杂并且足够长度密码来加强其安全性,同时不要让该账号的密码写于应用程序或者脚本中。

另外可使用下面的SQL语句定期查看是否有不符合密码要求的账号:

Use master

Select name,Password from syslogins where password is null

在企业管理器中"安全选项" 之下禁用默认登录,使未经认可的不在 syslogins 表中的使用者无权登陆到有效的数据库服务器。

六、关闭允许对“系统目录直接进行修改”功能

配置方法:鼠标右键数据库服务器,选择“服务器设置”,在“服务器行为”字段下,关闭“系统目录直接进行修改”。如果开启此功能,在数据库架构内可以使用扩展存储过程对系统目录下的文件或者其他信息进行修改,或者在数据库架构内上传具有恶意功能的代码。严禁使用Xp_cmdshell命令。限制所有的账户拥有操作、因为如果恶意入侵者拥有操作该命令的权限,就可以轻松得到系统管理员的权限。

七、关闭远程服务器连接

如果允许使用远程服务器连接,入侵者在自己的机器上安装SQL Server就可以使用数据库服务器连接到你服务器的数据库上,从而造成级别很高的安全风险。

配置方法:展开控制台根目录,选择“(Local)Windows NT”,鼠标右键,选择“属性”,在配置窗口中选择“连接”,去掉“允许其他SQL Server使用RPC远程连接到本SQL Server”选项,防止他人使用数据库的恶意连接。

八、关闭远程终端服务和Web管理功能,禁用使用者交互式登录SQL Server

一旦其中某个使用者能够交互式进入一个服务器之内,就有可能利用管理员的存取特权得到管理员权限。

配置方法: 展开控制台根目录,选择“(Local)Windows NT”,鼠标右键,选择“属性”,在配置窗口中选择“安全性”选项卡,启用混合模式安全性认证,在默认状态只是执行失败的审核,使用“SQL Server和Windows”身份验证,审核级别使用“全部”, 记录所有的身份验证状况。“无”表示不执行审核;“成功”表示只审核成功的登录尝试;“失败”表示只审核失败的登录尝试;“全部”表示审核成功的和失败的登录尝试。

九、建立一个低权限用户做为SQL服务器服务的查询操作专用账户

最好不要用LocalSystem或SA。 这个账户应该设定作为一个服务运行的最小权利,注意当使用企业管理器做以上设置时,文件、注册表和使用者权利上的 ACLs也同时被处理。。

配置方法:展开控制台根目录,选择“数据库”,展开,点击“用户”,在右侧用户列表中可以看到已经授权的用户,在默认状态下只有“SA”和“Guest”两个用户。双击打开已经建立的低权限账户,打开数据库用户属性。选择数据库脚色,尽可能低的权限。打开“权限”按钮,赋予用户相应的权限。

十、不要让人随便探测到你的TCP/IP端口

默认情况下,SQL Server使用1433端口监听,配置SQL Server时 请改变该端口。

配置方法:在实例属性中选择TCP/IP协议的属性,选择隐藏 SQL Server 实例。如果隐藏了 SQL Server 实例,则禁止了对试图枚举网络上现有的 SQL Server 实例的客户端所发出的广播作出响应,这样,除非用Port Scan,否则别人无法用1434来探测你的TCP/IP端口了。

十一、管理扩展存储过程

对存储过程进行大手术,并且对账号调用扩展存储过程的权限要慎重。我们在大多数应用中其实用不到多少系统的存储过程,而SQL Server的这么多系统存储过程只是用来适应广大用户需求的,所以可以删除不必要的存储过程,因为有些系统的存储过程能很容易地被人利用起来提升权限或进行破坏。如果不需要扩展存储过程xp_cmdshell ,使用这个SQL语句把它去掉:

use master

exec sp_dropextendedproc'xp_cmdshell'

使用以下语句也可以恢复该存储过程:

Exec sp_addextendedproc ' xp_cmdshell ', 'xpsql70.dll'

如果不需要可停用部分对象连接与嵌入自动化储存程序( 注意: 当这些储存程序被停用的时候 , 部分企业管理器功能可能丢失):

Sp_OASetProperty

Sp_OAStop

Sp_OADestroy

Sp_OAGetProperty

Sp_OACreate

Sp_OAMethod

Sp_OAGetErrorInfo

禁用你不需要的以下注册表存储过程,它们有些能够读出操作系统管理员的密码,如:

Xp_regdeletevalue

Xp_regremovemultistring

Xp_regenumvalues

Xp_regread

Xp_regwrite

Xp_regaddmultistring

Xp_regdeletekey

移除其他您认为会造成威胁的系统储存进程如:

xp_enumqueuedtasks

xp_grantlogin

xp_logevent

xp_loginconfig

xp_logininfo

sp_sdidebug

xp_availablemedia

xp_cmdshell

xp_deletemail

xp_dirtree

xp_fixeddrives

xp_getfiledetails

xp_getnetname

xp_dropwebtask

xp_dsninfo

xp_enumdsn

xp_eventlog

xp_findnextmsg

xp_enumerrorlogs

xp_enumgroups

xp_revokelogin

xp_runwebtask

xp_snmp_raisetrap

xp_sprintf

xp_sqlinventory

xp_sqlregister

xp_sqltrace

xp_schedulersignal

xp_sendmail

xp_sscanf

xp_startmail

十二、加强数据库日志的记录,定期检测SQL日志文件

审核数据库登录事件的“失败和成功”,在实例属性中选择“安全性”,将审核级别选定为全部,这样在数据库系统和操作系统日志里面,就会详细记录所有账号的登录事件。

定期查看SQL Server日志,检查是否有可疑登录事件发生,或者使用DOS命令。findstr /C:“登录” d:Microsoft SQL ServerMSSQLLOG*.* ,检索其中成功登录或者登录失败的信息,从中找到非法入侵所作的数据库登录尝试, 配置方法:展开控制台根目录,选择“管理”,展开,选择“SQL Server日志”,在右侧窗口列表中打开所选日志文件,会看到上面有详细的记录。

十三、将数据库文件和日志文件分开存储在不同的物理存储设备上

配置方法:双击数据库文件名,打开数据库属性,点击“数据文件”选项,设置数据文件存放的位置。点击“事务日志”选项,设置日至文件存放的位置。一旦发生灾难性故障,如硬件损坏,数据文件和日志存放在一起,没有任何手段可以恢复数据。但若是做过数据备份,同时日志文件保存在其它位置,日志文件没有损坏,就可能恢复数据。

十四、禁用SQL邮件功能

它的存在会使潜在的攻击者递送潜在的 trojans ,病毒或是简单实现一个DOS攻击成为可能。

十五、推荐使用SQL Server2000支持的“完全”数据库故障还原模型方式

SQL Server2000支持“简单”、“完全”和“大容量日志记录”三种数据库故障还原模型,配置方法:选中数据库名称,鼠标右键选择属性,点击“选项”选项卡,在故障还原子段下有‘模型栏目,选择“完全”方式。

第十六、制定严格的数据库备份还原策略

设计有效的备份和还原策略需考虑的因此包括:数据可用性和防数据丢失目标、数据库特性、资源约束等。当然其中最重要的一点是务必将将数据库和备份放置在不同的设备上。 否则,如果包含数据库的设备失败,备份也将不可用。 此外,将数据和备份放置在不同的设备上还可以提高写入备份和使用数据库时的 I/O 性能。

运用SQL数据库进行银行对账 篇4

一、建立源文件

第一步, 将本月发生的银行存款整理为Excel形式。按照单位日期 (dwrq) 、单位收入 (dwsr) 和单位支出 (dwzc) 等字段名将单位的银行存款信息编辑好, 取名表dw;

第二步, 将银行对账单也整理为Excel形式。按照银行日期 (yhrq) 、银行收入 (yhsr) 和银行支出 (yhzc) 等字段名将银行对账单信息编辑好, 取名表yh。

二、建立目标文件

第一步, 在SQL数据库中建立一个子数据库, 取名dz;

第二步, 在数据库dz中建立表d和表y, 分别对应表dw和表yh。

三、将源文件导入目标文件

利用SQL数据库的数据导入功能分别将表dw和表yh导入到对应的表d和表y中。

四、在SQL数据库的查询分析器中, 筛选出不同的记录

第一步, 打开数据库dz;

第二步, 输入SQL语句:

“select * from d where not exists (select 1 from y where (d.dwsr=y.yhsr or d.dwzc=y.yhzc) )

select * from y where not exists (select 1 from d where (d.dwsr=y.yhsr or d.dwzc=y.yhzc) ) ”, 将单位银行账和银行对账单中的不同记录筛选出来, 最终得到银行存款余额调节表中需要的未达账项数据。

五、具体运用

第一步, 制作两张Excel表, 一张为本月的银行存款账 (见表1) , 另一张为本月的银行对账单 (见表2) 。

第二步, 打开SQL数据库的企业管理器, 创建一个名为dz的数据库。在SQL Serve企业管理器窗口中, 在“控制台根目录”窗口对话框内, 选择“操作”下拉菜单中的“新建数据库”, 进入“数据库属性”窗口, 在“常规”标签中输入想要建立的数据库的名字 (例如dz) , 单击“确定”按钮建立数据库 (如图1所示) 。

第三步, 在数据库dz中分别创建表d和表y。两张表的结构和字段名要和表dw、表yh相同。以创建表dw为例, 在右侧空白处点右键, 点击“新建表”, 在“列名”中输入“dwrq”, 在“数据类型”中选择“datetime (日期型) ”, “长度”为默认值, “允许空”中打“√”;在“列名”中输入“dwsr”, 在“数据类型”中选择“decimal (数值型) ”, “长度”为默认值, “允许空”中打“√”, 在“小数位数”中输入“2”;在“列名”中输入“dwzc”, 在“数据类型”中选择“decimal (数值型) ”, “长度”为默认值, “允许空”中打“√”, 在“小数位数”中输入“2”。输入完毕后点击“保存”按钮, 输入表名“d”即完成了建表 (如图2所示) 。

第四步, 将表dw和表yh分别导入到表d和表y。以将表dw导入表d为例, 首先选中表d, 右击“所有任务”→“导入数据”, 进入“导入/导出”界面 (如图3所示) , 点击“下一步”, 进入“选择数据源”界面, 在“数据源”类型中选择“Excel 5.0”, “文件名”选择表“dw” (如图4所示) 。然后点击“下一步”, 在“选择源表和视图”的界面中, 在“Sheet1$”的“源”前打“√”, 在“目的”中选择“[dz].[dbo].[d]” (如图5所示) , 最后点击“下一步”完成即可。

第五步, 打开SQL查询分析器, 找出表d和表y中不匹配的记录。首先打开dz数据库, 然后输入SQL语句:

“select * from d where not exists (select 1 from y where (d.dwsr=y.yhsr or d.dwzc=y.yhzc) )

select * from y where not exists (select 1 from d where (d.dwsr=y.yhsr or d.dwzc=y.yhzc) ) ”,

筛选出不同的记录 (如图6所示) 。

图6中显示的筛选结果就是本月的未达账项, 其中dwsr对应的数据表示“单位已收, 银行未收”, dwzc表示“单位已付, 银行未付”, yhsr表示“银行已收, 单位未收”, yhzc表示“银行已付, 单位未付”。

六、结束语

SQL作为一种数据库查询和程序设计语言, 具有超强的数据存储、查询、更新和管理的功能。在财务工作中, 利用SQL数据库进行银行对账, 可以摆脱繁重的手工对账过程, 极大地提高工作效率。

摘要:为了摆脱传统的手工对账, 本文通过对SQL数据库的研究, 找到了快速准确进行银行对账的方法, 使得财务工作效率大大提高。

关键词:银行,对账,SQL,表

参考文献

[1]黄维通.SQL Server2000简明教程[M].北京:清华大学出版社, 2002.

SQL实验四_SQL的数据更新 篇5

四、数据更新

1、实验目的熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、更新、删除操作。

2、实验内容

 在本实验中,主要内容是如何用SQL语句对数据进行更新。

 使用INSERT INTO语句插入数据,包括插入一个元组或将子查询的结果插入到数据库中两种方式。

 使用UPDATE语句可以修改指定表中满足WHERE子句条件的元组,有三种修改的方式:修改某一个元组的值;修改多个元组的值;带子查询地修改语句。

 使用DELETE语句删除数据:删除某一个元组的值;删除多个元组的值;带子查询地删除语句。

3、实验步骤

在数据库University_Mis上按下列要求进行数据更新。

(1)使用SQL语句向Students表中插入元组(Sno:S78;Sname:李迪;Semail:LD@zjut.edu.cn;Scredit:0;Ssex:男)。

(2)对每个课程,求学生的选课人数和学生的平均成绩,并把结果存入。

(3)在Students表中使用SQL语句将姓名为李迪的学生的学号改为S70。

(4)在Teachers表中使用SQL语句将所有教师的工资加500元。

(5)将姓名为刘华的学生的课程“数据库原理及其应用”的成绩加上6分。

(6)在Students表中使用SQL语句删除姓名为李迪的学生信息。

(7)删除所有选修课程JAVA的选修课记录。

SQL数据库 篇6

关键词:MS SQL Server 数据库恢复 备份 日志文件

中图分类号:G250.74 文献标识码:A 文章编号:1673-8454(2008)07-0083-02

一、问题的提出

数据库是高校校园网、电子商务网站、ERP系统等基于网络的大型信息化平台的基础,数据库服务器则掌握着交易记录、商业事务和账号数据等敏感数据以及战略上或专业的信息,一旦遭到攻击或毁坏,将会带来巨大的损失。

我们知道,事务是MS SQL Server的工作单元,MS SQL Server用事务(Transaction)来跟踪所有数据库的变化。一个事务包含一条或多条作为整体执行的T-SQL语句。[1] 而每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs),日志文件则用来记录事务对数据库所有的更新操作,它在数据库恢复技术中起着非常重要的作用。当数据库毁坏后,利用日志文件对已完成的事务进行重做处理,对故障发生时尚未完成的事务进行撤消处理,这样能够以较高的效率将数据库恢复到故障前某一时刻的正确状态,且能保证较高的安全性。然而目前,很多数据库服务器都是和WEB服务器隔离开的,管理员几乎很少查看数据库日志文件。

为了确保被毁坏数据库中大部分信息的恢复,我们必须重视数据库的管理与维护工作,定期进行数据库备份是防止系统发生故障最稳妥的方法。数据库的安全备份/恢复策略固然有多种,但MS SQL Server数据库系统一旦崩溃,其原先的备份数据是很难恢复的,因为MS SQL Server不像其他数据库可以直接拷贝数据文件,其恢复都是靠日志文件来完成,所以,日志文件丢失是一件非常危险的事情,很有可能导致数据库彻底毁坏。[2]

二、MS SQL Server的安全备份及恢复策略

下面,我们将以MS SQL Server为例,讨论利用日志文件进行数据库备份与恢复的技术要点。

1.利用无活动事务的日志备份数据库

正常方式下,我们要备份一个数据库,首先要先将该数据库从运行的数据服务器中断开,或者停掉整个数据库服务器,然后复制文件。

卸下数据库的命令:sp_detach_db 数据库名

连接数据库的命令:sp_attach_db或者sp_attach_ single_file_db

假设数据库为mydb,其数据文件为mydb_data.mdf,日志文件为mydb_log.ldf。

则备份、恢复该数据库的命令为:

卸下数据库:sp_detach_db ′mydb′

连接数据库:

sp_attach_db ′mydb′,′C:Program FilesMicrosoft SQL ServerMSSQLData mydb_data.mdf′,′C:Program Files Microsoft SQL ServerMSSQLData mydb_log.ldf′

sp_attach_single_file_db ′mydb′,′C:Program Files Microsoft SQL ServerMSSQLDatamydb_data.mdf'

2.利用包含活动事务的日志恢复数据库

由于种种原因,我们的系统中可能仅仅保留了备份的mdf文件,如果该mdf文件是当前数据库产生的,那么使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库。[3] 但如果数据库文件是从其他计算机上复制过来的,当含有活动事务的日志丢失时,上述方法也许就行不通了,我们会看到类似下面的错误信息:

“服务器:消息 1517,级别 16,状态 2,行 1

未能打开新数据库′mydb′;CREATE DATABASE将终止;设备激活错误;物理文件名′d:mydb_log.ldf′可能有误”。

对于这种情况,我们可采用如下方法:

(1)使用默认方式在SQL Server Enterprise Manager中建立一个供恢复使用的数据库(如mydb);

(2)停掉数据库服务器;

(3)将刚才生成的数据库的日志文件mydb_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件mydb_data.mdf;

(4)启动数据库服务器,此时会看到数据库mydb的状态为“置疑”,这时不能对此数据库进行任何操作;

(5)设置数据库,允许直接操作系统表。此操作可以在SQL Server Enterprise Manager中选择数据库服务器,即用鼠标右键选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中,也可以使用如下语句来实现:

use master

go

sp_configure ′allow updates′,1

go

reconfigure with override

go

(6)设置mydb为紧急修复模式:update sysdatabase set status=-32768 where dbid=DB_ID(′mydb′),此时可以在SQL Server Enterprise Manager中看到该数据库处于“只读置疑脱机紧急模式”,但仅仅能够看到数据库中的系统表;

(7)下面执行真正的恢复操作,重建数据库日志文件:

dbcc rebuild_log(′mydb′,′C:Program FilesMicrosoft SQL ServerMSSQLDatamydb_log.ldf′),

执行过程中如果遇到下列提示信息:

“服务器:消息2630,级别16,状态1,行1,未能排它地锁定数据库以执行该操作,DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系”,说明其它程序正在使用该数据库,如果刚才在第6步中使用SQL Server Enterprise Manager打开了mydb库的系统表,那么退出SQL Server Enterprise Manager就可以了。

(8)验证数据库一致性

dbcc checkdb(′mydb′)

一般执行结果如下:

“CHECKDB 发现了0个分配错误和0个一致性错误(在数据库 ′mydb′ 中);DBCC 执行完毕;如果 DBCC 输出了错误信息,请与系统管理员联系”;

(9)设置数据库为正常状态

sp_dboption ′mydb′,′dbo use only′,′false′

如果没有出错,那么现在就可以正常使用恢复后的数据库了;

(10)最后,将步骤5中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager中恢复,也可以使用如下语句完成:

sp_configure ′allow updates′,0

go

reconfigure with override

go

三、后记

利用日志文件恢复数据库的前提是系统中保留着数据库的备份,而很多用户难以养成定期手动备份的习惯,建议使用MS SQL Server的“自动备份数据库”功能,具体操作如下:

打开企业管理器,在控制台根目录中依次打开Microsoft SQL Server→SQL Server组,双击打开服务器;在工具菜单选择“数据库维护计划器”,点击“下一步”选择要进行自动备份的数据,继续点击“下一步”更新数据优化信息并检查数据完整性。再点击“下一步”指定数据库维护计划(默认的是1周备份一次),选择“每天备份”后点击“确定”。接着,可以在E盘新建一个目录(如:E:databak),选择“使用此目录”,并依据具体要求确定删除早于多少天前的备份(一般设定为4-7天)。最后,点击“下一步”指定事务日志备份计划,并维护计划的历史记录(这里最好用默认的选项)。系统此时很可能会提示“SQL Server Agent服务未启动”,需要完成计划设定并打开状态栏中的SQL绿色图标,在服务中选择SQL Server Agent,点击“运行”,选择“当启动OS时自动启动服务”。这时,数据库计划已经成功地运行了,它将按照上面的设置进行自动备份。

数据库在使用一段时间后,其日志也将日益庞大。对于新建的数据库,日志文件的大小一般应为数据库大小的30%,而日志的大小也取决于数据库修改的频繁程度,即依赖于用户如何操作数据库。[4] 我们可以为Server添加一个作业,让它定期运行,为数据库日志文件“减肥”。压缩日志的思想是删除非活动记录,从而减少日志文件所占用的物理空间。当压缩日志时,首先应将旧记录标记为非活动状态,然后将带有非活动标记的记录彻底删除。压缩工作应尽量选在系统不是非常繁忙的时段进行,否则有可能影响数据库性能。

参考文献:

[1]程云志等.数据库原理与SQL Server2005应用教程[M].北京:机械工业出版社,2006.

[2]王征,李家兴等. SQL Server2005实用教程[M].北京:清华大学出版社,2006.

[3]朱虹,史凌云,张勇.多级安全数据库系统推理问题研究[J].计算机工程与应用,2004(13):179-183.

SQL数据库查询效率的研究 篇7

数据库性能问题一直是决策者及技术人员共同关注的焦点,影响数据库性能的一个重要因素就是SQL查询语句的效率。SQL是结构化查询语言(Structured Query Language)的缩写,SQL语言的功能包括数据查询、数据操纵、数据定义和数据控制等部分,主要应用于关系数据库,实现了关系数据库中的数据检索。数据库一般是由多张表来实现存储,并通过多张表之间的连接关系建立完整有效的数据查询。作为数据查询语言SQL,提供了功能强大的数据表连接查询功能。那么如何将这些表高效地有机地联系起来,就成为设计关系数据库的一个重要指标。

2 多表连接的类型

在关系数据库应用中,由于需要经常对多个关联表进行操作,可以通过同时检索多个表来获取所需的数据。一般分为三种连接的模式:内连接(INNER JOIN),外连接(OUTER JOIN),交叉连接(CROSS JOIN)。语法的连接格式如下:

2.1 内连接(INNER JOIN)

内连接使用比较运算符进行表间某(些)列数据的比较操作,并列出与连接条件相匹配的数据行。根据所使用的比较方式的不同,内连接又分为等值连接、不等连接和自然连接三种。

等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,也包括重复列。

不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,查询结果不包括重复列。

2.2 外连接(OUTER JOIN)

内连接返回满足查询条件的数据,不满足的数据不会保留。而外连接则返回查询条件中一个表或视图的所有数据行。

外连接包括三种模式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全连接(FULL OUTER JOIN)。

左外连接:保留左表中的所有数据,如果左表与右表的某些数据不匹配,则在结果集中右表不匹配的数据列均为空值。

右外连接:同左外连接相反,右外连接保留右表中的所有数据,如果左表与右表的某些数据不匹配,则在结果集中左表不匹配的数据列为空值。

全连接:也称完整外连接,返回左表与右表中的所有数据行,如果左表与右表达某些数据不匹配,则在结果集中的对应列均为空值。

2.3 交叉连接(CROSS JOIN)

交叉连接不使用WHERE子句,返回涉及表的笛卡儿积。如查询表1及表2,表1有m行,表2有n行,查询结果集有m×n行。

3 多表连接的优化查询

联接查询操作的前提是笛卡儿积,从中找出符合条件的记录,所以我们在做优化时尽量避免联接查询。如果避免不了的联接操作要遵循以下2个原则从而达到优化时间和空间的目的。

给定三个关系模式:(以下实例均以此为例)

3.1 选择最有效率的表名顺序(只在基于规则的优化器中有效)

在进行多表连接查询时,解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表将被优先处理。因此在FROM子句中含多个表的情况下,须选择元组数最少的表作为基础表。例如s表有1000条数据,c表有10条数据。语句select*from s,c(选择c为基础表)比语句select*from c,s(选择s为基础表)更高效。

如果有3个以上的表连接查询,那就需要选择交叉表作为基础表,交叉表是指那个被其他表所引用的表。例如sc表的sno和cno列分别在s表和c表中出现,sc表是s表和c表的交叉表。因此SQL语句

将比下列语句更高效

3.2 注意WHERE子句中的连接顺序

SQL采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。如果需要查询成绩为90分以上的学生信息。

SQL语句1:SELECT*FROM S,SC WHERE SCORE>90 AND S.SNO=SC.SNO因为SQL自右向左进行执行,因此查询语句先将两张表按照学号进行连接,然后筛选出符合条件的记录,表的连接是基于表的笛卡尔运算,消耗的时间会随着记录个数的增加很快地增长,因此SQL语句1是低效语句。

SQL语句2:SELECT*FROM S,SC WHERE S.SNO=SC.SNO AND SCORE>90此连接查询语句克服了SQL语句的缺点,首先筛选出符合条件的记录,减少了进行联接的记录个数,然后再执行连接查询,大大提高了查询效率,是高效语句。

4 结论

本文介绍在数据库的开发和维护过程中,多表连接查询的优化设计可以提高系统性能,对于数据量大的数据库系统更为重要。本文介绍了的几种优化策略,在时间和空间上提高了系统的性能,在一定程度上提高了查询效率。

参考文献

[1]李丹.SQL Server2005数据库管理与开发实用教程[M].北京:机械工业出版社,2010.

数据库语言SQL标准演变分析 篇8

数据库语言SQL标准 (ISO/IEC 9075《信息技术数据库语言SQL》) 最初由国际标准化组织ISO制定 (ISO 9075) , 后由ISO/IEC JTC1/SC21 (开放系统互连 (OSI) 的信息捡索、传输和管理) 接管, 从1998年开始ISO/IEC JTC1/SC32 (数据管理和交换) 接管了该标准的制定工作。SC32负责“数据管理与交换”方面的标准制定工作, 下设四个工作组, 其中WG3负责制定“数据库语言SQL”标准。

2 SQL标准演变过程分析

自ISO于1987年正式发布第一版ISO 9075:1987《信息处理系统数据库语言SQL》以来, 数据库语言SQL正式发布过12个版本, 如图1所示, 目前最新版本为2008年发布的ISO/IEC 9075:2008《信息技术数据库语言SQL》, 包括九个部分, 之前发布的版本均已废止。

2.1 ISO 9075:1987

ISO于1987年发布了ISO 9075:1987《信息处理系统数据库语言SQL》, 该标准是自数据库技术于20世纪60年代中期以来正式发布的第一个关于数据库查询语言的国际标准, 该标准提供了定义和操纵表数据的基本语言。

2.2 ISO/IEC 9075:1989

1989年, SQL标准第二个正式发布的版本是ISO/IEC 9075:1989《信息处理系统数据库语言SQL完整性增强》。该标准在1987版的基础上做了少量更新, 增加参考完整性和完整性约束的相关规定。该标准于1992年11月19日废止。

2.3 ISO/IEC 9075:1992

1992年, ISO/IEC JTC1发布了ISO/IEC 9075:1992《信息技术数据库语言SQL》 (简称SQL92) 。该标准是SQL标准的第三个版本, 对前一版本进行了修订, 提供了新的模式操纵和数据管理机制, 以及大量的数据定义和数据操作增强内容。

2.4 ISO/IEC 9075-3:1995

SQL92发布后, SQL标准在制定时被拆分为多个部分。1995年, ISO/IEC 9075-3:1995《信息技术数据库语言SQL第3部分:调用层接口 (SQL/CLI) 》正式发布, 该标准依据SQL92制定, 作为ISO/IEC 9075系列标准的部分标准发布, 未替代SQL92, 这两项标准同时有效。该标准是ISO/IEC9075-3第一个正式发布的版本, 定义了应用程序中执行SQL语句时用到的结构和过程, 通过这种方式调用过程将独立于SQL语句的执行。

2.5 ISO/IEC 9075-4:1996

1996年, ISO/IEC 9075-4:1996《信息技术数据库语言SQL第4部分:持久存储模块》发布, 该标准未替代SQL92, 与SQL92、ISO/IEC 9075-3:1995同时有效。该标准是ISO/IEC 9075-4第一个正式发布的版本, 定义了存储过程的语法和语义。

2.6 ISO/IEC 9075:1999

1999年, ISO/IEC 9075:1999《信息技术数据库语言SQL》 (简称SQL99) 以系列标准的形式正式发布, 同时替代了SQL92、ISO/IEC 9075-3:1995和ISO/IEC 9075-4:1996。该版本的ISO/IEC 9075分为5个部分:

—第1部分:框架

—第2部分:基础

—第3部分:调用层接口

—第4部分:持久存储模块

—第5部分:宿主语言绑定

其中, 第5部分是新增加的内容, 提供了在编译单元中绑定SQL语句的语法, 直接调用SQL语句语法以及动态准备和执行SQL语句的语法等内容。

2.7 ISO/IEC 9075-10:2000

2000年, ISO/IEC 9075-10:2000《信息技术数据库语言SQL第10部分:对象语言绑定》发布。该标准是ISO/IEC 9075-10第一个正式发布的版本, 对数据库语言SQL进行了扩展, 以使其支持将SQL语句嵌入到Java程序中。

2.8 ISO/IEC 9075-9:2001

2001年, ISO/IEC 9075-9:2001《信息技术数据库语言SQL第9部分:外部数据管理》发布。该标准是ISO/IEC 9075-9第一个正式发布的版本, 对数据库语言SQL进行了扩展, 以使其支持通过外部数据封装和数据链管理外部数据。

2.9 ISO/IEC 9075-13:2002

2002年, ISO/IEC 9075-13:2002《信息技术数据库语言SQL第13部分:使用Java程序设计语言的SQL例程和类型》发布。该标准是ISO/IEC9075-13第一个正式发布的版本, 增加了使用Java程序设计语言的SQL例程和类型方面的内容。

2.10 ISO/IEC 9075:2003

2003年, 以系列标准的形式发布了ISO/IEC9075:2003《信息技术数据库语言SQL》 (简称SQL2003) , 同时废止了此前发布的ISO/IEC 9075系列标准所有部分。该版本的ISO/IEC 9075系列标准包括9个部分:

—第1部分:框架

—第2部分:基础

—第3部分:调用层接口

—第4部分:持久存储模块

—第9部分:外部数据管理

—第10部分:对象语言绑定

—第11部分:信息和定义模式

—第13部分:使用Java程序设计语言的SQL例程和类型

—第14部分:与XML有关的规范

其中, 第11和14部分为第一次正式发布, 增加了信息和定义模式以及XML方面的内容。

2.11 ISO/IEC 9075-14:2006

2006年, ISO/IEC 9075-14:2006《信息技术数据库语言SQL第14部分:与XML有关的规范》发布, 该标准针对ISO/IEC 9075-14:2003进行了修订, ISO/IEC 9075-14:2003同时废止。

2.12 ISO/IEC 9075:2008

2008年, ISO/IEC 9075:2008《信息技术数据库语言SQL》 (简称SQL2008) 发布, 此前发布的ISO/IEC 9075系列标准所有部分同时废止。ISO/IEC9075:2008是目前SQL标准的最新版本, 包括9个部分:

—第1部分:框架—第2部分:基础

—第3部分:调用层接口—第4部分:持久存储模块—第9部分:外部数据管理—第10部分:对象语言绑定—第11部分:信息和定义模式

—第13部分:使用Java程序设计语言的SQL例程和类型

—第14部分:与XML有关的规范

3 标准版本间差异分析

在SQL标准的12个版本中, SQL92、SQL99、SQL2003和SQL2008被公认为最具影响力的四个版本。

3.1 SQL92和SQL99差异

SQL92和SQL99在标准结构、分级方式和内容上存在较大差异。

●标准结构:SQL92是一个独立的标准, SQL99是由5个部分构成的系列标准。

●分级方式:SQL92将级别划分为入门级、中间级和完备级, 标准中规定的每个特性包含一个分级规则, 声明该特性如何满足入门级和中间级要求。SQL99将标准划分为核心级特性和核心级之外特性, 核心级为必须支持的特性, 每个特性的符合性规则中声明如何满足核心级要求。

●标准内容:两个版本间有14处存在差异的地方, 如SQL99增加了游标操作冲突提醒、98个保留字、强制语句后加分号、删除状态参数SQLCODE等内容。但是SQL99的核心级和SQL92的入门级还是非常接近。

3.2 SQL2003和SQL99差异

SQL2003和SQL99间差异主要表现在废止了原来的第5部分标准, 同时增加了4个部分标准。ISO/IEC 9075-2:2003和ISO/IEC 9075-2:1999间有17处差异, 包括2003版删除了1999版定义的BIT和BIT VARYING两个数据类型、增加了14个保留字等内容;ISO/IEC 9075-3:2003删除了ISO/IEC 9075-3:1999表28“实现信息的代码和数据类型”中的10项内容;ISO/IEC 9075-4:2003在<例程调用>的“可空性”定义等内容上有少量差异。SQL2003的核心集和SQL99的核心集变化不大。

3.3 SQL2008和SQL2003差异

SQL2008和SQL2003标准结构完全一致, 依旧保持9个部分的内容。在<搜索或循环子句>、<二进制串字值>的声明类型、<非保留字>EXCEPTION等内容上进行修订, 同时增加了10个保留字。SQL2008的核心集和SQL2003的核心集变化不大。

4 结语

基于SQL的数据库性能优化分析 篇9

随着计算机技术和网络技术的普及与广泛应用, 数据库技术也得到了长足发展, 并成为现代计算机信息与应用系统的核心基础技术。Oracle数据库是目前使用较为广泛的数据库系统, 用户规模和应用范围不断扩展, 由此带来的系统性能问题愈来愈突出, 因此, 对数据库优化技术方法的探索, 对解决系统瓶颈, 节约系统开销, 确保数据库和业务系统稳定、高效地运行, 有着至关重要的意义。

数据库的优化, 主要从硬件、操作系统、数据库参数和应用程序等方面进行配置和调整。据统计, 对硬件系统和数据库参数进行优化所获得的性能提升, 只占数据库系统性能提升的40%左右, 另外的60%系统性能提升来自于对应用程序的优化。其中, 应用程序的优化通常可分为两个方面:源代码和SQL语句。一方面, 由于涉及对程序逻辑的改变, 源代码的优化在时间成本和风险上代价很高, 而对数据库系统性能的提升收效有限;另一方面, 应用程序对数据库的操作, 最终体现在SQL语句对数据库的操作, 因此SQL语句的执行效率决定了数据库的性能。由此可见, 应用程序的优化应着重于SQL语句的优化。在数据库应用系统中, 相同功能的程序可以采用不同的SQL语句编写实现, 而不同的SQL语句存在着性能及效率上的差异, 这种差异在大型数据库环境中表现得尤为明显。因此, 通过优化调整SQL语句, 从而显著改善整个系统的性能, 对提高数据库内存区的命中率、减少I/O访问、减少对网络资源的占用等有着重要意义。

1 SQL优化技术分析及实现方法

要对SQL语句进行优化, 首先应该清楚SQL语句的执行过程。Oracle会为每个用户进程分配一个服务器进程, 当服务器进程接收到用户进程提交的SQL语句时, 服务器进程会对SQL语句进行语法和词法分析。检查通过后, 服务器进程会将SQL语句转变为ASCII码, 并通过一个Hash函数将ASCII码生成Hash值, 服务器进程会到系统全局区 (System Global Area, SGA) 的共享池 (Shared Pool) 中查询此Hash值是否存在。如果存在, 服务器进程会在共享池中读取已经解析好的语句来执行, 这就是软解析;如果不存在, 则需要通过优化器生成执行计划和生成执行编码, 这就是硬解析, 硬解析完成后, Oracle会将SQL语句本身代码、Hash值、执行计划和所有与此语句相关的统计数据放到共享池中。

根据以上所述的SQL语句执行过程, 分析优化SQL语句, 应主要从以下几个方面来进行:

(1) 共享SQL语句。

(2) 高质量的SQL语句。

(3) 使用索引。

1.1 共享SQL语句

为了不重复解析相同的SQL语句, 在第一次解析之后, Oracle将SQL语句存放在内存中。这块位于系统全局区域的共享池中的内存可以被所有的数据库用户共享。如果用户提交的SQL语句和之前的执行过的语句完全相同, Oracle就能很快获得已经被解析的语句以及最好的执行路径, 从而大大地提高了SQL的执行性能并节省了内存的使用。要共享SQL语句, 必须满足以下3个条件:

(1) 当前被执行的语句和共享池中的语句必须完全相同。

(2) 两个语句所指的对象必须完全相同。

(3) 两个SQL语句中必须使用相同名字的绑定变量 (bindvariables) 。

1.2 高质量的SQL语句

对于海量数据, 质量高的SQL语句和质量差的SQL语句的执行时间可能相差几百秒, 可见对于应用系统来说, 编写高质量的SQL语句将显著提高系统的速度和可用性。

1.2.1 使用DECODE函数来减少处理时间

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表, 例如:

使用DECODE函数, 可以高效地得到相同结果:

类似的, DECODE函数也可以运用于GROUP BY和ORDER BY子句中。

1.2.2 用TRUNCATE替代DELETE

当删除表中的记录时, 在通常情况下, 回滚段 (rollback segments) 用来存放可以被恢复的信息。如果用户没有提交事务, Oracle会将数据恢复到删除之前的状态 (准确地说是恢复到执行删除命令之前的状况) , 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息。当命令运行后, 数据不能被恢复, 因此只有很少的资源被调用, 执行时间也会很短。

1.2.3 多使用COMMIT

在程序中应尽量多使用COMMIT, 这样程序的性能会得到提高, 需求也会因为COMMIT所释放的资源而减少。COMMIT可以释放的资源包括:回滚段上用于恢复数据的信息, 被程序语句获得的锁, redo log buffer中的空间, 以及Oracle管理上述3种资源的内部花费。

1.2.4 用EXISTS替代IN, 用NOT EXISTS替代NOT IN

在许多基于基础表的查询中, 为了满足一个条件, 往往需要对另一个表进行联接。在这种情况下, 使用EXISTS (或NOT EXISTS) 通常将提高查询的效率。例如:

在大数据量时, 这个操作非常明显。相对来说, 用NOT EXISTS替换NOT IN将更显著地提高效率。

1.2.5 用EXISTS替换DISTINCT

当提交一个包含一对多表信息 (比如部门表和员工表) 的查询时, 避免在SELECT子句中使用DISTINCT。一般可以考虑用EXIST替换。例如:

EXISTS使查询更为迅速, 因为RDBMS核心模块将在子查询的条件一旦满足后, 立刻返回结果。

1.2.6 避免耗费资源的操作

带有DISTINCT, UNION, MINUS, INTERSECT, ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序 (SORT) 功能。DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序。

例如, 一个UNION查询, 其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序 (NESTED SORT) ;这样, 每个查询需要执行一次排序, 然后在执行UNION时, 又一个唯一排序 (SORT UNIQUE) 操作被执行, 而且它只能在前面的嵌入排序结束后才能开始执行, 嵌入的排序的深度会大大影响查询的效率。

1.2.7 联合查询中, 注意选取连接顺序

查询工作所包含表的数量在5个以上时, 执行的连接效果会受到From语句中体现出来的次序影响。因为会选择不同的优化处理器, 选择的基础表也会不同。如果采用的是CBO, SQL语句就会被优化器检查每一个物理大小的表, 索引的工作状态, 执行路径最终要选取最低消费。假如选择的是RBO, 全部的索引都要对应连接的条件, 这时候那个位于From语句中的表应该就是基础表, 因为解析器处理表名的顺序是从左至右。

1.3 使用索引

1.3.1 用索引提高效率

索引是表的一个概念部分, 用来提高检索数据的效率。实际上, Oracle使用了一个复杂的自平衡B-tree结构。通常, 通过索引查询数据比全表扫描要快。当Oracle找出执行查询和Update语句的最佳路径时, Oracle优化器将使用索引。同样在联结多个表时使用索引也可以提高效率。另一个使用索引的好处是, 它提供了主键 (primary key) 的唯一性验证。

除了那些LONG或LONG RAW数据类型, 可以索引几乎所有的列。通常, 在大型表中使用索引特别有效。当然, 在扫描小表时, 使用索引同样能提高效率。

虽然使用索引能得到查询效率的提高, 但是也必须注意到它的代价。索引需要空间来存储, 也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改。这意味着每条记录的INSERT, DELETE, UPDATE将为此多付出4~5次的磁盘I/O。因为索引需要额外的存储空间和处理, 那些不必要的索引反而会使查询反应时间变慢。这就涉及用户所使用的系统是OLTP还是OLAP类型的, 以此决定索引的建立。

1.3.2 避免在索引列上使用计算

当数据量很大时, 在SQL语句中使用索引可将SQL语句的执行速度加快许多, 但是不正确的SQL语句可能会使索引失效, 所以必须注意一些限制索引使用的操作, 例如:

WHERE子句中, 如果索引列是函数的一部分, 优化器将不使用索引而使用全表扫描, 从而引起索引失效, 所以应该尽量把此类操作移至比较符号的右边。

1.3.3 避免潜在的数据类型转换

当字符型数据与数值型数据比较时, Oracle就会自动将字符型用TO_NUM-BER () 函数进行转换, 这样就导致了全表扫描。

———SALARY字段为NUMBER型, 却与字符型比较, 导致索引失效

1.3.4 避免在索引列上使用IS NULL和IS NOT NULL

避免在索引中使用任何可以为空的列, Oracle将无法使用该索引。对于单列索引, 如果列包含空值, 索引中将不存在此记录。对于复合索引, 如果每个列都为空, 索引中同样不存在此记录。如果至少有一个列不为空, 则记录存在于索引中。例如:

2 小结

对大型数据库而言, 数据海量增长, 使得数据库的优化调整成为一个重要问题。良好的系统架构设计、合理的资源配置和开发过程中高效SQL语句编写, 是提高数据库性能的关键因素。在应用系统开发设计中, 通过对SQL的优化调整, 可以显著地改善整个数据库系统的性能, 降低系统响应时间, 提高应用系统的运行效率, 从而使Oracle数据库获得最优的性能。

摘要:数据库性能调整与优化, 对于提高数据库的稳定性、可靠性, 保障业务高效运行有着重要意义。本文从数据库性能优化角度出发, 探讨程序开发过程中, Oracle数据库的SQL语句调整和优化技术。

关键词:SQL,数据库,性能优化

参考文献

[1]黄河.Oracle9i for Windows NT/2000数据库系统培训教程[M].北京:清华大学出版社, 2003:275-292.

[2]谢东.基于Oracle的数据库安全策略[J].现代情报, 2006, 26 (1) :119-120.

SQL数据库 篇10

1 对SQL语句进行优化的好处

面对传统的数据库应用模式下查询作业效率低且信息资源消耗大的情况, 如何在保证SQL数据库服务的质量的同时, 通过采取一定的技术手段与相关措施, 减少在原来的数据库应用模式下进行查询作业时对巨量信息资源的消耗, 进而提升数据库应用系统的运行效率, 使终端使用用户的查询工作更快捷, 已成为计算机应用系统发展进程中亟需解决的问题, 而对SQL语句进行优化就是解决这一问题的有效方法。这是因为, 对于很多以数据库为基础的应用程序来说, 大部分都是B/S或者C/S架构, 通过客户端嵌入的SQL语句或者调用数据库上的过程来实现与数据库的联系。因此SQL语句的质量如何会对整个系统造成很大的影响, 所以对SQL语句进行优化有这几个方面的好处:一是减少系统对硬件资源的消耗, 节约投资成本;二是提升系统运行的效率, 降低数据库死锁的风险;三是加强系统源代码的可读性, 减轻技术员对程序进行修改的劳动强度。

2 SQL语句优化的原理

从理论的方面来说, 结构化查询语言 (Structured Query Language) 简称SQL, 是一种数据库查询和程序设计语言, 用来对数据进行存取、查询并对关系数据库系统进行更新和管理, 在本质上它是一种负责连接数据服务器和客户终端的工具, 用户可以在SQL数据库中经过高层数据结构的支持进行连续性的加工作业。另外, 用户在利用SQL数据库进行数据处理时不需要对数据的存放方式进行明确的指定, 因此在底层数据结果完全不一样的的数据库系统当中, 有关的技术人员可以利用一样的SQL语言承担起数据输入和管理的端口。尤其要强调的是:在SQL数据库应用系统中, 不管是什么类型的SQL语句都可以利用接收集合实现输入, 利用返回集合实现输出。我们可以利用SQL数据库应用系统的这个特点将随便一条SQL的输入动作当作是另一条SQL语言的输出动作。

关于SQL语句的优化, 从计算机应用系统和与其相关的计算机技术的角度来说, 我们可以这样理解SQL语句的优化:通过一些相关的技术手段和处理方法, 把原来的SQL语句转化成语句语意都和原来一样并且在数据处理上效率更高的新型的SQL语句。通常认为, SQL语句的优化原理就是最大限度的减少终端用户在利用数据库应用系统进行查询工作时的各表参与加工的数据量, 从而更好的对时间和空间进行优化, 具体的说, 优化查询的最终目的就是帮助终端用户在最短的系统反应时间之内更快更好的找到与给定表达式相等价的数据。大量的实践和研究显示了一条规律:一个对数据的查询在SQL数据库处理正常运行的状态下会有两种或者更多种的实现方法, SQL语句对一切工作进行优化的关键就是找到一个等价于查询目标并且操作时间更短的语句表达式。

3 优化SQL语句的方法

关于优化SQL语句提高数据库效率的方法, 本文从SQL语句优化中的视图优化、SQL语句优化中的语句优化、SQL语句优化中的索引优化这三个方面进行具体的阐述

3.1 SQL语句优化中的视图优化

在SQL数据库中, 视图是其中一大关键对象, 它从本质上来说是一种数据表虚拟化的表现形式。通常情况下, SQL数据库下的视图分为三种形式, 即分区视图、标准视图和索引视图。其中分区视图对于分布式数据表查询效率的提高有着重要的作用, 在对整个SQL数据库的效率进行提高的过程中应该格外注重这一点, 可以在预先各个区域的服务器成寻中存储代表其区域仓库信息的Warehouse表, 从而促使此区域的查询业务不会受到外部区域服务器的信号影响, 并且有效的提升此区域仓库信息的查询效率。尤其要强调的是, 随着现阶段数据库处理系统逐步向多元化、集成化发展的情况下, 终端用户在对一些数据库进行信息查询时, 通常需要对包括此区域仓库信息在内的两个或者多个仓库信息进行访问, 因此在把仓库划分为多个区域的作业过程中, 要对各个仓库区域的ID信息进行差异性的定义, 帮助用户在查询分区的时候可以根据ID进行判定, 从而达到高效整合的动态合并查询的目的。

3.2 SQL语句优化中的语句优化

在对整个SQL数据库的性能进行优化作业的过程中, 语句优化是其中最关键、最核心的部分。通常来说, SQL语句优化可以分为两个方面, 即模糊查询技术的优化和子查询展开技术的优化。本文从对子查询展开技术的优化作业来对语句优化进行详细的分析, 从实质上来说, SQL数据库应用系统中的子查询展开技术就是通过吧子查询信号转变成链接从而对查询作业进行优化的技术。以某省查询各市企业资产总额由资产超过一千万的企业名称查询SQL数据库的查询作业为例子, 通常来说, 在原来的SQL数据库子查询展开技术的运用当中, 有关的技术工人人员一般采用:Select企业名From企业Where企业代号In (Select企业代号From企业Where资产>一千万) 的方式进行查询。很明显, 在利用这种查询方式进行查询的时候, 数据库查询会对每个市的每行数据中满足子查询要求的企业记录进行地毯搜索式的查询, 虽然查询的结果会很准确, 但是查询的效率却很低。而如果对SQL语句进行优化, 可以提前把企业表设置成SQL数据库查询作业中的链接内表, 在具体的查询过程中应该对语句进行分组从而首先对企业表进行企业代号的查询和删选工作, 进而可以最大限度的在对所有满足条件的企业进行查询之前消除多余的不必要的企业代号, 大大提高数据库的效率, 缩短查询作业的时间。具体的说, 经过语句优化之后, SQL数据库的查询语句是:Select D.企业名From (Select代号From企业Where资产>一千万Group by企业代号) E, 企业D Where E.企业代号=D.企业代号。

3.3 SQL语句优化中的索引优化

我们需要认识到的是:在现阶段的SQL数据库应用系统的作业过程中, 索引是最为常用的一种数据库操作对象。可以这样讲, 索引设置和使用的情况对于整个SQL数据库应用处理系统甚至是数据库整体性能的发挥都有着直接的影响。通常来说, 相关的技术工作人员在查询一些还没有建立索引的数据表时, 执行的大多数是全表的查询作业。更具体的说, 这种全表查询作业就是在对磁盘上的数据表的全部数据页进行读取的基础上, 对读取到的数据经过一定的整理、分析和加工, 进而实现对数据信息的获取处理。很明显, 如果在进行全表查询作业时, 其要读取的数据表具有大批量、大规模的数据量, 那么在SQL数据库数据处理的过程中需要消耗巨大的信息资源, 因此, 对SQL语句中的索引进行优化对于提高数据库的效率有着非常重要的意义。通常来说, 索引分为簇索引、非簇索引以及复合索引这三种实现的方式, 其中使用最为广泛的索引方式是簇索引。本文就以簇索引作为切入点对于SQL数据库的索引优化进行详细的说明。具体的说, 簇索引索引方式就是通过对磁盘上的各种实际数据进行一定的组合和整理, 从而使其可以按照制定的列值进行排列的过程。根据研究发现, 按照物理表现方式的不同将磁盘上的这些数据进行新一轮的排列组合之后, 系统在进行查询作业的时候, 如果搜索到符合搜索条件的第一条记录之后, 就不需要再对该列的其他数据进行充分的查询, 从而使查询范围大大的缩小, 提升了索引方式下SQL数据库的查询的效率。

4 结束语

随着社会经济的快速发展和现代科学技术的不断更新, 人民在物质文化和精神文化方面的需求也在持续的提高, 这对现代的计算机网络应用系统以及与之相关的软件技术提出了更高的要求。在繁荣发展的社会主义市场经济下, SQL数据库是计算机网络技术应用行业发展的必然趋势, 其运行的性能和效率将对整个数据库应用系统运行的安全性与稳定性产生直接的影响与决定性的作用。优化SQL语句可以在保证SQL数据库服务的质量的同时, 节约在传统数据库应用模式下进行查询作业消耗的巨量的信息资源, 提升数据库应用系统的运行效率, 使终端使用用户的查询工作更快捷, 从而加快计算机应用系统及其相关技术的发展。

参考文献

[1]王爱军, 刘风华, 张萌萌.基于数据库查询过程优化设计闭[J].电子科技大学学报, 2009 (10) .

[2]韩朝军, 梁冰, 刘莹.SQL Server管理与开发技术大全[M].北京:人民邮电出版社, 2009 (13) .

[3]李克洪, 王大玲.实用密码学与计算机数据安全[M].沈阳:东北大学社出版, 2011 (22) .

SQL数据库 篇11

【关键词】 依赖关系 引用实体

SQL 依赖关系是在 SQL 表达式中使用的按名称引用,可使一个实体依赖于另一个实体。在其定义中引用了另一个实体并且该定义存储在系统目录中的实体称为“引用实体”。被另一个实体引用的实体称为“被引用的实体”。数据库引擎跟踪两种类型的依赖关系。

·绑定到架构的依赖关系

绑定到架构的依赖关系是一种两个实体之间的关系,只要引用实体存在,这种关系就可以防止被引用的实体被删除或更改。绑定到架构的依赖关系是在使用 WITH SCHEMABINDING 子句创建视图或用户定义函数时创建的。绑定到架构的依赖关系也可以于表在 CHECK 或 DEFAULT 约束或计算列定义中引用另一个实体(例如 Transact-SQL 用户定义函数、用户定义类型或 XML 架构集合)时创建。使用由两部分chema_name.object_name) 组成的名称指定对象不能称为绑定到架构的引用。

·非绑定到架构的依赖关系

非绑定到架构的依赖关系也是一种两个实体之间的关系,但这种关系并不防止被引用的实体被删除或修改。

图中包含两个实体:过程 X 和过程 Y。过程 X 包含一个对过程 Y 按名称引用的 SQL 表达式。过程 X 称为“引用实体”,而过程 Y 称为“被引用的实体”。由于过程 X 依赖于过程 Y,因此当过程 Y 不存在时,过程 X 将失败,并出现运行时错误。但是,当过程 X 不存在时,过程 Y 也不会失败。

仅当表在计算列定义、CHECK 约束或 DEFAULT 约束中引用 Transact-SQL 模块、用户定义类型或 XML 架构集合时,才会将该表作为引用实体进行跟踪。整数值大于 1 的带编号的存储过程将不会作为引用实体或被引用的实体进行跟踪。数据库引擎将在创建、更改或删除引用实体时自动跟踪依赖关系信息,并将此信息记录在 SQL Server 系统目录中。例如,如果您创建了一个引用表的触发器,则这些实体间的依赖关系将被记录下来。如果您随后删除了该触发器,依赖关系信息将从系统目录中删除。

SQL Server 早期版本中的依赖关系按 ID 跟踪,与之不同的是,当前版本中的依赖关系按名称跟踪。也就是说,即使引用实体创建时被引用的实体并不存在,数据库引擎仍可跟踪两个实体间的依赖关系信息。之所以会发生这种情况,是因为存在延迟名称解析。例如,即使数据库中并不存在存储过程所引用的表,也可以成功创建该存储过程,但是该存储过程不能执行。数据库引擎记录此过程和表之间的依赖关系,但是,因为对象尚未存在,所以无法记录表 ID。如果随后创建了该表,则表 ID 将随其他依赖关系信息返回。当被引用的实体按名称显示在引用实体的持久化 SQL 表达式中时,依赖关系信息将会被跟踪。采用以下方式按名称引用实体时,将会获得依赖关系信息:

·通过在 Transact-SQL模块定义中使用下列任一语句:

·数据操作语言 (DML) 语句(SELECT、INSERT、UPDATE、DELETE 或 MERGE)

·EXECUTE

·DECLARE

·SET(当 SET 与用户定义函数或用户定义类型一起使用时。例如:(DECLARE @var int; SET @var = dbo.udf1。)

不会跟踪使用数据定义语言 (DDL) 语句(如 CREATE、ALTER 或 DROP)在 Transact-SQL 模块定义中引用的实体。

·通过使用 CREATE、ALTER 或 DROP TABLE 語句,条件是这些语句不在 Transact-SQL 模块中并且被引用的实体为在计算列、CHECK 约束或 DEFAULT 约束中定义的 Transact-SQL 用户定义函数、用户定义类型或 XML 架构集合时。

当某个实体通过使用由三部分组成的有效名称引用另一个实体时,将创建跨数据库的依赖关系。当某个实体通过使用由四部分组成的有效名称引用另一个实体时,将创建跨服务器的引用。仅当显式指定服务器和数据库的名称时,才会记录相应的名称。例如,当指定为 MyServer.MyDB.MySchema.MyTable 时,会记录服务器和数据库的名称,但是,当指定为 MyServer..MySchema.MyTable 时,将只记录服务器的名称。有关有效的多部分名称的详细信息,请参阅 Transact-SQL 语法约定 (Transact-SQL)。存在下列限制:不跟踪 OPENROWSET、OPENQUERY 和 OPENDATASOURCE 语句的跨服务器依赖关系。不跟踪语句 EXEC (' ') AT linked_server 的依赖关系。

参考文献:

[1] 《数据库技术》 清华大学出版社.

SQL数据库 篇12

关键词:Oracle数据库,SQL优化

一、对SQL进行优化的必要性

数据库系统作为数据管理的主要组成部分主要作用是存储供相关人员查阅大量信息, 实现网络资源共享。查询操作在数据库系统的各种操作中居于首位, 直接关系到数据库系统的运行状态。假如数据查询操作量过大, 会给系统带来很大的负担, 系统反应速度变慢, 严重者可能就会引起系统瘫痪。因此, 为了保证数据库系统的高效正常运行, 必须对SQL语句进行优化[1]。

二、SQL优化的目标

往往由于SQL的结构设计的问题, 很可能使得正常运行的一个数据库系统出现性能问题。所以必须对SQL语句进行必要的调整, 达到有效提升数据库系统性能的目的。对SQL结构的优化本质就是简化繁琐的数据结构, 常规方法一般就是对SQL语法进行一些调整, 基本方法是把程序中繁琐的SQL语句结构简化, 保持服务器的搜索数据能力处于最佳运行状态, 有效降低程序中表扫描的时间, 促使所以功能得以充分发挥, 尽量使服务器的处理器时间和输入输出时间保持平衡。在优化过程中, 要学会挑选SQL语句那些能有效提升性能、消耗系统资源多, 或使用频率较多语句进行优化。

三、SQL优化策略

内存、CPU、I/O次数是影响SQL查询的主要因素。因此对SQL进行优化就是减少内存的占用时间, 降低CPU的计算频率, 缩减I/O总次数。

3.1建立索引。索引是在SQL查询优化中非常重要的的一部分, 对SQL优化起到有效引导作用。在索引的引导下能够有效提升查询运算速度, 有效减少用户表的搜索次数。有时, 索引和用户表常常会发生冲突, 所以索引和用户表不要建立在同一磁盘上建。在索引的使用过程中, 应必须注意。

3.2使用‘*’。由于在对Oracle进行解析的时候, ‘*’会和用户表中行名称进行相应的转换, 这个转换过程十分繁琐涉及到许多方面, 由于信息量大, 所以会消耗很多的处理器时间、需要查询Oracle数据库中的所有数据、效率低下。所以在Select语句中, 应该做到尽量不去使用‘*’。

3.3COMMIT的使用。在Oracle数据库中, BBL语句能够实现对数据进行自动提交, 所以在运行编写数据库程序时, 缓存中往往会有一定量的垃圾数据没被及时处理, 为了能够及时清除系统缓存中的垃圾信息, 有效节约利用系统资源, 提升系统的性能。应该利用COMAD来完成对数据的提交工作。尤其是程序遇到较为复杂的操作时, 如dflate、uedcte等。

3.4链接顺序。在查询语句的程序设计中, 有时会面对几个表格同时进行处理的事件, 这时候, 就应该去选择那些被其他表曾经引用过的表也就是交叉表。在PREM语句中, 表的链接的能力和表的顺序存在一定的关系, 通常来说, Oracle对这些表是遵循从右到左的顺序进行解析处理的。并且, 优化器不同对表的处理选择的方式也不同。比如BEO, 如果全部的链接都有与之相关联的索引时, PREM子语句中最后的表就是基础表。若是LEO, 优化程序就会对表的物理大小和索引状态展开检测, 最后选择耗时较少的一种。

3.5WHTXT子句的顺序。当Oracle解析系统对WTXT语句展开解析运算的时候, 一般运用自下而上的顺序进行。所以, 索引序列往往就会出现在最前边, 过滤掉大量记录的条件一般在WHTXT语句的最后。

3.6EXISTS的使用。在查询的时候, 常常把多个基础表链接成另一个表。OUT子查询中的表需要通过Oracle进行全表扫描。会降低查询效率, 这时候用BXIETE, 往往能够提高查询效率。

四、结束语

随着人们对网络上的一些信息的需求量不断增长, 必须对数据库系统也要相应地进行扩容与改善, 数据库系统的性能直接影响着它的的运行状态和工作效率。此情况下, 对数据库系统进行必要的的优化工作就显得尤为重要。因此, 必须做好系统的优化工作。

参考文献

上一篇:霍尔效应实验教学下一篇:适任评估