避免阻塞:让数据库性能有保障

虽然说SQL Server数据库本身提供了很好的锁管理机制。但是,从某一方面来说,其实数据库只是一些客户端应用程序的“傀儡”。这主要是因为客户端应用程序对服务器上获取的锁几乎有完全的控制能力。客户端应用程序发出的查询请求以及对结果的处理方式,往往具有直接的控制能力。所以,如果应用程序在设计上稍有不合理的情况时,就会因为锁机制而导致阻塞。

如当遇到如下几种情形时,就可能会导致阻塞情况的发生。

一、客户端取消查询后没有回滚实务。

查询是大部分应用程序经常发生的作业。但是,用户通过前台客户端应用程序查询后台数据库时,有时候往往会因为各种原因取消查询。如用户打开查询窗口后,因为死机或者用户觉得反映速度慢强制取消查询。但是,当客户端取消查询时,若没有加上回滚事务的语句,则此时,因为用户已经向服务器发送了查询请求,所以,后台数据库中所涉及的表,都已经加L上了锁。故即使用户取消查询后,所有在事务内获取的锁都将会保留。此时,若其他用户也需要查询这些表或者用户重新打开查询窗口想通过输入查询条件来提高系统响应速度时,就会发生阻塞的现象。

二、客户端没有及时取得所有查询的结果。

通常情况下,用户将查询请求发送到服务器之后,前台应用程序必须立即完成提取所有结果行。如果应用程序没有提取所有结果行的话,就会产生一个问题。因为只要应用程序没有及时提取所有结果,锁可能会留在表上而阻塞其他用户。既然应用程序已经将SQ语句递交给服务器,则该应用程序就必须提取所有的结果行。若应用程序不遵循这个原则的话(如因为一时疏漏而没有配置),就无法从根本上解决阻塞问题。

三、查询执行时间过长。

有些查询会耗用比较长的时间。如因为查询语句设计不合理或者查询设计到的表与记录比较多时,都会使得查询的执行时间加长。如有时候用户需要对纪录进行Update或者Delete操作时,如果涉及的行比较多时,就会获取很多的锁。这些锁无论是否最终升级到表锁,都会阻塞其他查询。

故通常情况下,不要将长时间运行的决策支持查询和联机事务处理查询混在一起。

当数据库遇到阻塞时,往往需要检查应用程序递交的SQL语句本身,以及检查与连接管理、所有结果行的处理等有关的应用程序行为。通常情况下,为了避免因锁冲突所导致的阻塞,笔者有如下建议。

建议一:查询完成后提取所有的结果行。

有些应用程序为了提高用户查询的响应速度,会有选择的提取所需要的记录。这个“小聪明”看起来很合理,但是,却会造成更大的浪费。因为查询结果没有及时提取的话,锁就不能释放。当其他人查询数据时,就会发生阻塞。

所以,笔者建议在应用程序设计时,对于数据库中查询的记录要及时的提取。可以通过其他方式,如添加查询条件、或者后台查询的方式,来提高查询的效率。同时,在应用程序层面设置合理的缓存,也可以非常明显的提高查询效率。

建议二:在事务执行时不要让用户输入内容。

虽然在事务执性的过程中,可以让用户参与进来,以提高互动性。但是,我们数据库管理员往往不建议这么做。因为若要用户在事务执行过程中输入参数,会延长事务的执行时间。虽然人比较聪明,但是其反应速度仍然没有电脑那么快。所以,在执行过程中加入让用户参与的过程,会延长事务的等待时间。故除非有特殊的需要,不要在应用程序的执行过程中,提醒用户输入参数。一些事务执行必须的参数,最好在事先就提供。如可以通过变量等预先把需要的参数传入进去。

建议三:使事务尽可能的简短。

笔者认为,数据库管理员应该把一些问题简单化。当某个需求需要很多SQL语句才能够完成时,不妨把任务进行分解。同时,也把事务分解成一些简短的事务。

如数据库中一张产品信息表,其记录数量有二百万条。现在处于管理的需要,把一次性更改其中的一百五十万条记录时。若通过一个事务进行更改,则其时间会比较长。若其中还牵涉到级联更新的话,则时间会更长。

针对这种情况,我们就可以学着把事务简短话。如这个产品信息中,可能有产品类型字段。那么在更新数据时,我们能否不一次性进行更新。而是通过产品类别字段进行控制,对记录进行分次更新的。如此每个类别的更新事务所耗用的时间就可能会大大缩短。如此虽然操作的时候,会需要多个步骤。但是,往往可以有效避免阻塞情况的发生,提高数据库的性能。

时间: 2024-09-29 03:37:07

避免阻塞:让数据库性能有保障的相关文章

历年双11实战经历者:我们是如何做数据库性能优化及运维-CloudDBA和天象

