我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享!
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
(2) WHERE子句中的连接顺序.:
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
(3) SELECT子句中避免使用 ‘ * ‘:
ORACLE在解析的过程中, 会将"*" 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
(4) 减少访问数据库的次数:
ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;
(5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200
(6) 使用DECODE函数来减少处理时间:
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.
(7) 整合简单,无关联的数据库访问:
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)
(8) 删除重复记录:
最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) 用TRUNCATE替代DELETE:
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
(10) 尽量多使用COMMIT:
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费
(11) 用Where子句替换HAVING子句:
避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里
(12) 减少对表的查询:
在含有子查询的SQL语句中,要特别注意减少对表的查询.例子:
SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT
TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)
(13) 通过内部函数提高SQL效率.:
复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的
(14) 使用表的别名(Alias):
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.
(15) 用EXISTS替代IN、用NOT EXISTS替代NOT IN:
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
例子:
(高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X" FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB")
(低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB")
(16) 识别"低效执行"的SQL语句:
虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法:
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
SQL_TEXT
FROM V$SQLAREA
WHERE EXECUTIONS>0
AND BUFFER_GETS > 0
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
ORDER BY 4 DESC;
分享到:
相关推荐
Sql Prompt是Redgate Software公司开发的一款强大的SQL代码编辑器插件,它为SQL Server数据库开发者提供了智能化的代码补全、格式化和优化建议等功能。在最新的8.2版本中,Sql Prompt增强了对SQL Server 2017的支持...
1. **智能提示**:当用户在编写SQL语句时,SQLPrompt会自动提供可能的表名、列名、函数和关键字的下拉列表,使得编码过程更为流畅。这不仅减少了拼写错误,还能够快速定位和选择所需的数据库对象。 2. **代码格式化...
##### 3.2 SQL优化实例 以以下SQL语句为例: ```sql EXPLAIN SELECT * FROM table WHERE order_id = '666666'; ``` 执行该命令后,MySQL会返回一个包含如下字段的分析报表: - **Id**: 代表SELECT查询的标识符。 - ...
这个系统主要用于个人图书和音像资料的分类、存储、查询及管理,适用于学生课程设计、初学者实践或个人收藏爱好者的使用。 在VB中,此系统可能采用了窗体(Form)和控件(Control)进行用户界面的设计,如文本框...
**知识点1:MySQL的应用场合** MySQL 是一种广泛使用的开源关系型数据库管理系统(RDBMS),适用于多种场景: - **企业管理**:存储和管理企业的关键数据,如财务记录、客户信息等。 - **电子商务**:支持在线交易...
数据库是系统的关键组件,通常使用Access或SQL Server等关系型数据库管理系统来存储用户数据,如收藏的网站信息、记事便笺内容等。数据库设计应考虑数据的完整性、安全性和性能优化,以确保系统的稳定运行。 安全性...
1. **专辑管理**:这是对音乐资源进行系统化整理的关键功能。系统可能采用数据库技术(如MySQL或SQL Server)存储音乐信息,包括专辑名、歌手、发行日期等,并通过后台管理系统实现增删改查操作,便于管理员维护和...
**JDBC工具整理** 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的标准接口,它使得Java程序能够与各种数据库进行交互。本资源集合是个人收藏的JDBC工具类,它对基本的CRUD(创建、读取、更新、...
在信息技术日益发达的今天,云收藏系统已经成为人们整理、存储和分享网络资源的重要工具。本毕业设计的主题是构建一个云收藏系统,旨在为用户提供一个安全、便捷的在线收藏服务,实现跨平台的数据同步与分享。下面,...
这些代码可能是经过开发者整理和优化的,有助于其他开发者快速理解和应用到自己的项目中。例如,你可以找到如何通过SDK获取商品列表、如何处理订单支付、如何进行用户授权等实际操作的示例。 在学习和使用这些代码...
这种系统允许用户保存、整理和分享他们在互联网上找到的各种链接,提供了一种集中化的存储方式,便于日后访问。由于提到了“后台管理 admin.php”,我们可以推测这个系统包含一个管理员控制面板,通过admin.php这个...
它可能涵盖了SQL优化(例如,通过EXPLAIN PLAN分析查询执行计划)、索引优化、数据库设计优化以及使用Oracle Enterprise Manager等工具进行性能监控和调优。 通过这五步学习,你将具备Oracle OCP级别的知识和技能,...
【链接收藏程序】是一款简单的网址管理工具,设计用于帮助用户收集、整理和管理他们的网络书签。这个程序基于Java Web技术栈,特别是JSP(JavaServer Pages)和Servlet,这是一套广泛应用于开发动态Web应用的技术。...
而百度收藏夹则是百度提供的一项服务,让用户可以保存和整理他们在网络上找到的有价值信息。这个基于ASP的项目尝试模仿腾讯微博的社交元素,同时结合百度收藏夹的收藏功能,提供一个集分享、存储和交流的在线平台。 ...
1. **数据库设计**:系统可能使用关系型数据库(如MySQL)或非关系型数据库(如MongoDB)来存储用户的网址信息和分类,可能涉及表结构设计,如用户表、收藏表和类别表。 2. **用户认证与授权**:系统应具备用户注册...
2.2 数据库:MySQL、Oracle或SQL Server等关系型数据库用于存储商品信息、订单数据等。 2.3 平台框架:Spring Boot、Django或Laravel等加速开发进程,提高代码质量。 三、功能模块 3.1 商品管理:包括商品上传、...
【网络收藏夹】是一个专为IT从业者设计的实用工具,主要功能是收集、管理和整理互联网上的各种资源链接。由于其“没有做任何美工”的特点,意味着它的界面简洁,无额外的装饰元素,使得用户可以专注于收藏和组织信息...
3. **性能优化与监控**:Oracle OCP认证强调对数据库性能的优化,这包括SQL查询优化、索引策略、表空间管理、数据库调优工具(如SQL*Plus、SQL Tuning Advisor)的使用,以及性能监控工具(如Enterprise Manager ...
1. **多用户支持**:系统设计为支持多个独立用户,每个用户拥有自己的收藏夹空间,能够创建、编辑和删除书签,同时保证了用户间数据的隔离。 2. **分类管理**:用户可以将链接进行分类,创建不同的收藏夹,方便对...