第二季度自主sql优化学习笔记

合集下载

sql必知必会读书笔记

sql必知必会读书笔记

sql必知必会读书笔记《SQL必知必会》是一本非常实用的SQL学习书籍,以下是我的读书笔记:1. SQL是什么?SQL(Structured Query Language)是一种用于管理关系型数据库的编程语言。

它可以用于创建、修改和删除数据表,以及查询、更新和删除数据。

2. SQL的基本语法SQL语句以分号结尾。

常用的SQL语句包括SELECT、INSERT、UPDATE、DELETE等。

其中,SELECT语句用于查询数据,INSERT语句用于插入数据,UPDATE语句用于更新数据,DELETE语句用于删除数据。

3. SELECT语句的基本结构SELECT语句的基本结构为:SELECT 列名FROM 表名WHERE 条件表达式。

其中,列名表示要查询的数据,表名表示要查询的表,条件表达式表示查询的条件。

4. WHERE子句WHERE子句用于指定查询条件,可以使用比较运算符(如=、<>、>、<、>=、<=)和逻辑运算符(如AND、OR、NOT)进行组合。

例如,查询年龄大于18岁的员工信息:SELECT * FROM employees WHERE age > 18;5. ORDER BY子句ORDER BY子句用于对查询结果进行排序,可以按照一个或多个列进行排序。

默认情况下,排序方式为升序(ASC),也可以使用DESC关键字进行降序排序。

例如,按照员工姓名升序排列:SELECT * FROM employees ORDER BY name ASC;6. GROUP BY子句GROUP BY子句用于将查询结果按照一个或多个列进行分组。

可以使用聚合函数(如COUNT、SUM、AVG、MAX、MIN)对每个分组进行计算。

例如,统计每个部门的平均工资:SELECT department, AVG(salary) FROM employees GROUP BY department;7. HAVING子句HAVING子句用于对分组后的结果进行筛选。

SQLServer数据库查询与优化

SQLServer数据库查询与优化

SQLServer数据库查询与优化第一章:SQLServer数据库查询基础SQLServer是一种关系型数据库管理系统,广泛应用于企业级应用系统中。

数据库查询是其中最核心的功能之一,通过查询可以从数据库中获取所需的数据。

本章将介绍SQLServer数据库查询的基础知识。

1.1 查询语句结构SQLServer的查询语句通常由SELECT、FROM和WHERE子句组成。

SELECT子句用于指定要查询的字段,FROM子句用于指定要查询的表格,WHERE子句用于指定查询条件。

1.2 常见的查询操作SQLServer提供了多种查询操作符,如等于(=)、不等于(<>)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。

通过这些操作符可以实现复杂的查询逻辑。

1.3 使用聚合函数进行查询SQLServer提供了一系列聚合函数,如SUM、AVG、COUNT、MAX、MIN等,可以对查询结果进行统计汇总。

这些函数通常与GROUP BY子句配合使用,用于按照指定的字段进行分组统计。

第二章:SQLServer数据库查询性能优化SQLServer数据库查询的性能对于应用系统的稳定性和响应速度至关重要。

本章将介绍一些常见的SQLServer数据库查询性能优化技巧。

2.1 创建适当的索引索引是提高查询性能的重要手段之一,可以加快查询的速度。

在设计数据库表时,需要根据实际查询需求创建适当的索引。

常用的索引类型有聚簇索引和非聚簇索引。

2.2 避免使用SELECT *语句SELECT *语句会查询所有字段,包括不需要的字段,这样会增加数据库的负载,降低查询效率。

最好明确指定需要的字段,避免不必要的数据传输和处理。

2.3 减少子查询的使用子查询是一种嵌套在主查询中的查询,它通常会导致查询性能下降。

可以考虑使用联接查询或者临时表来替代子查询,从而提高查询效率。

2.4 合理使用索引提示和查询优化器SQLServer的查询优化器可以根据查询语句和数据库的统计信息选择最佳的执行计划。

SQL数据库管理技巧和优化

SQL数据库管理技巧和优化

SQL数据库管理技巧和优化SQL(Structured Query Language)是一种用于管理关系型数据库系统的语言,它可以帮助我们进行数据的查询、操纵和管理。

在日常的数据库管理工作中,掌握一些SQL数据库管理技巧和优化方法可以提高我们的工作效率和数据库的性能。

