随笔分类 -  SQL 性能优化

摘要:和ROWNUM一样,ROWID是一个伪列,即是一个非用户定义的列,而又实际存储于数据库之中。每一个表都有一个ROWID列,一个ROWID值用于唯一确定数据库表中的的一条记录。因此通过ROWID 方式来访问数据也是 Oracle 数据库访问数据的实现方式之一。一般情况下,ROWID方式的访问一定以索引访问或用户指定ROWID作为先决条件,因为所有的索引访问方式最终都会转换为通过ROWID来访问数据记录。(注:index full scan 与index fast full scan除外)由于Oracle ROWID能够直接定位一条记录,因此使用ROWID方式来访问数据,极大提高数据的访问效率。. 阅读全文
posted @ 2012-04-18 17:16 ajuanabc 阅读(505) 评论(1) 推荐(0) 编辑
摘要:INDEX FULL SCAN 与 INDEX FAST FULL SCAN两个长相差不多,乃是一母同胞,因此既有其共性,也有其个性。两者来说其共性是不用扫描表而是通过索引就可以直接返回所需要的所有数据。这对提高查询性能而言,无疑是一个难得的数据访问方式之一,因为索引中存储的数据通常是远小于原始表的数据。下面具体来看看两者之间的异同。一、何时INDEX FULL SCAN 或 INDEX FAST FULL SCAN 1、select 与where子句中出现的所有列必须存在索引 2、查询返回的数据行总数占据整个索引10%以上的比率。取决于db_file_multiblock_read_cou. 阅读全文
posted @ 2012-04-12 09:47 ajuanabc 阅读(264) 评论(0) 推荐(0) 编辑
摘要:Oracle SQL语句的运行环境分为多个不同的层次,主要包括实例级别,会话级别,语句级别,其优先级依次递增。即语句级别的执行环境具有最高的优先权,会话级别次之,实例级别最低。反过来,实例级别的环境设置影响全局,而会话级别的则影响当前会话,语句级别的设置当然也就只影响当前语句。由此可知,运行环境中每一个环节的参数都对最终的数据库性能或所执行的SQL语句有直接的影响。因此在对数据库优化或调试SQL时,获得当前SQL语句运行环境显得尤为重要。为此,Oracle提供了三个重要的视图来获取不同级别的参数信息。一、优化器性能视图名字--下面的三个性能视图分别对应到不同的级别 scott@ORCL> 阅读全文
posted @ 2012-04-09 19:36 ajuanabc 阅读(245) 评论(0) 推荐(0) 编辑
摘要:在NULL值与索引(一)中讲述了null值与索引的一些基本情况。其主要的内容为,基于允许存在null值的索引列,其索引值不会被存储;其次是由于这个特性导致了我们在使用is null时索引失效的情形;最后则是描述的通过为null值列添加not null约束来使得is null走索引。尽管我们可以通过添加not null来解决is null走索引,当现实中的情况是仍然很多列根本是无法确定的,而必须保持其null特性。对于此种情形该如何解决呢?一、通过基于函数的索引来使得is null使用索引-->演示环境 scott@ORCL> select * from v$version wher 阅读全文
posted @ 2012-04-08 19:04 ajuanabc 阅读(258) 评论(0) 推荐(0) 编辑
摘要:NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种值,通常称为UNKNOWN或空值,即是未知的,不确定的。由于NULL存在着无数的可能,因此NULL值也不等于NULL值,所以与NULL值相关的操作同样都为NULL值。正是基于这样一个特性,对于NULL值列上的B树索引导致了is null/is not null不走索引的情形,下面描述了NULL值与索引以及索引NULL列上的执行计划,如何使得NULL值走索引的情形。注:本文仅仅讨论的是B树索引上的NULL值,位图索引不在此范围之内。一、null值与索引的关系scott@ORCL> create ta 阅读全文
posted @ 2012-04-08 13:22 ajuanabc 阅读(331) 评论(0) 推荐(0) 编辑
摘要:SQL是的全称是Structured Query Language(结构化查询语言)。SQL是一个在80年代中期被使用的工业标准数据库查询语言。不要把SQL语言与商业化产品如Microsoft SQL server或开源产品MySQL相混淆。所有的使用SQL缩略词的这些都是SQL标准的一部分。一、SQL tuning之前的调整 下面这个粗略的方法能够节省数千小时乏味的SQL tuning,因为一旦调整它将影响数以百计的SQL查询。记住,你必须优先调整它,否则后 续的优化器参数改变或统计信息可能不会有助于你的SQL调整。 记住,你应当总是优先考虑系统级别的SQL tuning,否则在SQL t. 阅读全文
posted @ 2012-04-02 19:54 ajuanabc 阅读(127) 评论(0) 推荐(0) 编辑
摘要:No SQL,No cost. SQL语句是造成数据库开销最大的部分。而不良SQL写法直接导致数据库系统性能下降的情形比比皆是。那么如何才能称得上高效的SQL语句呢?一是查询优化器为当前的SQL语句生成最佳的执行计划,保证数据读写使用最佳路径;二是设置合理的物理存储结构,如表的类型,字段的顺序,字段的数据类型等。本文主要描述如何编写高效的SQL语句并给出示例。下面的描述主要分为三个部分,一是编写高效SQL语句,二是使用索引提高查询性能的部分,三是总结部分。一、编写高效SQL语句1) 选择最有效的表名顺序(仅适用于RBO模式) ... 阅读全文
posted @ 2012-03-29 13:11 ajuanabc 阅读(145) 评论(0) 推荐(0) 编辑
摘要:游标在数据库领域被广泛使用,尤其是对于需要将SQL语句返回的数据集进行逐行处理的时候。这为数据处理提供了极大的便利性,然游标的不当使用从某种程度上而言会降低数据库的性能。下面的是一个来自生产环境的实际例子,由于使用了参数游标,所以引发了多次遍历。一、源代码-->下面的procedure用于为trade生成一个新的contract_num,并将其更新到对应的记录PROCEDURE assign_contract_num( businessdate_in trade_client_tbl.trade_date%TYPE, err_num OUT NUMBER, err_msg OUT VAR 阅读全文
posted @ 2012-03-16 15:28 ajuanabc 阅读(325) 评论(0) 推荐(0) 编辑
摘要:通常情况下数据库引擎每访问一个数据块将产生至少一个逻辑读。而行预取与逻辑读息息相关。行预取是指当客户端从数据库获取数据时可以采用单行也可以采用多行方式返回数据。当采用多行方式时,则会预取多条记录存储在客户端内存中以避免后续多次该数据的请求所致的各种开销(LIO,PIO,NET IO)。一般预取行数越大,则所产生的开销越小,当达到临界值时其变化不大。一、演示1、创建演示表 scott@CNMMBO> select * from v$version where rownum<2; BANNER ---------------------------------------------- 阅读全文
posted @ 2012-01-13 17:58 ajuanabc 阅读(197) 评论(0) 推荐(0) 编辑
摘要:在SQL tuning中,不良写法导致SQL执行效率比比皆是。最近的SQL tuning中一个外部连接写法不当导致过SQL执行时间超过15分钟左右此即为一例。通过修正该SQL的写法之后,过高的逻辑读呈数量级下降以及SQL语句执行时间也大幅下降。下面给出一个列子来演示该情形。一、创建演示环境-->当前数据库版本 SQL> select * from v$version where rownum<2; BANNER ---------------------------------------------------------------- Oracl... 阅读全文
posted @ 2012-01-05 16:16 ajuanabc 阅读(236) 评论(0) 推荐(0) 编辑
摘要:DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实的执行计划有助于更好的分析SQL语句的全过程,尤其是运行此SQL语句实时的I/O开销。通过对比预估的I/O与真实的I/O开销来判断SQL语句所存在问题,如缺少统计信息,SQL语句执行的次数,根据实际中间结果集的大小来选择合适的连接方式等。本文仅仅讲述display_cursor函数的使用。 有关执行计划中各字段模块的描述请参考: 执行计划中各字段各模块描述 有关由SQL语句来获取执行计划请参考: 使用 EXPLAIN... 阅读全文
posted @ 2011-10-12 16:34 ajuanabc 阅读(235) 评论(0) 推荐(0) 编辑
摘要:DBMS_XPLAN包包括一系列函数,主要是用于显示SQL语句的执行计划,且不同的情形下使用不同的函数来显示,如预估的执行计划则使用display函数,而实际的执行计划则是用display_cursor函数,对于awr中的执行计划,则是用display_awr函数,而SQL tuning集合中的执行计划则由display_sqlset来完成。本文主要描述DBMS_XPLAN包中display函数的使用,尽管可以通过SQL语句来查询缺省表plan_table来获得执行计划,事实上,使用display函数更便捷,且display函数提供了多种不同的显示格式。 有关执行计划中各字段模块的描... 阅读全文
posted @ 2011-10-12 16:26 ajuanabc 阅读(454) 评论(0) 推荐(0) 编辑
摘要:在SQL语句的执行计划中,包含很多字段项和很多模块,其不同字段代表了不同的含义且在不同的情形下某些字段、模块显示或不显示,下面的描述给出了执行计划中各字段的含义以及各模块的描述。 有关执行计划中各字段模块的描述请参考: 执行计划中各字段各模块描述 有关由SQL语句来获取执行计划请参考: 使用 EXPLAIN PLAN 获取SQL语句执行计划 有关使用autotrace来获取执行计划请参考:启用 AUTOTRACE 功能 有关display_cursor函数的使用请参考: dbms_xplan之display_cursor函数的使用一、执行计划中各字段的描述1、基本字段(总是可用的) Id... 阅读全文
posted @ 2011-10-10 17:27 ajuanabc 阅读(216) 评论(0) 推荐(0) 编辑
摘要:在索引列上使用函数使得索引失效的是常见的索引失效原因之一,因此尽可能的避免在索引列上使用函数。尽管可以使用基于函数的索引来解决索引失效的问题,但如此一来带来的比如磁盘空间的占用以及列上过多的索引导致DML性能的下降。本文描述的是一个索引列上使用函数使其失效的案例。一、数据版本与原始语句及相关信息1.版本信息SQL> select * from v$version; BANNER ... 阅读全文
posted @ 2011-10-08 11:48 ajuanabc 阅读(264) 评论(0) 推荐(0) 编辑
摘要:SQL查询语句的性能从一定程度上影响整个数据库的性能。很多情况下,数据库性能的低下差不多都是不良SQL语句所引起。而SQL语句的执行计划则决定了SQL语句将会采用何种方式从数据库提取数据并返回给客户端,本文描述的将是如何通过EXPLAIN PLAN 获取SQL语句执行计划来获取SQL语句的执行计划。一、获取SQL语句执行计划的方式 1. 使用explain plan 将执行计划加载到表plan_table,然后查询该表来获取预估的执行计划 2. 查询动态性能视图v$sql_plan,v$sql_plan_statistics,v$sql_workarea 等来获取已缓存到库缓存中的真实执行计. 阅读全文
posted @ 2011-09-30 16:03 ajuanabc 阅读(400) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示