Oracle性能优化面试题及详细答案(实战版)_第1页
Oracle性能优化面试题及详细答案(实战版)_第2页
Oracle性能优化面试题及详细答案(实战版)_第3页
Oracle性能优化面试题及详细答案(实战版)_第4页
Oracle性能优化面试题及详细答案(实战版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle性能优化面试题及详细答案(实战版)一、基础原理类(高频基础)1、简述OracleSQL执行的完整流程,性能瓶颈一般出现在哪些环节?参考答案:SQL执行核心流程分为:语法语义解析、权限校验、硬/软解析、生成执行计划、执行SQL、返回结果、数据写入内存/磁盘。具体步骤:1.客户端发起SQL请求,数据库校验语法、表、字段、权限合法性;2.查找共享池,判断SQL是否存在缓存执行计划,命中则软解析,未命中则硬解析;3.优化器根据统计信息、索引、数据量生成最优执行计划;4.按照执行计划读取数据(内存缓存优先,无缓存则读磁盘);5.过滤、排序、关联数据,返回结果集,完成事务提交或回滚。常见性能瓶颈环节:硬解析过多、磁盘IO频繁、低效执行计划(全表扫描、错误关联方式)、排序分组消耗过高、锁等待和事务阻塞、共享池内存不足。2、什么是硬解析和软解析?如何减少硬解析?参考答案:硬解析:数据库首次执行某条SQL,无缓存执行计划,需要完整完成解析、优化、生成执行计划、加载到共享池的全过程,消耗CPU和系统资源最高。触发场景:全新SQL、SQL大小写/空格不一致、绑定变量未使用、统计信息过期、参数变更。软解析:SQL文本完全一致,共享池中存在可用的执行计划,直接复用计划执行,仅做简单校验,资源消耗极低。减少硬解析的核心方案:1.统一SQL编写规范,固定大小写、空格、语句格式,避免同款SQL多种写法;2.业务代码强制使用绑定变量,杜绝字符串拼接SQL;3.合理设置共享池大小,避免缓存频繁刷新;4.定期更新统计信息,避免执行计划频繁失效重建;5.关闭不必要的参数,避免游标失效。3、Oracle优化器有哪两种?区别是什么?工作原理?参考答案:Oracle主要包含RBO(规则优化器)和CBO(成本优化器),10g之后默认使用CBO,RBO已基本淘汰。RBO规则优化器:基于固定预设规则选择执行计划,不关注数据量、数据分布,规则优先级固定。缺点是适配性差,大数据量、数据倾斜场景极易生成劣质计划。CBO成本优化器:基于统计信息,计算全表扫描、索引扫描、嵌套循环、哈希连接等不同执行方式的CPU、IO、时间成本,选择总成本最低的执行计划。核心前提:CBO生效必须依赖准确、最新的表和索引统计信息,统计信息过期会直接导致执行计划错误、SQL卡顿。二、索引优化类(面试核心重点)4、Oracle常用索引类型及适用场景?参考答案:1.B树索引(默认):最常用,适用于等值查询、范围查询、排序分组。适合重复度低、基数高的字段,主键、唯一字段优先使用。2.位图索引:适用于字段重复值极高、基数极低的字段,如性别、状态、省份。不适合频繁更新、删除的字段,容易产生索引锁阻塞。3.复合索引:多个字段联合索引,遵循最左前缀原则,适合多字段联合查询场景。4.函数索引:针对查询条件带函数、计算的字段,如whereupper(name)='XXX'、wherecreate_time>trunc(sysdate),避免索引失效。5.唯一索引/主键索引:保证字段唯一性,查询效率极高,主键默认创建B树唯一索引。6.全文索引:用于模糊查询、文本检索场景。5、哪些场景会导致索引失效?(高频必考)参考答案:1.复合索引不满足最左前缀原则,跳过前置字段直接查询后置字段;2.索引字段使用函数、运算、类型转换,如:substr、like'%XXX'、字段+1、字符数字隐式转换;3.使用isnull、isnotnull(普通B树索引不存储空值,会失效);4.使用!=、<>、notin、notexists;5.数据量过大,查询返回表中大部分数据,优化器判定全表扫描成本更低,主动放弃索引;6.统计信息过期、索引失效、索引碎片过多;7.关联查询中,驱动表选择错误,导致索引无法命中。6、什么是索引跳跃扫描、索引快速全扫描?适用场景?参考答案:索引跳跃扫描:针对复合索引,在不满足最左前缀的情况下,优化器跳过前置低基数字段,直接扫描后置索引字段。适用于前置字段重复值极高、后置字段基数高的场景,是Oracle优化器的智能优化方式。索引快速全扫描:直接扫描整个索引块,不访问表数据,效率高于全表扫描。适用于查询字段全部包含在索引中(索引覆盖),无where条件或简单筛选条件的场景。7、如何判断索引是否需要重建?索引碎片怎么处理?参考答案:需要重建索引的场景:1.索引碎片率超过30%,查询效率明显下降;2.表频繁大批量删除、更新,导致索引空洞过多;3.索引高度过高,IO开销增大;4.长期未使用的无效索引,可直接删除释放资源。处理方式:1.索引重建(rebuild):重组索引结构,清理碎片,收缩空间,效率高,适合碎片多的索引;2.索引合并(coalesce):合并相邻索引块,不占用额外空间,适合轻微碎片场景。三、SQL调优核心类8、Oracle三张表关联的执行顺序和优化原则?参考答案:多表关联核心原则:小表驱动大表,先过滤后关联。三张表执行逻辑:优先筛选出数据量最小的结果集作为驱动表,依次关联大表,最大限度减少关联数据量。优化要点:1.筛选条件优先写在where中,提前过滤数据,不要关联后再过滤;2.小表、数据量少、过滤性强的表作为驱动表;3.关联字段必须建立索引;4.避免笛卡尔积,严格限定关联条件;5.大表关联优先使用哈希连接,中小表优先嵌套循环连接。9、三种表连接方式(嵌套循环、哈希、排序合并)的区别和适用场景?参考答案:1.嵌套循环连接(NestedLoop)原理:驱动表逐条循环,匹配被驱动表数据。优点:响应快、内存消耗小;缺点:大表循环效率极低。适用:小表驱动大表、被驱动表关联字段有索引、返回结果集少的场景。2.哈希连接(HashJoin)原理:将小表构建哈希表,大表逐行匹配哈希值。优点:大数据量关联效率极高;缺点:占用内存高。适用:两张大表关联、无有效索引、数据量大的场景(线上大数据查询主流方式)。3.排序合并连接(MergeJoin)原理:两张表先排序,再逐行合并匹配。优点:有序数据效率高;缺点:无排序字段会产生额外排序开销。适用:关联字段已排序、范围查询、有序结果关联场景。10、in、exists、leftjoin如何选型?性能区别是什么?参考答案:1.exists:外表循环、内表匹配,找到即终止匹配,适合大表查小表,数据量大时性能远优于in;2.in:先执行子查询汇总结果,再匹配外表,适合小范围固定值、小数据集查询,大数量场景效率差;3.leftjoin:需要保留左表全部数据、匹配右表数据时使用,适合关联查询、需要补全字段的业务场景,可通过索引优化关联效率。核心总结:小数据用in,大数据用exists,关联查字段用join。11、怎么定位慢SQL?线上排查慢SQL的完整流程?参考答案:排查工具:explainplan执行计划、v$sql、v$sqlarea、v$session、AWR报告、ASH报告。完整排查流程:1.查看数据库整体负载,定位高CPU、高IO、长耗时会话;2.通过v$sql查询执行时间长、逻辑读/物理读高、执行频繁的SQL;3.查看SQL执行计划,判断是否存在全表扫描、无效索引、大量排序、笛卡尔积;4.检查统计信息是否过期,索引是否失效、碎片过多;5.分析SQL写法问题,优化关联、过滤、排序逻辑;6.调整索引、修改SQL、优化参数,复测性能。四、锁、事务与并发优化12、Oracle常见锁类型?行锁和表锁的触发场景?参考答案:常见锁:行级锁、表级锁、共享锁、排他锁、元数据锁。行锁:DML操作精准锁定单行数据,粒度最小、并发最高。触发:update、delete、insert精准操作单条/多条数据。行锁不会阻塞其他行的读写。表锁:锁定整张表,并发极差,线上需杜绝。触发场景:无where条件的update/delete、ddl语句、锁表指令、事务未提交导致行锁升级、位图索引更新冲突。13、什么是死锁?如何排查和解决死锁?参考答案:死锁原理:两个及以上事务互相持有对方需要的锁,同时等待对方释放锁,循环等待导致事务永久阻塞。排查方式:查看alert日志、v$lock、v$session视图,定位阻塞会话和锁资源。解决和预防方案:1.统一业务更新顺序,所有事务更新表、更新数据的顺序保持一致;2.缩短事务时长,避免长事务,及时提交/回滚;3.避免一次性批量更新大量数据,拆分批次操作;4.杀死阻塞会话,快速恢复线上业务。14、长事务的危害及优化方案?参考答案:危害:1.长期持有行锁,引发业务阻塞、锁等待、死锁;2.占用undo日志不释放,导致undo表空间暴涨、快照过旧报错;3.影响数据库备份、归档、日志切换,增加数据库负载。优化方案:1.拆分大事务为小批次事务,批量操作分批提交;2.业务逻辑优化,减少事务内无关代码、网络等待;3.监控长事务,自动告警、及时干预;4.禁止事务内sleep、接口调用、复杂计算。五、数据库参数与硬件优化15、SGA和PGA的作用及调优原则?参考答案:SGA(系统全局区):共享内存区域,所有会话共享,包含数据缓冲区、共享池、日志缓冲区。核心作用:缓存数据、缓存执行计划、减少磁盘IO。PGA(程序全局区):会话私有内存,每个会话独立占用,用于排序、分组、哈希连接、游标操作。调优原则:1.物理内存充足时,优先加大SGA,提升缓存命中率,减少磁盘读取;2.排序、查询业务多的库,合理调大PGA,避免磁盘排序;3.SGA+PGA总和不超过服务器物理内存的70%-80%,防止内存溢出;4.线上生产库开启内存自动管理,兼顾稳定性和性能。16、如何提升数据库缓存命中率?参考答案:1.合理调大数据缓冲区,热点数据尽量常驻内存;2.优化SQL,减少全表扫描、重复扫描无效数据;3.做好索引优化,精准读取所需数据,避免大量无效IO;4.业务层做缓存(Redis),减少数据库查询频次;5.避免频繁清空缓存、频繁重启数据库。六、线上实战场景题(面试加分项)17、同一条SQL,有时候快有时候慢,是什么原因?如何解决?参考答案:核心原因:1.执行计划不稳定,统计信息过期、数据倾斜,导致CBO随机选择优劣不同的计划;2.数据缓存冷热交替,首次执行读磁盘慢,后续缓存命中快;3.线上并发压力波动,高峰期CPU、IO、锁等待高;4.绑定变量窥探问题,不同入参数据分布不同,触发不同执行计划。解决方案:1.定时更新表统计信息,保证数据分布准确;2.锁定稳定的最优执行计划(SQLProfile、基线);3.优化数据倾斜场景,拆分特殊参数业务;4.优化数据库内存参数,保证热点数据常驻缓存。18、大批量导入、更新数据卡顿,如何优化?参考答案:1.批量操作前临时删除无用索引、约束,操作完成后重建,避免索引实时更新消耗资源;2.拆分超大事务,分批提交,减少undo、redo日志压力;3.关闭日志归档(非核心业务)、开启并行DML;4.使用mergeinto批量更新,替代循环单条更新;5.避开业务高峰期执行大批量操作。19、模糊查询like'%xx%'无法走索引,怎么优化?参考答案:1.业务优化,尽量改为右模糊like'xx%',可正常走B树索引;2.建立全文索引,专门适配全模糊检索场景;3.业务层使用Redis、ES做模糊检索,数据库仅做精准查询;4.拆分字段、冗余关键字,规避全模糊查询。20、说说你日常工作中,完整的SQL调优流程?参考答案:1.问题

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论