本文将详细介绍一些常用的SQL数据库管理技巧和优化方法,并分点列出以下内容:1. 数据库备份和恢复- 定期进行数据库备份,确保数据的安全性。

- 选择合适的备份方法,如完全备份、增量备份或差异备份。

- 验证备份文件的完整性和可用性。

- 在数据库出现故障时,及时进行数据库恢复操作。

2. 索引的创建和优化- 在数据库中建立适当的索引,以提高查询性能。

- 选择适合的索引类型,如B树索引、哈希索引或全文索引。

- 避免创建过多的索引,以减少索引更新的开销。

- 定期进行索引的优化和重建。

3. SQL查询的性能优化- 使用合适的查询语句,避免使用子查询、嵌套查询或复杂的连接操作。

- 使用JOIN语句来替代多次查询,加快查询速度。

- 避免使用通配符查询,如“SELECT *”。

- 在WHERE子句中使用合适的条件,以减少查询返回的数据量。

- 对查询结果进行分页处理,减少数据的传输量。

4. 数据库的规范化和优化- 对数据库进行规范化设计,避免数据冗余和重复。

- 合理设计表结构,选择合适的数据类型,减少存储空间的占用。

- 对大规模数据库进行分区管理,提高查询和维护效率。

- 定期进行数据库的清理和整理,删除无用数据和垃圾数据。

5. 安全性和权限管理- 设计合理的用户和角色权限,限制用户对数据库的访问和操作。

- 定期更新数据库用户密码,确保账户安全。

- 监控数据库的访问日志,及时发现并阻止不正常的访问行为。

- 在数据库中使用合适的加密算法,保护数据的机密性。

6. 数据库性能监控和优化- 监控数据库的性能指标,如CPU利用率、内存利用率和磁盘IO等。

- 使用性能监控工具,如Explain、Profiler或AWR报告,找出性能瓶颈。

SQLServer数据库性能优化(一)之优化SQL语句

SQLServer数据库性能优化(一)之优化SQL语句

SQLServer数据库性能优化(⼀)之优化SQL语句最近⼯作上基本没什么需求(好吧不是最近是好久了,所以随便看看基础的东西来填补⾃⼰的空⽩)数据库优化主要可以从以下⼏个⽅⾯⼊⼿(1)架构级别,表结构设计:如良好的系统和数据库设计(2)代码语句级别:优质的SQL编写(3)索引设计:合适的数据表索引设计(4)硬件因素:⽹络性能、服务器的性能、操作系统的性能,甚⾄⽹卡、交换机等这⾥主要讨论最容易修改优化的 SQL 语句准则1:1. 按需索取字段,跟“SELECT *”说拜拜字段的提取⼀定要按照“⽤多少提多少”的原则,避免使⽤“SELECT *”这样的操作。

做了这样⼀个实验,表tblA有1000万数据:select top10000 c1, c2, c3, c4 from tblA order by c1 desc--⽤时:4673毫秒select top10000 c1, c2, c3 from tblA order by c1 desc--⽤时:1376毫秒select top10000 c1, c2 from tblA order by c1 desc--⽤时:80毫秒准则2:2. 字段名和表名要写规范,注意⼤⼩写这⼀点要多注意,如果⼤⼩写写错的话,虽然SQL仍然能正常执⾏,但数据库系统会花⼀定的开销和时间先要把您写的规范成正确的,然后再执⾏SQL。

写对的话,这个时间就省了。

正常的: select top 10 dteTransaction, txtSystem_id from tblTransactionSystem不⼩⼼的:select top 10 dtetransaction, txtsystem_id from tbltransactionsystem准则3:3. 适当使⽤过渡表把表的⼀个⼦集进⾏排序并创建临时表,有时能加速查询。

它有助于避免多重排序操作,⽽且在其他⽅⾯还能简化优化器的⼯作。

性能优化课堂笔记和培训心得

性能优化课堂笔记和培训心得

软件性能优化心得体会随着企业级开发平台诸如J2EE的普及和发展,越来越多的企业应用采用了这些技术作为快速开发平台,但是,这些应用也面临着一些困扰,特别是性能问题。

这主要是由这些系统的分布性、复杂性和数据无关性引起的。

高性能是软件高质量的重要体现,也是用户满意度提高的重要软件特征,为了提高软件的性能,在这次培训中,老师从以下几个层次讨论软件性能优化。

