位置: 编程技术 - 正文

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

编辑: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文件丢失)

  • 全国增值税发票查验平台入口
  • 融资租赁的两种模式
  • 体检费要缴纳个人所得吗?
  • 建筑公司办公室照片真实
  • 附加税申报减免性质代码下面的三个请选择用填吗
  • 计提坏账准备需要纳税调增吗
  • 车船税重复交了怎么退怎么在网上完税?
  • 半成品原材料报废会计处理怎么做?
  • 过期未认证的进项税如何记账
  • 一般纳税人开专票和普票的税率
  • 广告公司可以开维修费吗
  • 小规模纳税人出租不动产税率是5%还是3%
  • 税收优先权的表述
  • 建筑业简易计税进项税可以抵扣吗
  • 跨年度多计提的社保调整
  • 固定资产清理账户结构
  • 委外开发费用可以加计扣除吗
  • 电子商务企业类别有哪些
  • 索赔发票会计入账
  • 公司员工补充医疗保险方案
  • 出口佣金比例
  • 经营预算的基本内容包括
  • windows10如何开热点
  • win11系统开机密码设置
  • 装电脑系统的方法和步骤
  • PHP clearstatcache()函数详解
  • 耕地佔用税的缴纳期限
  • service的启动方式及生命周期
  • android应用程序开发语言
  • 发票多开了一张怎么处理?
  • php输出表格css
  • tracetcp命令
  • php array_multisort 对数组进行排序详解及实例代码
  • 年底计提成本
  • ufw 设置
  • dedecms怎么改图片
  • 不动产简易征收增值税发票 可以抵扣
  • sql语句字符串比较大小
  • 织梦怎么调用当前栏目下的文章
  • 企业正常性停产什么意思
  • 无退税产品出口征税
  • 政府会计资产的概念
  • 企业所得税计提金额怎么算
  • 企业支付的费用化的一般借款利息支出属于什么
  • 纳税人及时提供信息
  • 建筑企业的安全技术措施
  • 外贸公司收取客户的费用
  • 财政补助收入属于资产类还是负债类
  • 可供分配的利润是什么意思
  • 报废周转材料应负担的成本差异
  • 发票入账有效期是多长时间
  • sqlserver日期范围
  • sqlserver2000数据库迁移到2008r2
  • 网站的运维
  • 启用5g后流量有什么影响
  • centos virbr0
  • linux dicom
  • windows如何关闭
  • window10通知
  • linux0.01编译
  • windows8宽带连接设置
  • Linux中怎么安装nano已经有安装包了
  • win7关闭操作中心图标
  • 在Linux系统中安装pacman
  • jquery 多选
  • Android游戏开发读后感
  • 不使用jsp
  • shell脚本进程号
  • 详解JavaScript对W3C DOM模版的支持情况
  • css3瀑布流布局
  • android studio报错
  • 如何用python开发软件
  • python 中
  • 深圳国税电子税务局
  • 进口小麦关税税率是多少
  • 讲话和讲话精神的区别
  • 为什么有的企业在企查查上查不到
  • 国税局黑龙江省
  • 税金乘以12%是什么
  • 原始股卖出多少需要披露
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设