当前位置: 首页 > news >正文

Dav_笔记11:SQL Tuning Overview-sql调优 之 4

开发高效的SQL语句

本节介绍了提高SQL语句效率的方法:

■验证优化程序统计信息

■审查执行计划

■重构SQL语句

■重组索引

■修改或禁用触发器和约束

■重组数据

■随着时间的推移维护执行计划

■尽可能少地访问数据

验证优化程序统计信息

查询优化器在确定最佳执行计划时使用在表和索引上收集的统计信息。如果尚未收集这些统计信息,或者统计信息不再代表数据库中存储的数据,则优化程序没有足够的信息来生成最佳计划。

要检查的事项:

■如果收集数据库中某些表的统计信息,则最好收集所有表的统计信息。如果您的应用程序包含执行连接的SQL语句,则尤其如此。

■如果数据字典中的优化程序统计信息不再代表表和索引中的数据,则收集新的统计信息。检查字典统计信息是否过时的一种方法是将表的实际基数(行计数)与DBA_TABLES.NUM_ROWS的值进行比较。此外,如果谓词列上存在严重的数据偏差,请考虑使用直方图。

审查执行计划

在OLTP环境中调优(或写入)SQL语句时,目标是从具有最具选择性的过滤器的表中驱动。这意味着传递到下一步的行数较少。如果下一步是连接,则表示连接的行数较少。检查访问路径是否最佳。

检查优化程序执行计划时,请查找以下内容:

■驱动表具有最佳过滤器。

■每个步骤中的连接顺序将最少的行数返回到下一步(即,连接顺序应尽可能反映到最佳尚未使用的过滤器)。

■join方法适用于返回的行数。例如,当语句返回许多行时,通过索引的嵌套循环连接可能不是最佳的。

■数据库有效地使用视图。查看SELECT列表以查看是否需要访问视图。

■有任何无意义的笛卡尔结果(即使是小表)。

注意:

本节中描述的准则面向生成频繁执行的SQL。这里不鼓励使用的大多数技术可以合理地用于临时语句或在性能不重要的情况下不经常运行的应用程序中。

■有效访问每个表:

考虑SQL语句中的谓词和表中的行数。 查找可疑活动,例如对具有大量行的表进行全表扫描,这些行在where子句中具有谓词。 确定索引未用于此类选择性谓词的原因。

全表扫描并不意味着效率低下。 在小型表上执行全表扫描或执行全表扫描以针对返回的行数利用更好的连接方法(例如,hash_join)可能更有效。

如果这些条件中的任何一个不是最佳的,那么考虑重构SQL语句或表上可用的索引。

重构SQL语句

通常,重写低效的SQL语句比修改它更容易。 如果您了解给定语句的用途,那么您可以快速轻松地编写满足要求的新语句。

使用AND和=撰写谓词

要提高SQL效率,请尽可能使用等值连接。 在未转换的列值上执行等值连接的语句是最容易调整的。

避免在WHERE子句中转换列

使用未转换的列值。 例如,使用:

WHERE.order_no = b.order_no

而不是:

WHERE TO_NUMBER (SUBSTR(a.order_no, INSTR(b.order_no, '.') - 1))

= TO_NUMBER (SUBSTR(a.order_no, INSTR(b.order_no, '.') - 1))

不要在谓词子句或WHERE子句中使用SQL函数。任何使用列的表达式,例如以列为参数的函数,都会导致优化器忽略在该列上使用索引的可能性,甚至是唯一索引,除非定义了基于函数的索引,数据库可以使用。

避免使用混合模式表达式,并注意隐式类型转换。如果要在VARCHAR2列charcol上使用索引,但WHERE子句如下所示:

AND charcol = numexpr

其中numexpr是数字类型的表达式(例如,1,USERENV('SESSIONID'),numcol,numcol + 0,...),Oracle数据库将该表达式转换为:

AND TO_NUMBER(charcol)=

相关文章:

  • Linux第五节课(权限02)
  • 嵌入式虚拟仿真教学解决方案
  • 一文搞清楚遗传算法(Genetic Algorithm,GA)详解,附带应用及源码
  • 3.k8s:服务发布:service,ingress;配置管理:configMap,secret,热更新;持久化存储:volumes,nfs,pv,pvc
  • MATLAB基础:函数与函数控制语句
  • 【数据结构初阶】单链表经典算法题十二道——得道飞升(上篇)
  • SQLException:Operation not allowed after ResultSet closed
  • 在MATLAB中使用importrobot导入机械臂刚体树时没有找到模型文件,只显示坐标;改为使用loadrobot
  • 文件共享功能无法使用提示错误代码0x80004005【笔记】
  • iOS中的类型推断(Type Inference)
  • [排序]hoare快速排序
  • 为什么多数大数据治理项目都是失败的?Gartner调查失败率超过90%
  • Vue2父传子
  • JNI回调用中不同线程的env无法找到正确的kotlin的class
  • Vite 常用插件配置:自动导入+自动注册组件+动态创建图标+设置组件名
  • Android开源项目规范总结
  • CentOS 7 修改主机名
  • Docker 笔记(2):Dockerfile
  • ES6 学习笔记(一)let,const和解构赋值
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • java中具有继承关系的类及其对象初始化顺序
  • Laravel 实践之路: 数据库迁移与数据填充
  • magento2项目上线注意事项
  • Object.assign方法不能实现深复制
  • Promise面试题2实现异步串行执行
  • Spark RDD学习: aggregate函数
  • text-decoration与color属性
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 从零开始的无人驾驶 1
  • 从零开始学习部署
  • 复习Javascript专题(四):js中的深浅拷贝
  • 码农张的Bug人生 - 见面之礼
  • 前端之React实战:创建跨平台的项目架构
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 与 ConTeXt MkIV 官方文档的接驳
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 原生js练习题---第五课
  • 你对linux中grep命令知道多少?
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 阿里云移动端播放器高级功能介绍
  • 阿里云重庆大学大数据训练营落地分享
  • 大数据全解:定义、价值及挑战
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #laravel 通过手动安装依赖PHPExcel#
  • #LLM入门|Prompt#3.3_存储_Memory
  • #VERDI# 关于如何查看FSM状态机的方法
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $ git push -u origin master 推送到远程库出错
  • $(selector).each()和$.each()的区别
  • (Charles)如何抓取手机http的报文
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证