一、Java底层代码的性能优化1、首先根据Jvm虚拟机的内存机制来优化系统堆(Heap)是一个复杂的结构,对象及其成员通常保存在堆中。

运行时在数据区, 动态创建,堆中的内容由GC 负责回收。

栈(Stack)是一个简单的结构,方法的参数(基本型别的值、指向对象的引用)通常保存在栈中。

栈中的内容在方法执行完时就被回收了。

栈的存取速度比堆要快,栈数据可以共享,存在栈中的数据大小与生存期必须是确定的,栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

使用局部变量的好处在于作用范围是变量定义的方法内部,一旦离开作用域,栈内存将被快速释放,与GC无关,而其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢,但是可以自动回收。

所以要尽量使用局部变量。

在这里,培训的老师举了个人例子Afor(int i=0;i<10000; i++){Object o = new Object();}BObject o = null;for(int i=0;i<10000; i++){o = new Object();}A和B之间究竟哪个性能更加好呢?在这里A和B的唯一区别在于,B在循环体外定义Object,而A是在循环体内定义Object,显然A的Object作用域是在局部,一旦执行下一轮循环,立即释放原先定义的Object,而B 的Object作用域是在全局,必须等到循环全部结束,Object才能被释放,因此A的性能要好于B,而且两者运行速度不是一个数量级。

SQL优化

SQL优化

通过分析SQL语句的执行计划优化SQL(总结)做DBA快7年了,中间感悟很多。

在DBA的日常工作中,调整个别性能较差的SQL语句时一项富有挑战性的工作。

其中的关键在于如何得到SQL语句的执行计划和如何从SQL语句的执行计划中发现问题。

总是想将日常经验的点点滴滴总结一下,但是直到最近才下定决心,总共花了3个周末时间,才将其整理成册,便于自己日常工作。

不好意思独享,所以将其贴出来。

第一章、第2章并不是很重要,是自己的一些想法,关于如何做一个稳定、高效的应用系统的一些想法。

第三章以后都是比较重要的。

附录的内容也是比较重要的。

我常用该部分的内容。

前言本文档主要介绍与SQL调整有关的内容,内容涉及多个方面:SQL语句执行的过程、ORACLE优化器,表之间的关联,如何得到SQL执行计划,如何分析执行计划等内容,从而由浅到深的方式了解SQL优化的过程,使大家逐步步入SQL调整之门,然后你将发现……。

该文档的不当之处,敬请指出,以便进一步改正。

请将其发往我的信箱:xu_yu_jin2000@。

如果引用本文的内容,请著名出处!第1章性能调整综述Oracle数据库是高度可调的数据库产品。

本章描述调整的过程和那些人员应与Oracle 服务器的调整有关,以及与调整相关联的操作系统硬件和软件。

本章包括以下方面:l 谁来调整系统?l 什么时候调整?l 建立有效调整的目标l 在设计和开发时的调整l 调整产品系统l 监控产品系统谁来调整系统:为了有效地调整系统,若干类人员必须交换信息并牵涉到系统调整中,例如:l 应用设计人员必须传达应用系统的设计,使得每个人都清楚应用中的数据流动. l 应用开发人员必须传达他们选择的实现策略,使得语句调整的过程中能快速、容易地识别有问题的应用模块和可疑的SQL语句.l 数据库管理人员必须仔细地监控系统活动并提供它们的资料,使得异常的系统性能可被快速得识别和纠正.l 硬件/软件管理人员必须传达系统的硬件、软件配置并提供它们的资料,使得相关人员能有效地设计和管理系统。

《数据库高效优化:架构、规范与SQL技巧》读书笔记模板


