存储过程高频面试题及详细答案(实战口语版)_第1页
存储过程高频面试题及详细答案(实战口语版)_第2页
存储过程高频面试题及详细答案(实战口语版)_第3页
存储过程高频面试题及详细答案(实战口语版)_第4页
存储过程高频面试题及详细答案(实战口语版)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

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

文档简介

存储过程高频面试题及详细答案(实战口语版)一、基础认知类(入门必问)1、什么是存储过程?简单说下你的理解参考答案:存储过程就是把一堆经常用到的SQL语句,封装在数据库里的一段“可编程代码块”。可以理解成数据库层面的自定义方法/函数。它支持逻辑判断、循环、变量、事务,写完之后可以直接调用,不用每次重复写一大段SQL,大部分业务复杂的批量操作、数据统计、数据同步都会用它。2、存储过程和普通SQL语句相比,有什么优缺点?参考答案:优点:1、执行效率更高。存储过程编译后会缓存执行计划,后续调用不用重新解析编译,批量操作优势很明显;2、代码复用性好。通用的查询、统计、数据处理逻辑,封装后全项目可以共用,不用每个业务重复写SQL;3、安全性更好。可以直接给用户开放存储过程调用权限,不开放底层表的读写权限,保护原始数据;4、减少网络开销。复杂批量操作只需要调用一次存储过程,不用程序循环传大量SQL到数据库。缺点:1、可移植性差。不同数据库的存储过程语法不通用,MySQL、Oracle、SQLServer写法差异很大,换数据库基本要重写;2、维护成本高。业务逻辑堆在数据库里,代码和业务耦合严重,版本迭代、bug排查比业务代码麻烦;3、调试不方便。不像Java、Python代码有成熟的调试工具,存储过程排错、日志记录都比较繁琐;4、占用数据库资源。复杂存储过程长时间执行,会占用数据库CPU和连接,容易影响整体数据库性能。3、存储过程和自定义函数的核心区别?参考答案:这是面试高频对比点,核心区别就这几点:1、返回值不同。函数必须有且只有一个返回值;存储过程没有强制返回值,可以通过输出参数返回多个结果;2、调用方式不同。函数可以嵌入select语句中直接使用;存储过程必须用call单独调用;3、语法限制不同。函数里面不能使用事务、不能执行DML修改数据(部分数据库严格限制);存储过程支持事务、支持增删改查所有操作;4、使用场景不同。函数多用于简单计算、数据查询取值;存储过程用于复杂业务逻辑、批量数据处理、事务操作。4、存储过程有哪些参数类型?分别怎么用?参考答案:主流三种参数类型,以MySQL为例:1、IN输入参数:默认类型。用来接收外部传入的值,过程内部可以使用、修改,但修改后不会传回外部;2、OUT输出参数:专门用来返回结果。内部修改参数值,执行结束后会把值传回调用方,初始值为null;3、INOUT输入输出参数:兼具两者功能。既可以接收外部传入的值,内部修改后又能回传给调用方。二、进阶语法与原理类(中级面试)1、存储过程的执行计划会缓存吗?会不会失效?参考答案:会缓存。存储过程第一次调用时,数据库会解析、校验、生成执行计划并缓存,后续调用直接复用,这也是它效率高的核心原因。但缓存会失效,常见场景:1、对应的数据表结构发生变更(增删字段、改索引、改字段类型);2、手动重新编译、删除重建存储过程;3、数据库重启、缓存刷新;4、大量数据变动,数据库自动触发执行计划更新。2、存储过程中事务怎么处理?嵌套事务有什么问题?参考答案:存储过程里可以正常写事务,手动开启begin,执行完commit,出错就rollback。可以搭配异常捕获,保证业务要么全部成功、要么全部回滚。嵌套事务最大的坑:MySQL没有真正的嵌套事务。内层事务开启后,本质还是外层同一个事务,内层commit/rollback会直接影响外层。如果内层报错回滚,外层所有操作都会失效,很容易造成数据错乱。实际开发中,基本不写嵌套事务,都是统一外层控制事务。3、存储过程如何捕获异常?异常处理一般怎么写?参考答案:以MySQL为例,用DECLAREHANDLER捕获异常。日常开发标准写法:捕获SQL异常,触发后回滚事务、记录错误信息、退出流程。常用场景:定义异常处理器,遇到任何SQL错误,立即执行rollback,避免部分数据提交、部分失败的脏数据问题。另外可以定义变量接收错误信息,方便后续排查问题,这是生产环境存储过程的必备写法。4、为什么现在很多公司不推荐大量使用存储过程?参考答案:这是实战高频反问题,核心是架构分层和运维风险:1、不符合分层思想。业务逻辑应该放在应用层,全部堆在数据库层,会导致数据库压力过大,数据库本应该只负责存储和简单查询;2、扩容困难。应用服务可以集群扩容、分布式部署,但数据库扩容成本极高,存储过程吃满数据库性能后,很难横向拓展;3、排查问题难。线上接口报错,应用层有日志、链路追踪,存储过程报错只有简单日志,定位慢;4、迭代不灵活。服务代码可以热更新、灰度发布,存储过程修改需要上线数据库脚本,风险高、回滚麻烦;5、不利于微服务。微服务讲究单库单服务、解耦,存储过程容易跨表、跨业务耦合,破坏服务独立性。补充:不是完全不用,而是只用来做定时批量任务、数据清洗、报表统计,核心业务逻辑全部放应用层。5、存储过程会产生死锁吗?怎么避免?参考答案:会。存储过程本质是批量执行SQL,只要涉及多表、多行数据的增删改,就会加锁,并发场景下很容易死锁。常见避免方式:1、统一SQL执行顺序。所有更新语句固定表顺序、主键顺序,避免循环等待锁;2、缩小事务粒度。事务里只放核心操作,去掉多余查询、计算,缩短锁持有时间;3、避免一次性批量更新大量数据,拆分批次执行;4、合理设置隔离级别,根据业务不需要最高隔离级别就适当降低。三、实战场景与坑点(高阶面试)1、写存储过程时,你遇到过哪些线上问题?怎么解决的?参考答案(真实面试通用回答,无空话):1、批量更新锁表、超时问题场景:一次性更新上万条数据,锁表时间太长,导致其他接口超时。解决:拆分批次更新,每次更新1000条,循环执行,减少锁持有时间。2、参数传值为空导致查询条件失效场景:输入参数为null时,拼接的SQL条件出错,查不到数据或全量查询。解决:做参数判空处理,动态拼接有效查询条件。3、异常未捕获导致部分数据提交场景:批量执行中途报错,没有异常捕获,前面SQL提交成功、后面失败,产生脏数据。解决:添加全局异常处理器,报错强制回滚。4、存储过程执行缓慢,缓存失效后卡顿场景:表数据量暴涨,旧执行计划失效,首次执行超级慢。解决:定期分析表、更新索引,必要时重建存储过程。2、存储过程中动态SQL怎么写?有什么安全风险?参考答案:动态SQL就是根据传入参数,动态拼接查询、更新语句,适合查询条件不固定的场景。安全核心风险:SQL注入。如果直接拼接用户传入的参数,恶意参数会篡改SQL逻辑。解决方式:不用字符串直接拼接,使用参数占位符传参,过滤特殊字符,杜绝注入。3、存储过程和触发器的区别?各自适用场景?参考答案:1、触发方式不同:存储过程需要手动调用;触发器是表发生增删改后自动触发,无需人工干预;2、可控性不同:存储过程执行时机、频率完全可控;触发器是隐性触发,出问题很难排查,容易莫名消耗数据库性能;3、场景不同:存储过程用于主动批量处理、统计、同步数据;触发器仅用于简单的数据联动记录,比如新增订单自动生成日志,生产中尽量少用触发器。4、线上存储过程执行卡死,你怎么排查?参考答案:按实操排查步骤说,面试官最吃这套:1、先查数据库当前正在执行的线程,找到卡死的存储过程线程ID;2、查看慢查询日志,确认是锁等待、索引失效还是全表扫描导致的慢执行;3、检查是否存在锁等待、死锁,查看锁占用的表和事务;4、如果是长期卡死,先kill掉阻塞线程,恢复业务;5、优化SQL:补索引、拆分批量操作、缩小事务粒度、优化循环逻辑。四、面试加分

温馨提示

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

评论

0/150

提交评论