再谈数据库优化(database tuning)的真谛和误区
当今各行业信息量呈现爆炸式增长,因此,数据库优化也就显得弥足重要。随着数据库性能问题的出现,每位用户为了解决出现的问题,不得不满网上到处搜索优化的”灵丹妙药“和捷径,于是,就出现了各种各样的条条框框和金科玉律,以至于这些观点流传很广,对广大用户的影响也很大,例如:
1、SQL语句必须怎么写和注意什么才能性能好,某种写法会比其他写法性能好。这种说法,虽然不能说完全是错的,但也不能说是对的。我们看看数据库优化器的演化和发展历程,就能明白这么说的原因。低版本的数据库优化器是基于规则(rule)的,所谓基于规则,就是SQL语句的执行计划是和SQL的语法息息相关的,也就是说,SQL语句的写法决定了最终的执行计划,也就决定了该SQL语句的性能状况。随着优化器的不断进化和发展,目前所有关系库的优化器都是CBO,也就是基于成本的优化器,顾名思义,在这种优化器中,SQL语句的执行计划和写法几乎没什么关系,而是根据优化器计算出的成本来选择出最好的执行计划的,哪个执行计划成本最低,那么就用哪个执行计划,因此,性能也最好。不可否认,最先进的关系库优化器,例如:Oracle12c,虽然智能化程度已经非常高,机制和算法已经非常先进和完善,产生的执行计划也不可能100%的是最高效的,其中的因素很多,这里不意义论述。甚至在某些场景下,SQL语句的写法确实会影响最终的执行计划,从而影响SQL语句的性能好坏。
2、我经常听到现场的用户惊呼:不好了,数据库中有锁。针对这种情况,我曾经一遍遍的和他们讲,关系库中存在锁是很正常的,在一个高负载、高并发的关系库中,时时刻刻都会存在一些、甚至大量的锁,这是关系库的核心机制,在这种高负载、高并发的数据库上,有锁是正常的,没有锁是不正常的,所以,数据库中存在锁也就不值得奇怪和吃惊了。存在锁没什么奇怪的,关键是看看是否正常,那么,怎么看锁是否正常,针对每种关系库,都有自己一套理论和办法来查询和分析,这里不再赘述。
3、很多用户对SQL调优(SQL TUNING)情有独钟,不管遇到什么数据库的问题,都会想到SQL调优上去。确实,SQL调优确实可以在很大程度上改善数据库的性能,改善幅度也可能是最大的,但在对SQL进行调优前,要看看其他层面或方面是否正常,在确定了性能问题确实是因为SQL引起的,在进行SQL调优,也许才会起到有的放矢,从而起到最好的优化作用。除了SQL层面,还有很多层面和方面会影响数据库性能,例如:OS层面的性能也会影响到数据库性能,因为它是数据库的平台和容器;同时,如果数据库系统存在问题,单纯去进行SQL 调优,可能也是解决不了问题的。OS和DB层面存在问题,导致数据库性能问题的案例在现实中还是经常会遇到的。所以,在SQL调优前,固定其他层面和方面的因素是必须的。
4、数据库存在性能问题,经常听到很多人立刻问道:数据量多大?如果听说上亿或者更大,马上就说:这么大数据量,性能当然会有问题,于是乎那些问问题的人马上就会心服口服。其实这里面会有错误的认识,数据量大是导致出现性能问题的基础,如果数据库里没数据,也就不会出现性能问题,但即使有几十亿,上百亿,上千亿数据量,我只取其中的一条或很少部分数据,且计划正确,也未必就会存在性能问题。也经常有人说,我们上百亿数据量,或PB级数据量,能做到毫秒级的速度,这明显是内行人忽悠外行人,或者外行人忽悠外行人,能不能到毫秒级,和多方面因素有关,还有关键看怎么用数据,有些需求,几百万甚至更少就能出现严重的性能问题,而有的需求,几百亿上千亿,性能也不是问题,但现实中,偏偏很多人被这种说法给说服了,而且心悦诚服的虔诚样子,每次我对这些类似说法提出质疑,从来没得到过正面回应。所以,数据量是性能问题的诱因,但非必然。两本书,一本有几十页,另一本有几千页,通过目录去查找某一章节,速度也许不会真的有数量级的差别,但因为目录大小不同,性能也许会有点差别,一个道理。
以上仅仅举出了现实中最常见的几种情况和误解,其他类似的情况或案例也许会很多,这里不再一一赘述。
所谓优化,不是条条框框,也不存在金科玉律,而是基于深厚理论基础,进行丰富实践的理解和总结,理论和实践缺一不可。其实,现实中很多行业都是一样的,优化从来不是一个入门级的技术,它是一种熟能生巧,活学活用的技能,因此,对于一个初学者来说,应该打好基础,不断实践,在实践中不断总结,积累到一定程度,就能解决一些性能方面的问题,不可否认,优化也有一定的技巧和规律可循,但需要基础才能领会和掌握。
基于个人理解,希望能对大家有所帮助。
再谈数据库优化(database tuning)的真谛和误区的更多相关文章
- poptest老李谈数据库优化总结
poptest老李谈数据库优化总结 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088 ...
- 霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_206 举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种"指南"和" ...
- 浅谈数据库优化方案--表和SQL
1.数据类型的选择 1.字段最好设置为非空.若字段为char(8),即便是NULL也会现有8个字符的空间. 2.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能, ...
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
- sqlserver数据库脱机时发生异常:由于无法在数据库 'SMS' 上放置锁,ALTER DATABASE 失败。请稍后再试。 ALTER DATABASE 语句失败。 (.Net SqlClient Data Provider)
sqlserver数据库脱机时发生异常,如下: =================================== 设置脱机 对于 数据库“SMS”失败. (Microsoft.SqlServe ...
- MySql学习(五) —— 数据库优化理论篇(一)
一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...
- 再谈Transaction——MySQL事务处理分析
MySQL 事务基础概念/Definition of Transaction 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个 sql 语句,这些语句要么都执行 ...
- 浅谈SQL优化入门:3、利用索引
0.写在前面的话 关于索引的内容本来是想写的,大概收集了下资料,发现并没有想象中的简单,又不想总结了,纠结了一下,决定就大概写点浅显的,好吧,就是懒,先挖个浅坑,以后再挖深一点.最基本的使用很简单,直 ...
- MySQL/Oracle数据库优化总结
MySQL数据库优化的八种方式 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能 ...
随机推荐
- HDU 4859 海岸线(最小割+最大独立点权变形)
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题意: 欢迎来到珠海!由于土地资源越来越紧张,使得许多海滨城市都只能依靠填海来扩展市区以求发展.作为Z市的 ...
- JS实现ul,li排序效果
<!DOCTYPE html> <html> <head> <title>js列表排序</title> <meta charset=& ...
- 恢复Intellij idea删除的文件
恢复Intellij idea的删除文件方法: 右键单机项目名称---->Local History---->Show History 可以看到历史操作记录,右键单机想要恢复的文件---- ...
- 史上最全Java面试题(带全部答案)
今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次.对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦.在跳槽季来临之前,特地做这 ...
- Ado.net之存储过程的使用【三】
重点是红色标记区域的代码,设置本次执行的是存储过程,如果不设置,默认操作的是sql语句 private void LoadData() { string constr = @"databas ...
- Android AndFix修复方式的限制
这里阅览了很多网上关于修复的资料,一一贴在这里便于查看: https://github.com/alibaba/AndFix 这是官方处 要了解使用,一定得看看这里. http://www.jia ...
- RabbitMQ消费方式汇总
在学习本章节前,请先学习之前的章节:Java访问RabbitMQ:https://www.cnblogs.com/duanjt/p/10057330.htmlRabbitMQ消息发布时的权衡:http ...
- c# DLL封装并调用
1.封装自己的dll: a.打开visual studio - 文件 - 新建 - 项目- 类库 - 名称MyTestDll: b.右键Class1.cs - 修改为 TestDll.cs; c.在里 ...
- 放弃 Tightvnc, 选择 Tigervnc
构建headless vnc server ,我终于放弃了Tightvnc 基于以下原因: 1) 已知的Qt5的键盘映射问题,导致virtualbox 的使用出现困难 https://unix.sta ...
- English Voice of << Count on me >>
Count On Me 歌手:Bruno Mars 所属专辑:It´s Better If You Don´t Understand If you ever find yourself stuck i ...