8月24日阿里云数据库技术峰会上,阿里云高级DBA专家玄惭带来面对超大规模的数据库集群,尤其是在每年像双11这样重大促销活动中,阿里云是如何进行运维和优化的.本文主要介绍了天象和CloudDBA两个产品,包括他们的起源.基于系统画像仓库的应用.产品化等,最后对RDS产品的可诊断性建设和可运维性建设作了补充.   随着云数据库时代的到来,它的运维体系不仅仅包括保持数据库集群的稳定,同时我们还要关注用户体验.在业务上,体量大,用户各类,例如有公有云小客户,也有企业大客户,每类客户的需求都各式不一,众

15年老司机的DPM数据库性能分析产品研发之路

本文根据DBAplus社群第87期线上分享整理而成.   讲师介绍  邹德裕 轻维软件首席专家   DBAplus社群联合发起人,OraZ产品作者.Oracle OCM. 15年运维管理经验,在数据库诊断.故障排除.优化.架构设计等方面具有丰富的经验.   主题简介: 1.运维中常见的场景及对应解决案例 2.解密DPM数据库性能分析平台   本次我给大家带来的主题分享为<15年老司机的DPM数据库性能分析产品研发之路>.   我将通过Oracle在实际生产中常见的运维场景及问题处理案例,解析如

5. SQL Server数据库性能监控 - 当前请求

原文:5. SQL Server数据库性能监控 - 当前请求 对于在线运行的系统,当前数据库性能监控,通常监视以下几点: (1) 是否有阻塞 (Blocking); (2) 是否有等待 (Waiting),阻塞就是锁 (Lock) 等待; (3) 是否运行时间过长(Long running): (4) 是否有死锁 (Deadlock): sys.dm_exec_query_stats之类,等一些统计性的信息,通常不作为实时告警内容,而是在性能优化时,作为参考.   一. 阻塞/等待/长时间运行

连接模式,提高数据库性能的捷径

一.共享服务器模式. 共享服务器模式,也叫做多线程服务器模式.在这种模式下,Oracle数据库允许多个用户进程共享非常少的服务器进程.所以,可以同时实现用户并发访问的人数也就大大的增加.如果使用专用服务器模式,则每个用户连接数据库时,每个用户进程需要他自己的专用服务器进程.也就是说,客户端进程与服务器端进程是一一对应的. 而如果采用共享服务器模式的话,则多个用户可以共用一个服务器进程,也就是说,此时客户端进程与服务器进程是多对一的情况.这主要是通过调度程序来实现的.调度程序将多个加入数据库访问会

oracle数据库性能调优技术:深入理解单表执行计划

一.概述 这篇文章是数据库性能调优技术的第二篇.上一篇讲解的索引调优是数据库性能调优技术的基础.这篇讲解的深入理解单表执行计划,是数据库性能调优的有力工具. 查询语句可以有多种可选执行计划,如何选择效率最高的执行计划?达梦数据库.oracle数据库.sql server数据库都是采用基于成本的查询优化,对备选执行计划进行打分,选择大家最小的执行计划进行执行.这些内容,我会在后续的几篇文章中进行详细的描述.在此之前,我们首先需要掌握如何理解数据库执行计划.这篇文章讲解只涉及单表操作的执行计划. 达

不要让临时表空间影响Oracle数据库性能

在Oracle数据库中进行排序.分组汇总.索引等到作时,会产生很多的临时数据.如有一张员工信息表,数据库中是安装记录建立的时间来保存的.如果用户查询时,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据.对于这些临时数据,Oracle数据库是如何处理的呢? 通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区)内.在这个程序全局区中有一个叫做排序区的地方,专门用来存放这些因为排序操作而产生的临时数据.但是这个分区的容量是有限的.当这个

用PHP连mysql和oracle数据库性能比较

mysql|oracle|比较|数据|数据库|性能 用PHP连mysql和oracle数据库性能比较 测试硬件说明:测试使用的是我的爱机,配置如下:CPU:C433内存:128M硬盘:酷鱼2代20G 测试软件说明:WIN32下用的是windows nt server4,sp5,apache 1.3.12,php3.0.15和php4rc1,mysql 3.22.29,oracle 8.0.5linux下用的是bluepoint linux1.0, apache 1.3.12, php4rc1,m

数据库性能检查指导方案 - Part II

数据|数据库|性能     存储性能评估 在存储性能评估的时候,我们使用磁盘性能指数(DPI, Disk Performance Index),下表列出了DPI中的各项指数,这个评分系统并不意味着对磁盘的使用和分配的全方位评估,而只是代表一个晴雨表,反映当前磁盘的使用和分配上是否存在需要改进或者注意的地方.   MPI指数 分类 所需等级 最高分 调整表和索引 是 30 表的行连接问题 无 30 分离关键的Oracle文件 是 30 回滚段的平衡   30 临时段的平衡   30 使用最多的前1

数据库性能分析及调整一例

数据|数据库|性能 故障现象2004年6月8日上午10:00,内蒙古巴盟网通用户反映在OSS系统界面"话单查询"里查询单个用户五天的话单特别慢,查询很长时间无结果. 例如:在OSS系统界面"综合查询"内点击"收费"-〉"话单查询",键入"用户号码,起始时间:2004-01-01 00:00:00,结束时间:2004-06-01 23:00:00",点击查询后,IE进度条缓慢,很长时间不返回结果.故障分析经过