Oracle获取执行计划的几种方法
为了获取缓存库中的执行计划,可以直接查询动态性能视图v$sql_plan和v$sql_plan_statistics_all等,但更方便的方法是以sql_id和子 1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中。首先,在你要执行的SQL语句前加explain plan for,此时将生成的执行计划存储到计划表中,语句如下: explain plan for SQL语句 然后,在计划表中查询刚刚生成的执行计划,语句如下: select * from table(dbms_xplan.display);注意:Explain plan只生成执行计划,并不会真正执行SQL语句,因此产生的执行计划有可能不准,因为:1)当前的环境可能和执行计划生成时的环境不同;2)不会考虑绑定变量的数据类型;3)不进行变量窥视。 2. 查询内存中缓存的执行计划 (dbms_xplan.display_cursor)如果你想获取正在执行的或刚执行结束的SQL语句真实的执行计划(即获取library cache中的执行计划),可以到动态性能视图里查询。方法如下:1)获取SQL语句的游标游标分为父游标和子游标,父游标由sql_id(或联合address和hash_value)字段表示,子游标由child_number字段表示。如果SQL语句正在运行,可以从v$session中获得它的游标信息,如: select status, sql_id, sql_child_number from v$session where status='ACTIVE' and ....如果知道SQL语句包含某些关键字,可以从v$sql视图中获得它的游标信息,如: select sql_id, child_number, sql_text from v$sql where sql_text like '%关键字%‘2)获取库缓存中的执行计划 为了获取缓存库中的执行计划,可以直接查询动态性能视图v$sql_plan和v$sql_plan_statistics_all等,但更方便的方法是以sql_id和子游标为参数,执行如下语句: select * from table(dbms_xplan.display_cursor('sql_id',child_number)); 3)获取前一次的执行计划: set serveroutput off select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));3. 查询历史执行计划(dbms_xplan.display_awr)AWR会定时把动态性能视图中的执行计划保存到dba_hist_sql_plan视图中,如果你想要查看历史执行计划,可以采用如下方法查询: select * from table(dbms_xplan.display_awr('sql_id');4. 在用sqlplus做SQL开发是(Autotrace)set autotrace是sqlplus工具的一个功能,只能在通过sqlplus连接的session中使用,它非常适合在开发时测试SQL语句的性能,有以下几种参数可供选择: SET AUTOTRACE OFF ---------------- 不显示执行计划和统计信息,这是缺省模式 SET AUTOTRACE ON EXPLAIN ------ 只显示优化器执行计划 SET AUTOTRACE ON STATISTICS -- 只显示统计信息 SET AUTOTRACE ON ----------------- 执行计划和统计信息同时显示 SET AUTOTRACE TRACEONLY ------ 不真正执行,,只显示预期的执行计划,同explain plan5. 生成Trace文件查询详细的执行计划 (SQL_Trace, 10046)SQL_TRACE作为初始化参数可以在实例级别启用,也可以只在会话级别启用,在实例级别启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在一般情况下,我们使用sql_trace跟踪当前进程,方法如下:SQL>alter session set sql_trace=true; ...被跟踪的SQL语句... SQL>alter session set sql_trace=false; 如果要跟踪其它进程,可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION来实现,例如: SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true) --开始跟踪 SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,false) --结束跟踪生成trace文件后,再用tkprof 工具将sql trace 生成的跟踪文件转换成易读的格式,语法如下: tkprof inputfile outputfile 10046事件是SQL_TRACE的一个升级版,它也是追踪会话,生成Trace文件,只是它里面的内容更详细,
那位大师能提供李商隐的《上崔华州书》译文
上崔华州书
中丞阁下,愚生二十五年矣。五年读经书,七年弄笔砚,始闻长老言,学道必求古,为文必有师法。常悒悒不快,退自思曰:“夫所谓道,岂古所谓周公、孔子者独能邪?盖愚与周孔俱身之耳。”以是有行道不系今古,直挥笔为文,不能攘取经史,讳忌时世。百经万书,异品殊流,又岂能意分出其下哉。凡为进士者五年。始为故贾相国所憎,明年病不试,又明年复为今崔宣州所不取。居五年间,未曾衣袖文章,谒人求知,必待其恐不得识其面,恐不得读其书,然后乃出。呜呼!愚之道可谓强矣,可谓穷矣。宁济其魂魄,安养其气志,成其强,拂其穷,惟阁下可望。辄尽以旧所为发露左右,恐其意犹未宣泄,故复有是说。某再拜。
Oracle中获取执行计划的几种方法分析
以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍 需要的朋友可以参考下 预估执行计划 Explain Plan Explain plan以SQL语句作为输入 得到这条SQL语句的执行计划 并将执行计划输出存储到计划表中 首先 在你要执行的SQL语句前加explain plan for 此时将生成的执行计划存储到计划表中 语句如下 explain plan for SQL语句 然后 在计划表中查询刚刚生成的执行计划 语句如下 select * from table(dbms_xplan display); 注意 Explain plan只生成执行计划 并不会真正执行SQL语句 因此产生的执行计划有可能不准 因为 )当前的环境可能和执行计划生成时的环境不同 )不会考虑绑定变量的数据类型 )不进行变量窥视 查询内存中缓存的执行计划 (dbms_xplan display_cursor) 如果你想获取正在执行的或刚执行结束的SQL语句真实的执行计划(即获取library cache中的执行计划) 可以到动态性能视图里查询 方法如下 )获取SQL语句的游标 游标分为父游标和子游标 父游标由sql_id(或联合address和hash_value)字段表示 子游标由child_number字段表示 如果SQL语句正在运行 可以从v$session中获得它的游标信息 如 select status sql_id sql_child_number from v$session where status= ACTIVE and 如果知道SQL语句包含某些关键字 可以从v$sql视图中获得它的游标信息 如 select sql_id child_number sql_text from v$sql where sql_text like %关键字%‘ )获取库缓存中的执行计划 为了获取缓存库中的执行计划 可以直接查询动态性能视图v$sql_plan和v$sql_plan_statistics_all等 但更方便的方法是以sql_id和子游标为参数 执行如下语句 select * from table(dbms_xplan display_cursor( sql_id child_number)); )获取前一次的执行计划 set serveroutput off select * from table(dbms_xplan display_cursor(null null ALLSTATS LAST )); 查询历史执行计划(dbms_xplan display_awr) AWR会定时把动态性能视图中的执行计划保存到dba_hist_sql_plan视图中 如果你想要查看历史执行计划 可以采用如下方法查询 select * from table(dbms_xplan display_awr( sql_id ); 在用sqlplus做SQL开发是(Autotrace) set autotrace是sqlplus工具的一个功能 只能在通过sqlplus连接的session中使用 它非常适合在开发时测试SQL语句的性能 有以下几种参数可供选择 SET AUTOTRACE OFF 不显示执行计划和统计信息 这是缺省模式 SET AUTOTRACE ON EXPLAIN 只显示优化器执行计划 SET AUTOTRACE ON STATISTICS 只显示统计信息 SET AUTOTRACE ON 执行计划和统计信息同时显示 SET AUTOTRACE TRACEONLY 不真正执行 只显示预期的执行计划 同explain plan 生成Trace文件查询详细的执行计划 (SQL_Trace ) SQL_TRACE 作为初始化参数可以在实例级别启用 也可以只在会话级别启用 在实例级别启用SQL_TRACE会导致所有进程的活动被跟踪 包括后台进程及所有用户进 程 这通常会导致比较严重的性能问题 所以在一般情况下 我们使用sql_trace跟踪当前进程 方法如下 SQL>alter session set sql_trace=true; 被跟踪的SQL语句 SQL>alter session set sql_trace=false; 如果要跟踪其它进程 可以通过Oracle提供的系统包DBMS_SYSTEM SET_SQL_TRACE_IN_SESSION来实现 例 如 SQL> exec dbms_system set_sql_trace_in_session(sid serial# true) 开始跟踪 SQL> exec dbms_system set_sql_trace_in_session(sid serial# false) 结束跟踪 lishixinzhi/Article/program/Oracle/201311/19003
海量数据库解决方案的介绍
本书将整体内容分为两部分,在第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的正确理解为基础,提出对执行计划和执行速度产生最大影响的索引构建战略方案;在第2部分中主要介绍提高数据读取效率的具体战略方案,在这部分中介绍与数据读取效率相关的局部范围扫描的原理和具体应用方法,以及对被认为是提高数据库使用效率基础的表连接的所有类型予以详细说明。
海量数据库解决方案
《》将整体内容分为两部分,在第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、 特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的正确理解为基础,提出对执行计划和执行速度产生最大影响的索引构建战略方案;在第2部分中主要介绍提高数据读取效率的具体战略方案,在这部分中介绍与数据读取效率相关的局部范围扫描的原理和具体应用方法,以及对被认为是提高数据库使用效率基础的表连接的所有类型予以详细说明。《》系列丛书深受广大读者的喜爱已经长达10年之久,在被誉为圣经的同时,它已经变成了数据库用户不可或缺的必读书籍。作者竭力探求能够让IT工作者在实际工作中轻松应用并掌控的巧妙方法,提供事半功倍的海量数据库解决之道。《》适合数据库开发人员和数据库管理员等阅读。B-Tree索引、B-Tree聚簇索引、哈希聚簇等索引在关系数据库中使用较多。B-Tree索引重复值多,尤其用户为了提高查询速度创建了大量组合索引的时候,处理海量数据时会付出很大代价B-Tree索引要求列具备良好的离散度,只有再次能确保具有较好的读取效率。在索引列的离散度并不是很好的情况下,即使创建了这个索引,优化器可能会忽略这个索引,优化器能够根据统计信息作出判断如果组合索引中的列没有出现在查询条件中,或者在查询条件中把非等值运算符付给了组合索引的中间列时,数据的读取效率往往受到很大影响。解决方法:创建多个组合索引,从而使得同一个列被多次使用在不同索引中B-Tree索引的限制条件就是当使用了由NULL或NOT构成的查询条件,或查询语句中包含复杂的OR时,索引的作用得不到充分的发挥。解决:对所有的查询要求进行全面的分析(驱动查询条件)
海量数据库解决方案的作者序言
这已经是第四次为本书写作者序言了,此时此刻过去20年的生活如同电影般在我的脑海里一一掠过。当我最初决定步入IT领域时就为自己立下了誓言,时至今日回想起多年走过的历程,其间充满了艰辛,也正是这无数的艰辛让我最终体验了收获的愉悦。回望这20多年的足迹,我一直努力用新的视角去观察他人所忽视的领域,尝试用崭新的思维和充满创意的双手去耕耘。尽管如此,也仍然无法紧跟IT技术飞快的发展步伐。我为实现理想而终日不停前行的脚步,虽然忙碌但却无限满足。众所周知,能够加工成宝石的原石比比皆是,一分耕耘,一分收获,每当我们初次接触某个新的东西时都会或多或少有些紧张。因此从这一层面来看,数据库散发着无穷的魅力,它如同渊博精深的智者般质朴,总是以真实、坦诚的心去面对每一位学习和研究它的人。在过去并不短暂的岁月里我一直深信数据库的骨骼就是“数据”,并为这一理论的发展不断努力,吸收同仁们分享的经验而持续奋斗。为了打破始终在理论表面徘徊的固有模式而不断寻求新的尝试,并试图探求能够让IT工作者在实际工作中轻松应用并掌控的巧妙方法。这种巧妙方法不能是只通过经验和试验才能获得的,它必须是利用日常常识就可以理解说明的方法。有这么一句话“会者不难,难者不会”,如果能够把一些复杂的理论与通俗浅显的常识相结合,那么不仅有利于人们的理解,更有利于人们在合适的情况下加以灵活运用。相反,有这么一句话“一知半解以为是”,意思是指那些只观其表不观其里就加以相信的人。很多程序员只忠实地相信自己的经验,当问及为何如此时,大部分人的答案都是“因为我那样做过”或“那样比较好”。10种类型的原理可以组合出10的阶乘(3 628 800)种现象,那么100种类型的原理所能够表现出来的现象数可以认为是一个天文数字。如若仅凭经验去思考问题,无论怎么努力,最终也只能获得其中一部分的原理而已。然而,事实上我们是完全有能力深刻地理解这100种原理的。但如果不试图进行深刻钻研而只停留在表面,最终只能是一无所获。宝石是不会被轻易发现的,只有凭借最大的努力去寻找方能找到。在不知不觉中当我们遇到了从表面上看无法解决的复杂问题时,会出现两种人:其一,是坚持不懈、彻夜不休也要寻找到最佳解决办法的人,这种人通过不懈的努力最终能够获得什么呢?事实上随着岁月的流逝,他们终将成为众人皆知的专家;其二,是认为过于烦琐,直接予以放弃的人,这种人只会让自己的血汗变成廉价的废弃物。可以自豪地说“我付出了常人所无法想象的艰辛”,为了寻求完美的真理舍弃了很多常人的生活。在没有钓到鱼时钓鱼人也许会为此而耿耿于怀,但在我看来问题的关键在于没有寻找到有效的钓鱼方法。如果钓鱼人能够充分理解我的想法,并甘愿为了改变自己的固有观念而付出较大努力,尽管他也可能会为此而花费大量的时间和心血,但坚信他一定能够获得别人所无法获得的成果。如果他研究出了别人所无法研究出的钓鱼方法,那么从此就再也不用为钓不到鱼而担心了。各位读者在工作的同时究竟是否一直在使用一种平凡的方法呢?还是为了解决明天必须要完成的任务而临时抱佛脚呢?它需要紧跟流行的步伐,如不及时进行更新,在不经意之间就已经落伍了。然而数据和数据库并非如此,不论岁月如何流失,我们积攒起来的“内功”是不会消失的。如果能对其原理有一个深刻的理解,那么不论何时何地都能够随心所欲地钓到很多鱼。随着数据库技术的发展进步,能够精确执行指令的DBMS与日俱增,随着对DBMS应用能力的不同所获得的性能差异使我们从技术中获得满足感。不知不觉中《海量数据库解决方案》系列丛书深受广大读者的喜爱已经长达10年之久,截至今日,本书依旧深受广大读者的喜爱。IT领域技术10年的发展状况与其他领域100年的发展状况相当, 在数据库的发展历程中,有一些技术和原理被不断更新,有一些技术和原理被直接替代,也有一些技术和原理始终被维持使用。其中能够被持续使用而没有被改进的,说明它们是完美的,是适应性非常强的。然而,我并没能及时将数据库所提供的新功能的真正含义和特性,及其在实际工作中的灵活运用方法和准则介绍给各位读者,借这次机会向各位忠实的读者表示深深的歉意。我知道很多读者对这本新书寄予了厚望, 相信通过我的努力能够让各位读者如愿以偿。事实上,本人在此期间为了研究数据架构(Data Architecture)的相关理论花费了大量的时间和精力,因为我认为数据架构的重要性和根本性主要体现在它是搜集和管理数据体系的理论,它的目的在于以数据库技术为基础,构建更加深邃、全面的数据体系。并且一些用户还组织了专门的学习小组,我为此而感到非常欣慰。随着信息化进程的不断加快,利用数据库所要管理的数据不仅会显著增多,而且也会变得非常复杂,由此而引发的数据合并、标准化、数据质量等方面的问题也已经到了不得不解决的境地了,实际上可以说是迫在眉睫。因此,构建以监督数据构架是否按照要求构建、完善对数据进行有效控制的元数据系统,已经成了我们所必须完成的迫切任务。幸运的是,很多开发人员和管理人员都对数据构架注入了极大的关心,韩国政府为此专门设置了数据构架资格考试,也正是由于国家和各位IT领域从业者的努力才使得数据构架有了今天的良好发展形势。为了使其得到进一步的发展,我们为此而研究出了更为体系化的理论方法,出版了高质量的书籍,设置了高标准的培训课程,构建出了将数据构架解决方案和相关组件相结合的元数据系统。然而,在我为了推进数据构架的发展而付出大量时间和精力的同时,并没有放弃对数据库的研究。在此期间,我不仅连续不断地向很多用户提供数据库的咨询工作,而且也在不断地研究着新出现的技术。虽然我并没有公开地出版新书,但是却编写了大量的研究材料,并将其中相当大一部分在公司韩国数据库振兴院的主页上公开发表。尽管如此。经过一年的昼夜工作终于完成了本书,并为了在本书中涵盖所有DBMS的“最小公倍数”而付出了很大的努力。虽然在各个DBMS之间多少都有一些差异,但是如果从原理和灵活运用准则的角度来看,它们之间其实并没有太大的差异。如若对所有DBMS的功能进行详细说明,反倒不利于各位读者的理解,所以在本书中以Oracle为基准进行说明的部分比较多。尽管在本书中所使用的描述方法和命令语言主要以Oracle为基准,但所说明的原理和概念适用于所有的DBMS,这就像尽管每一个照相机的具体操作方法都有所不同,但从拍摄照片的角度来看却并没有太大的差异一样。为了帮助各位读者更好地理解和应用本书中所介绍的原理和方法,介绍其被应用在各个不同DBMS中的相关书籍在不久的将来将呈现给各位读者。本书将整体内容分为两个部分,在第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、 特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的正确理解为基础,提出了对执行计划和执行速度产生最大影响的索引构建战略方案。在第2部分中主要介绍提高数据读取效率的具体战略方案。在这部分中,介绍与数据读取效率相关的局部范围扫描的原理和具体应用方法,以及对被认为是提高数据库使用效率基础的表连接的所有类型予以详细说明。在第1部分的第1章中,主要对数据库在存储数据时所使用的基本存储结构进行详细说明。就像人类无法生活在水中,鱼类无法生活在陆地一样,结构上的特征对很多方面都有着根本性、决定性的影响。尽管不同的DBMS所使用的术语有所不同,但是当我们依据其本质进行分类时就会发现所有表现出来的形式都属于同一种类型。在第1部分的第2章中,主要对优化器制定执行计划影响最大的所有索引类型进行详细说明。在此所涉及的索引类型有被广泛使用的最一般的B-Tree索引、在海量数据处理或数据仓库中能够获得较好效果的位图索引、基于虚拟列所创建的多样化的用户自定义函数索引等。在第1部分的第3章中,主要对优化器进行深刻剖析。在此不仅介绍优化器在实现最优化操作时所执行的内部执行步骤,还对作为数据库处理数据步骤的执行计划的各种类型进行了分类说明。如果各位读者能够对各个具体的执行单位有一个很好的理解,那么仍然能够对将其组合在一起的整体执行计划有一个很好的理解。另外,为了引导优化器按照我们所期望的方式制定执行计划,又对各种类型的提示(Hint)进行了说明。在第1部分的第4章中,非常具体地提出了对制定最优化执行计划有着非常大影响的索引构建战略方案。优化器并不能开辟出新的读取路径,而只能在现有的读取路径中选择出比较有效的路径。因为按照本书中所提出的索引构建战略方案所构建出的索引能够改变现有的读取路径,所以如果没有依据此方案来构建战略性的索引,那么数据的读取效率必然会在很大程度上受到影响。在第2部分的第5章中,以对执行计划的正确理解为基础,通过具体事例,对只读取了部分数据就能获得结果的秘诀——局部范围扫描的原理和多样化的应用类型进行了详细说明。在这里从一个新的高度对前面所介绍的方法进行了扩充说明。最后对在各种比较流行的留言板中实现局部范围扫描的方法进行了详细说明。在第2部分的第6章中,对表连接的所有类型进行了详细说明。在这里对作为传统型的表连接方式——嵌套循环连接和排序合并连接,以及能够有效实现海量数据连接目的的哈希连接的相关原理进行了彻底剖析,并提出了多种灵活运用准则。另外,又对以多样化类型出现的半连接和在数据仓库中必须要使用的星型连接,以及星变形连接进行了详细说明。最后附加性地提出了位图连接索引的基本概念和灵活运用方法。在这里向各位读者郑重承诺,我将在尽可能短的时间内完成其他两本系列书籍的编写工作。由于我经常在读者所期待的时间内未能出版约定的书籍,也许各位读者对我如期完成这两本书并不抱太大的希望,所以在这里希望各位读者能够谅解。我在管理自己企业的同时,既要研究新的技术,又要提供解决方案和编写书籍,时间的不足真的让我窘迫和无奈。由于这两本系列书籍会同时在国外出版发行,所以不论我被多少琐事所困扰,都必须在约定的时间内完成编写工作。因此,这次我可以在这里向各位读者郑重承诺,在本书出版发行后我会以最快的速度完成这两本系列书籍的编写工作。只凭借对方法的理解是无法征服数据世界的,即使将本书已经阅读了数十遍也只不过是停留在对其表层内容的理解上而已。所以希望各位读者能够对自己提出更高的要求,不要停留在对表层内容的理解上,而是以对本书中所介绍的所有原理的正确理解为前提,以本书中所提供的案例为参考,在适当的实际案例中加以灵活运用。我希望各位读者能够通过自己的努力和奋斗,发现别人所不能发现的新世界,而不是仅将自己局限于众人都能够看到的世界里。要勇敢地去挑战自己的极限,走向更大的成功。2005年12月13日En-core Consulting代表咨询师 李华植