读书笔记
本书以大量案例为依托,系统讲解了SQL语句优化的原理、方法及技术要点,尤为注重实践,在章节中引入 了大量的案例,便于学习者实践、测试,反复揣摩。
SQL是最重要的关系数据库操作语言。本书以大量案例为依托,系统讲解了SQL语句优化的原理、方法及技术 要点,尤为注重实践,在章节中引入了大量的案例,便于学习者实践、测试,反复揣摩。
目录分析
第0章引言
第1章与SQL优 化相关的几个 案例
案例1一条SQL引发的“血案” 案例2糟糕的结构设计带来的问题 案例3规范SQL写法好处多 案例4 “月底难过” 案例5 COUNT()到底能有多快 案例6 “抽丝剥茧”找出问题所在
第2章优化器与成本 第3章执行计划
第4章统计信息
第5章 SQL解析与游 标
第6章绑定变量
第7章 SQL优化相关 对象
第8章 SQL优化相关 存储结构
第9章特有SQL
2.1优化器 2.2成本
3.1概述 3.2解读执行计划 3.3执行计划操作
4.1统计信息分类 4.2统计信息操作
5.1解析步骤 5.2解析过程 5.3游标示例
6.1使用方法 6.2绑定变量与解析 6.3游标共享
第13章半连接与反连 接
第15章子查询
第14章排序
第16章并行
10.1查询转换的分类及说明 10.2查询转换——子查询类 10.3查询转换——视图类 10.4查询转换——谓词类 10.5查询转换——消除类 10.6查询转换——其他
11.1表访问路径 11.2 B树索引访问路径 11.3位图索引访问路径 11.4其他访问路径
7.1表 7.2字段 7.3索引 7.4视图 7.5函数 7.6数据链(DB_LINK)

SQL数据快速查询优化小技巧(仅供参考)

SQL数据快速查询优化⼩技巧(仅供参考)1.应尽量避免在where⼦句中使⽤!=或<>操作符2.应尽量避免在where⼦句中使⽤or来连接条件如:select Id from t where num=10or num=20可以这样查询Select id from t where num=10Union allSelect id from t where num=203.in和not in也要慎⽤,否则会导致全表扫描如:select id from t where num in(1,2,3)对于连续的数值,能⽤between就不要⽤in了如:select id from t where num between1and34.下⾯的查询也将导致全表扫描如:select id from t where name like ‘%abc%’若提⾼效率,可以考虑全⽂检索5.如果在where⼦句中使⽤参数,也会导致全表扫描。

因为sql只有在运⾏时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运⾏时,它必须在编译时进⾏选择。

然⽽,如果在编译时建⽴访问计划,变量的值还是未知的,因⽽⽆法作为索Select id from t where num=@num可以改为强制查询使⽤索引:Select id from t with(index(索引名)) where num=@num6.应尽量避免在where⼦句中对字段进⾏表达式操作,这将导致引擎放弃使⽤⽽进⾏全表扫描。

如:select if from t where num/2=100应改为:select id from t where num=100*27.应尽量避免在where⼦句中对字段进⾏函数操作,这将导致引擎放弃使⽤索引⽽进⾏全表扫描。

如:select id from t where substring(name,1,3)=’abc’ ----name以abc开头的idSelect id from t where datadiff(day,createdate.’2005-11-30’)=0----‘2005-11-30’⽣成的id应改为:Select id from t where name like ‘abc%’Select id from t where createdate>=’2005-11-30’ and createdate<’2005-12-1’8.不要在where⼦句中的”=”左边进⾏函数,算术运算或其他表达式运算,否则系统将可能⽆法正确使⽤索引9.在使⽤索引字段作为条件时,如果该索引是复合索引,那么必须使⽤到该索引中的第⼀个字段作为条件时才能保证系统使⽤该索引,否则该索引不会被使⽤,并且应尽可能的让字段顺序与索引顺序相⼀致10. 不要写⼀些没有意义的查询,如需要⽣成⼀个空表结构:Create table #t(…)11. 很多时候⽤exist代替in是⼀个好的选择如:select num from a where num in (select num from b)⽤下⾯的语句替换:Select num from a where exists(select1from b where num=a.num )与临时表⼀样,游标并不是不可使⽤。

第二季度自主sql优化学习笔记

