优化SQL查询:如何写出高性能SQL语句
2019独角兽企业重金招聘Python工程师标准>>>
2、 统一SQL语句的写法
对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。
select*from dual
select*From dual
3、 不要把SQL语句写得太复杂
我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。
一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,我可以保证数据库也会晕的。
另外,执行计划是可以被重用的,越简单的SQL语句被重用的可能性越高。而复杂的SQL语句只要有一个字符发生变化就必须重新解析,然后再把这一大堆垃圾塞在内存里。可想而知,数据库的效率会何等低下。
4、 使用“临时表”暂存中间结果
简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。
5、 OLTP系统SQL语句必须采用绑定变量
select*from orderheader where changetime >'2010-10-20 00:00:01'
select*from orderheader where changetime >'2010-09-22 00:00:01'
以上两句语句,查询优化器认为是不同的SQL语句,需要解析两次。如果采用绑定变量
select*from orderheader where changetime >@chgtime
@chgtime变量可以传入任何值,这样大量的类似查询可以重用该执行计划了,这可以大大降低数据库解析SQL语句的负担。一次解析,多次重用,是提高数据库效率的原则。
8、 一些SQL查询语句应加上nolock
在SQL语句中加nolock是提高SQL Server并发性能的重要手段,在oracle中并不需要这样做,因为oracle的结构更为合理,有undo表空间保存“数据前影”,该数据如果在修改中还未commit,那么你读到的是它修改之前的副本,该副本放在undo表空间中。这样,oracle的读、写可以做到互不影响,这也是oracle 广受称赞的地方。SQL Server 的读、写是会相互阻塞的,为了提高并发性能,对于一些查询,可以加上nolock,这样读的时候可以允许写,但缺点是可能读到未提交的脏数据。使用 nolock有3条原则。
(1) 查询的结果用于“插、删、改”的不能加nolock !
(2) 查询的表属于频繁发生页分裂的,慎用nolock !
(3) 使用临时表一样可以保存“数据前影”,起到类似oracle的undo表空间的功能,
能采用临时表提高并发性能的,不要用nolock 。
转载于:https://my.oschina.net/u/2308739/blog/523335
优化SQL查询:如何写出高性能SQL语句相关推荐
- Sql Server 优化 SQL 查询:如何写出高性能SQL语句
1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...
- 如何写出高性能SQL语句
1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...
- 面试官:编写一个 SQL 查询,找出每个部门工资第二高的员工
今天我们来看看大数据开发中row_number函数. 作为一名程序员,求职面试时时常会遇到需要编写一些基础的sql,编写sql这样做的目的主要是考验求职者的逻辑思维及编写sql基础能力.而row_nu ...
- 编写一个 SQL 查询,找出每个部门工资最高的员工。
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id.+----+-------+--------+--------------+ | Id ...
- 如何写出高性能代码(四)优化数据访问
同一份逻辑,不同人的实现的代码性能会出现数量级的差异: 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升:同一份代码,也可能在不同处理器上运行也会有几倍的性能差异:十倍程序员 ...
- 复杂sql 查询编写方法_学习SQL:如何编写复杂的SELECT查询
复杂sql 查询编写方法 In my career, I've heard many times, things like "How to write a complex SELECT qu ...
- 视频教程-数据库SQL查询,最佳案例讲解-SQL Server
数据库SQL查询,最佳案例讲解 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ¥19.00 立即订阅 ...
- code blocks代码性能分析_Julia系列教程13--如果写出高性能的Julia代码
避免全局变量https://www.zhihu.com/video/1113506985873588224 code generationhttps://www.zhihu.com/video/111 ...
- 如何写出高性能代码(二)巧用数据特性
导语 同一份逻辑,不同人的实现的代码性能会出现数量级的差异: 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升:同一份代码,也可能在不同处理器上运行也会有几倍的性能差异:十倍程序 ...
最新文章
- rest_framework框架实现之(认证)
- VTK修炼之道76:交互部件_标注类Widget的应用
- springcloud服务注册和发现
- 在 Ali Kubernetes 系统中,我们这样实践混沌工程
- hibernate 多对一外键注解
- Windows下openssl的下载安装和使用
- 怎么看电脑能不能升级win10系统|检测电脑适不适合安装win10的方法
- iOS OpenGL ES2.0教程 Lesson03 旋转
- WinForm+ADO.net应用(二)+ 例子源码
- python批量读取Excel文件
- windows上dmg转换cdr_cdr中常见问题及其解决方案
- VVC/JEM代码学习17:xCheckRDCostMerge2Nx2NFRUC
- 烟草MES系统介绍-序
- K均值聚类算法以及模糊K均值算法研究,matlab
- linux内核贡献排名,谷歌ARM靠边站!Linux内核贡献,华为反超Intel全球第一
- flutter打包出错了,有大神帮忙看看吗?
- 数据分析报告结构规范设计
- VirtualBox安装Ubuntu系统过程及问题排查
- MySQL日志系列(2):binlog日志管理
- 使用rpm包制作本地镜像仓库和使用httpd发布镜像服务实现内网使用yum命令
热门文章
- VTK:小部件之SplineWidget
- VTK:可视化之MultipleViewports
- VTK:几何对象之Cylinder
- OpenCV cv :: Mat的串行输出功能的实例(附完整代码)
- QT的QWGLNativeContext类的使用
- QT的QMutexLocker类的使用
- java和python哪个编程好找工作_学编程选Python还是Java?就业发展哪个好??
- 1.11.Flink DataSetAPI、DataSet API之Data Sources、DataSet API之Transformations、DataSet Sink部分详解
- B02_NumPy数据类型(常见基本数据类型列举,数据类型对象 (dtype))
- 用 Freemarker 生成 word 文档