位置: 编程技术 - 正文

关于数据库优化问题收集汇总(数据库优化的作用是什么?)

编辑:rootadmin
人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。 在对它们进行适当的优化后,其运行速度有了明显地提高!下面将从这三个方面分别进行总结:为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(< 1秒)。----测试环境: 主机:HP LH II---- 主频:MHZ---- 内存:兆----操作系统:Operserver5.0.4----数据库:Sybase.0.3 一、不合理的索引设计----例:表record有行,试看在不同的索引下,下面几个 SQL的运行情况:---- 1.在date上建有一非个群集索引select count(*) from record where date >'' and date < ''and amount > (秒)select date ,sum(amount) from record group by date(秒)select count(*) from record where date >'' and place in ('BJ','SH') (秒)---- 分析:----date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。---- 2.在date上的一个群集索引select count(*) from record where date >'' and date < '' and amount > (秒)select date,sum(amount) from record group by date(秒)select count(*) from record where date >'' and place in ('BJ','SH')(秒)---- 分析:---- 在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。---- 3.在place,date,amount上的组合索引select count(*) from record where date >'' and date < '' and amount > (秒)select date,sum(amount) from record group by date(秒)select count(*) from record where date >'' and place in ('BJ, 'SH')(< 1秒)---- 分析:---- 这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。---- 4.在date,place,amount上的组合索引select count(*) from record where date >'' and date < '' and amount >(< 1秒)select date,sum(amount) from record group by date(秒)select count(*) from record where date >'' and place in ('BJ','SH')(< 1秒)---- 分析:---- 这是一个合理的组合索引。它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。---- 5.总结:----缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。一般来说:①.有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。 二、不充份的连接条件:例:表card有行,在card_no上有一个非聚集索引,表account有行,在account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:select sum(a.amount) from account a,card b where a.card_no = b.card_no(秒)select sum(a.amount) from account a,card b where a.card_no = b.card_no and a.account_no=b.account_no(< 1秒)---- 分析:---- 在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O次数可由以下公式估算为:外层表account上的页+(外层表account的行*内层表card上对应外层表第一行所要查找的3页)=次I/O在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其I/O次数可由以下公式估算为:外层表card上的页+(外层表card的行*内层表account上对应外层表每一行所要查找的4页)= 次I/O可见,只有充份的连接条件,真正的最佳方案才会被执行。总结:1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。2.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(,,)。 三、不可优化的where子句1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:select * from record wheresubstring(card_no,1,4)=''(秒)select * from record whereamount/< (秒)select * from record whereconvert(char(),date,)=''(秒)分析:where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:select * from record where card_no like'%'(< 1秒)select * from record where amount< *(< 1秒)select * from record where date= '//'(< 1秒)你会发现SQL明显快起来!2.例:表stuff有行,id_no上有非群集索引,请看下面这个SQL:select count(*) from stuff where id_no in('0','1')(秒)分析:---- where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执行。我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上(根据showplan),它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响。实践证明,表的行数越多,工作表的性能就越差,当stuff有行时,执行时间竟达到秒!还不如将or子句分开:select count(*) from stuff where id_no='0'select count(*) from stuff where id_no='1'得到两个结果,再作一次加法合算。因为每句都使用了索引,执行时间只有3秒,在行下,时间也只有4秒。或者,用更好的方法,写一个简单的存储过程:create proc count_stuff asdeclare @a intdeclare @b intdeclare @c intdeclare @d char()beginselect @a=count(*) from stuff where id_no='0'select @b=count(*) from stuff where id_no='1'endselect @c=@a+@bselect @d=convert(char(),@c)print @d直接算出结果,执行时间同上面一样快! ---- 总结:---- 可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。3.要善于使用存储过程,它使SQL变得更加灵活和高效。从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。 1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:a) SQL的使用规范:i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。vii. 尽量使用“>=”,不要使用“>”。viii. 注意一些or子句和union子句之间的替换ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。x. 注意存储过程中参数和数据类型的关系。xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过个数据页面(k),那么系统将会进行锁升级,页级锁会升级成表级锁。b) 索引的使用规范:i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引iii. 避免对大表查询时进行table scan,必要时考虑新建索引。iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。v. 要注意索引的维护,周期性重建索引,重新编译存储过程。c) tempdb的使用规范:i. 尽量避免使用distinct、order by、group by、having、join、***pute,因为这些语句会加重tempdb的负担。ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。d) 合理的算法使用: 根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等

推荐整理分享关于数据库优化问题收集汇总(数据库优化的作用是什么?),希望有所帮助,仅作参考,欢迎阅读内容。

关于数据库优化问题收集汇总(数据库优化的作用是什么?)

文章相关热门搜索词:关于数据库优化的说法,对数据库的优化,数据库优化方面的经验,关于数据库优化的论文,关于数据库优化的问题,数据库优化策略有哪些,关于数据库优化的说法,关于数据库优化的问题,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL_Server全文索引的用法解析 --1、为数据库启用SQLServer全文索引EXECsp_fulltext_database'enable'--2、创建全文目录--(此处若出错未安装全文搜索或无法加载某一全文组件,则可能是未启动

SQL_Server全文索引的使用实例演示 本文示范完整的SQLSERVER数据库全文索引以pubs数据库为例首先,介绍利用系统存储过程创建全文索引的具体步骤:1)启动数据库的全文处理功能(sp_fulltext_d

SQLSERVER数据库备份后无法还原的解决办法 有时候完全备份,当还原的时候说不时数据库文件不让还原,解决办法:可以直接复制数据库文件,xxx.mdf和xxx.ldf(实际复制过程中需要先停止sqlserver服务才

标签: 数据库优化的作用是什么?

本文链接地址:https://www.jiuchutong.com/biancheng/347163.html 转载请保留说明!

上一篇:一个完整的SQL SERVER数据库全文索引的示例介绍(一个完整的活动策划方案范文)

下一篇:SQL_Server全文索引的用法解析(sqlserver全文索引ndf文件丢失)

  • 企业资产损失税前扣除管理办法2011215号第46条
  • 小规模普票怎么冲红
  • 上级补助收入对应的支出科目是哪个
  • 税控系统的清单
  • 承兑汇票区别
  • 增值税电子发票能抵税吗
  • 职工的补助金需交税吗
  • 房产过户需要缴纳土地出让金吗
  • 印花税计入哪个费用
  • 应收票据周转率多少合适
  • 行政事业单位餐标
  • 汽车融资租赁行业发展趋势
  • 房产税申报后多久缴纳税款
  • 一般纳税人出租不动产增值税税率
  • 当期应税销售收入是含税还是不含税
  • 蔬菜免税会计分录怎么做
  • 公司对外投资的规定
  • 全部出售子公司怎么做账
  • 资产负债表里面的应收账款包括哪些
  • 显卡硬件加速如何开启
  • macos big sur将安装在macintosh hd
  • 非营利组织一般纳税人会计准则
  • thinkphp5开发教程
  • PHP:xml_parser_set_option()的用法_XML解析器函数
  • PHP:rawurlencode()的用法_url函数
  • 计提税金及附加怎么算
  • cpu和gpu性能对比
  • php顺序查找和二分查找
  • php面向过程
  • yolo v5训练
  • python的切片操作
  • 客运公司做账怎么做
  • 逾期未收回包装物押金会计分录
  • 印花税的征税范围及税率
  • 出租房屋的房产税怎么算
  • php匹配邮箱
  • php call方法
  • c语言f lf
  • mongodb聚合函数mapreduce
  • syslog ng
  • 增值税年末所有都要结平吗
  • 开具利息收入发票需不需要有经营范围
  • 装修款需要开发票吗
  • 技术服务费该怎么收
  • 解决mysql数据库异常断电
  • 收回应收账款赊账怎么算
  • 汇算清缴期间发放的工资
  • 福利费的进项税额会计分录
  • 未开票的收入如何确认分录
  • 以前年度损益调整在利润表中怎么填
  • 税控维护费跨年怎么算
  • 代金券消费怎么做分录
  • 小型微利企业减按25%计算应纳税所得额
  • 独立核算的单位是什么意思
  • 运输服务和运输费有什么区别
  • 加强备案管理
  • 残疾人就业保障金征收使用管理办法
  • 本年利润是负数怎么写凭证
  • 购买服务付款方式有几种
  • 管理费用结转有余额吗
  • 商品销售折让怎么计算
  • sqli
  • Mysql使用教程
  • win8应用程序无法正常启动
  • xp3软件
  • wind10手机版
  • win10的快速访问
  • 微软6月24
  • data.table
  • 纸嫁衣6攻略全文图解
  • shell 查找最新文件
  • unity按钮函数
  • js设计模式有什么用
  • 使用Raygun来自动追踪AngularJS中的异常
  • jquery实现div左右移动
  • javascript数据结构与算法
  • python 包 __init__
  • 国家税务局四川省电子税务局
  • 自然人电子税务局下载
  • 诚信励志语录经典短句
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设