湖南电信sql语句优化学习笔记一、首先通过高耗sql语句查询出所需要优化的sql:--Elapsed_Time语句select *from (selectnvl((sqt.elap / 1000000), to_number(null)),nvl((sqt.cput / 1000000), to_number(null)),sqt.exec,decode(sqt.exec,0,to_number(null),(sqt.elap / sqt.exec / 1000000)),(10000 *2*(sqt.elap/1000000 / (SELECTsum(e.VALUE) - sum(b.value) FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT eWHERE B.SNAP_ID = &beg_snap_idAND E.SNAP_ID = &end_snap_idAND B.DBID = &dbidAND E.DBID = &dbidAND B.INSTANCE_NUMBER = &instance_numberAND E.INSTANCE_NUMBER = &instance_numberand e.STAT_NAME = 'DB time'and b.stat_name = 'DB time'))) norm_val,sqt.sql_id,to_clob(decode(sqt.module,null,null,'Module: ' || sqt.module)),nvl(st.sql_text, to_clob(' ** SQL Text Not Available ** '))from (select sql_id,max(module) module,sum(elapsed_time_delta) elap,sum(cpu_time_delta) cput,sum(executions_delta) execfrom dba_hist_sqlstatwhere dbid = &dbidand instance_number = &instance_numberand&beg_snap_id<snap_idand snap_id<= &end_snap_idgroupby sql_id) sqt,dba_hist_sqltextstwhere st.sql_id(+) = sqt.sql_idand st.dbid(+) = &dbidorderbynvl(sqt.elap, -1) desc, sqt.sql_id)whererownum<65and (rownum<= 10or norm_val>1);--提出cpu比较高的语句select *from (selectnvl((sqt.cput / 1000000), to_number(null)), nvl((sqt.elap / 1000000), to_number(null)),sqt.exec,decode(sqt.exec,0,to_number(null),(sqt.cput / sqt.exec / 1000000)), (10000 *2*(sqt.elap/1000000/(SELECTsum(e.VALUE) - sum(b.value)FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT eWHERE B.SNAP_ID = &beg_snap_idAND E.SNAP_ID = &end_snap_idAND B.DBID = &dbidAND E.DBID = &dbidAND B.INSTANCE_NUMBER = &instance_numberAND E.INSTANCE_NUMBER = &instance_numberand e.STAT_NAME = 'DB time'and b.stat_name = 'DB time'))) norm_val,sqt.sql_id,to_clob(decode(sqt.module,null,null,'Module: ' || sqt.module)),nvl(st.sql_text, to_clob('** SQL Text Not Available **')) from (select sql_id,max(module) module,sum(cpu_time_delta) cput,sum(elapsed_time_delta) elap,sum(executions_delta) execfrom dba_hist_sqlstatwhere dbid = &dbidand instance_number = &instance_numberand&beg_snap_id<snap_idand snap_id<= &end_snap_iddba_hist_sqltextstwhere st.sql_id(+) = sqt.sql_idand st.dbid(+) = &dbidorderbynvl(sqt.cput, -1) desc, sqt.sql_id)whererownum<65and (rownum<= 10or norm_val>1);--提出Buffer_Gets比较高的语句select *from (select sqt.bget,sqt.exec,decode(sqt.exec, 0, to_number(null), (sqt.bget / sqt.exec)), (100 * sqt.bget) /(SELECTsum(e.VALUE) - sum(b.value)FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT eWHERE B.SNAP_ID = &beg_snap_idAND E.SNAP_ID = &end_snap_idAND B.DBID = &dbidAND E.DBID = &dbidAND B.INSTANCE_NUMBER = &instance_numberAND E.INSTANCE_NUMBER = &instance_numberand e.STAT_NAME = 'session logical reads'and b.stat_name = 'session logical reads') norm_val,nvl((sqt.cput / 1000000), to_number(null)),nvl((sqt.elap / 1000000), to_number(null)),sqt.sql_id,to_clob(decode(sqt.module,null,null,'Module: ' || sqt.module)),nvl(st.sql_text, to_clob('** SQL Text Not Available **')) from (select sql_id,max(module) module,sum(buffer_gets_delta) bget,sum(executions_delta) exec,sum(cpu_time_delta) cput,sum(elapsed_time_delta) elapfrom dba_hist_sqlstatwhere dbid = &dbidand instance_number = &instance_numberand&beg_snap_id<snap_idand snap_id<= &end_snap_iddba_hist_sqltextstwhere st.sql_id(+) = sqt.sql_idand st.dbid(+) = &dbidorderbynvl(sqt.bget, -1) desc, sqt.sql_id) whererownum<65and (rownum<= 10or norm_val>1);二、比较常用的sql优化方案1、观察sql语句是否存在语法逻辑方面的问题。

如何通过SQL优化来提升数据库查询速度

如何通过SQL优化来提升数据库查询速度在当今信息时代,数据库查询速度的快慢直接影响着数据处理的效率。

尤其是对于大型企业或者数据密集型应用来说,数据库查询速度的提升可以极大地改善系统的性能和用户体验。

而SQL优化作为一种提高数据库查询效率的关键技术,可以通过合理的索引设计、查询语句优化和数据结构调整等方式来加速查询响应时间。

第一,合理设计索引。

数据库索引是提高查询速度的关键因素之一。

通过在数据库表中创建索引,可以让数据库系统更快地找到并返回所需的数据。

因此,在创建表的过程中,需要根据数据访问频率和查询模式等因素来选择合适的字段作为索引。

一般来说,主键和外键字段应该作为索引字段,同时,经常进行查询的字段也可以考虑创建索引。

但是,过多或过大的索引会增加数据库的维护成本,因此需要权衡索引的创建与维护成本。

第二,优化查询语句。

查询语句的优化对于提升数据库查询速度也起着至关重要的作用。

首先,避免使用不必要的通配符查询。

通配符查询,如使用“%”符号进行模糊查询,会导致数据库系统进行全表扫描,从而影响查询速度。

其次,合理利用连接查询来减少查询次数。

连接查询可以将多个查询合并为一个查询,从而减少数据传输和查询开销。

此外,还可以通过限制查询结果的数量、使用合适的排序方式和利用数据库特性等方式来对查询语句进行优化,以减少数据库系统的负担。

第三,调整数据结构。

数据库中的数据存储结构也会影响查询的速度。

例如,将经常一起查询的字段放在同一个表中,避免数据分散在多个表中,可以减少连接和查询的开销。

此外,合理设计数据库的范式和反范式也可以提高查询效率。

范式可以减少数据冗余,提高数据一致性,但查询时需要进行多次关联操作;而反范式可以减少关联操作,加快查询速度,但可能会增加数据冗余。

因此,在实际应用中,需要根据具体情况来选择合适的数据结构。

除了以上具体方法,还可以结合数据库性能监控、性能测试和性能调优等手段,通过监控数据库的运行状态、识别潜在的性能瓶颈和定位问题的根源,来进一步提升数据库查询速度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

湖南电信sql语句优化学习笔记一、首先通过高耗sql语句查询出所需要优化的sql:--Elapsed_Time语句select *from (selectnvl((sqt.elap / 1000000), to_number(null)),nvl((sqt.cput / 1000000), to_number(null)),sqt.exec,decode(sqt.exec,0,to_number(null),(sqt.elap / sqt.exec / 1000000)),(10000 *2*(sqt.elap/1000000 / (SELECTsum(e.VALUE) - sum(b.value) FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT eWHERE B.SNAP_ID = &beg_snap_idAND E.SNAP_ID = &end_snap_idAND B.DBID = &dbidAND E.DBID = &dbidAND B.INSTANCE_NUMBER = &instance_numberAND E.INSTANCE_NUMBER = &instance_numberand e.STAT_NAME = 'DB time'and b.stat_name = 'DB time'))) norm_val,sqt.sql_id,to_clob(decode(sqt.module,null,null,'Module: ' || sqt.module)),nvl(st.sql_text, to_clob(' ** SQL Text Not Available ** '))from (select sql_id,max(module) module,sum(elapsed_time_delta) elap,sum(cpu_time_delta) cput,sum(executions_delta) execfrom dba_hist_sqlstatwhere dbid = &dbidand instance_number = &instance_numberand&beg_snap_id<snap_idand snap_id<= &end_snap_idgroupby sql_id) sqt,dba_hist_sqltextstwhere st.sql_id(+) = sqt.sql_idand st.dbid(+) = &dbidorderbynvl(sqt.elap, -1) desc, sqt.sql_id)whererownum<65and (rownum<= 10or norm_val>1);--提出cpu比较高的语句select *from (selectnvl((sqt.cput / 1000000), to_number(null)), nvl((sqt.elap / 1000000), to_number(null)),sqt.exec,decode(sqt.exec,0,to_number(null),(sqt.cput / sqt.exec / 1000000)), (10000 *2*(sqt.elap/1000000/(SELECTsum(e.VALUE) - sum(b.value)FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT eWHERE B.SNAP_ID = &beg_snap_idAND E.SNAP_ID = &end_snap_idAND B.DBID = &dbidAND E.DBID = &dbidAND B.INSTANCE_NUMBER = &instance_numberAND E.INSTANCE_NUMBER = &instance_numberand e.STAT_NAME = 'DB time'and b.stat_name = 'DB time'))) norm_val,sqt.sql_id,to_clob(decode(sqt.module,null,null,'Module: ' || sqt.module)),nvl(st.sql_text, to_clob('** SQL Text Not Available **')) from (select sql_id,max(module) module,sum(cpu_time_delta) cput,sum(elapsed_time_delta) elap,sum(executions_delta) execfrom dba_hist_sqlstatwhere dbid = &dbidand instance_number = &instance_numberand&beg_snap_id<snap_idand snap_id<= &end_snap_iddba_hist_sqltextstwhere st.sql_id(+) = sqt.sql_idand st.dbid(+) = &dbidorderbynvl(sqt.cput, -1) desc, sqt.sql_id)whererownum<65and (rownum<= 10or norm_val>1);--提出Buffer_Gets比较高的语句select *from (select sqt.bget,sqt.exec,decode(sqt.exec, 0, to_number(null), (sqt.bget / sqt.exec)), (100 * sqt.bget) /(SELECTsum(e.VALUE) - sum(b.value)FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT eWHERE B.SNAP_ID = &beg_snap_idAND E.SNAP_ID = &end_snap_idAND B.DBID = &dbidAND E.DBID = &dbidAND B.INSTANCE_NUMBER = &instance_numberAND E.INSTANCE_NUMBER = &instance_numberand e.STAT_NAME = 'session logical reads'and b.stat_name = 'session logical reads') norm_val,nvl((sqt.cput / 1000000), to_number(null)),nvl((sqt.elap / 1000000), to_number(null)),sqt.sql_id,to_clob(decode(sqt.module,null,null,'Module: ' || sqt.module)),nvl(st.sql_text, to_clob('** SQL Text Not Available **')) from (select sql_id,max(module) module,sum(buffer_gets_delta) bget,sum(executions_delta) exec,sum(cpu_time_delta) cput,sum(elapsed_time_delta) elapfrom dba_hist_sqlstatwhere dbid = &dbidand instance_number = &instance_numberand&beg_snap_id<snap_idand snap_id<= &end_snap_iddba_hist_sqltextstwhere st.sql_id(+) = sqt.sql_idand st.dbid(+) = &dbidorderbynvl(sqt.bget, -1) desc, sqt.sql_id) whererownum<65and (rownum<= 10or norm_val>1);二、比较常用的sql优化方案1、观察sql语句是否存在语法逻辑方面的问题。

2、通过语句(select sql_id,name,datatype_string,value_string fromv$sql_bind_capture where sql_id = '';)查询出sql语句的绑定变量值,带入参数后观察其执行计划,定位sql语句耗费资源的点。

3、若sql语句执行计划显示为全表扫描,通过语句(selectCOLUMN_NAME,NUM_DISTINCT,DENSITY,NUM_NULLS,to_char(last_analyzed, 'yyyy-mm-dd hh24:mi:ss') from dba_tab_columns where table_name='' and owner = '';)查询出表的统计信息,通过统计信息确定优化方案,若查询出统计信息为空,则需要对该表做表分析,生成新的统计信息,做表分析的意义在于收集表和索引的信息,CBO根据这些信息决定SQL最佳的执行路径。

通过对表的分析,可以产生一些统计信息,通过这些信息oracle的优化程序可以优化。

4、关于存储过程中语句的优化,一般存储过程语句比较多,我们在优化之前可以带入参数先对该存储过程分步执行一次,在执行过程中执行很慢的语句先记录,然后再专门对这类语句进行优化。

三、举例说明1、需要优化的sqlSELECT "CONTEXT_ID","RECEIVE_DATE","DEAL_DATE","RESULT_CODE","CREDIT_CONTROL","STATE_DATE"FROM "BILL"."SESSION_STATUS" "A1"WHERE "STATE_DATE" <= :1AND "STATE_DATE" <= :2AND "CONTEXT_ID" ISNOTNULL其执行计划如图所示,该语句where条件应该有问题,包含两个‘STATE_DATE<‘’’,同样的where条件出现两次毫无意义,属于逻辑错误,很容易判断出该错误;观察该语句执行计划为全表扫描,未用到索引,查询表的统计信息为空,如图所示,可判断很长时间未对该表做表分析,因此需要对该表做表分析,再根据其统计信息结果建立优化方案。

相关文档
最新文档