如何实现高效运维?来谈谈性能优化那些事(含直播回顾 Q&A)
数据库性能问题,常常是困扰 DBA 高效运维的难题之一。如何多角度地帮助 DBA,找到“数据库慢”的原因,保证系统高效、稳定、安全地运行?
2021 年 10 月 14 日,云和恩墨技术顾问,拥有八年 Oracle DBA 工作经验的段徐斌老师,在墨天轮社区带来了一场《性能优化那些事》的精彩直播分享。
本场直播吸引了 800 余人观看,朋友们的提问互动也十分积极热情。小编整理了其中的代表性问题,请段老师为大家作答。同时还在文中附上了本次直播课的视频回放、PPT 课件下载供大家查看下载。
🔗直播资源
📖回答汇总
Q1.数据库文件增长到 100G,前端业务系统运行慢,从数据库角度如何优化?
答:数据库慢主要看等待事件,Bad SQL 由于初期数据量少,不凸显。随着海量数据灌注逐步显现甚至拖垮系统。
Q2.如何确定在哪些列创建索引,使得 sql 语句能高效执行?
答 where 条件使用频繁切离散性高的列,对于两表连接的字段,应该建立索引,如果经常在某表的一个字段进行 Order By 则也可考虑建立索引,where 条件后跟多个联合条件离散高的可以建立联合索引。
Q3.您好段老师,请问 html 版执行计划怎么取?
Q4.有一个大表,数据量大概有 1 亿行,已经做过表分区,会定期收集统计表信息,感觉过一段时间之后,相关联该表的查询就会逐渐变慢,像这种问题有什么好的分析和优化方法吗?
答:主要结合这个表关联的 SQL 的执行计划去优化,要合理设计索引,多表关联看下关联条件及列。
Q5.同一个 sql 并相同的 sql_id 有多个执行计划,这个怎么判断走哪个好?
答:这个涉及 SQL 的绑定执行计划,要结合执行计划来看,首先查看到最优执行计划之后绑定。
Q6. ORACLE 大表到另外一个库,大约 1 亿数据,用什么方法比较好呀?
答:单表的处理可使用数据泵的方式在非生产期间导入,可以 data_only 单独处理数据之后再并行建立索引这样更快,之后记得关闭并行就可,也可以整表数据泵导入导出。
Q7. 数据库命令行执行挺快,应用挺慢,是怎么回事?
答:这种比较常见是要结合其他 SQL,有存储过程不能单独看一个 SQL,应用是多个 SQL 组成的要结合上下文来看。
Q8.统计信息多久收集一次比较合适?尤其是针对大表,该表属于日常业务表,每日业务期间都会有大量的数据更新(insert 和 update)。
答:建议可调用窗口,设置非生产或低生产期间进行自动统计,窗口期系统就会自动找数据量变换大的表进行统计信息。也可以找系统维护窗口期手动统计。
Q9. 如何避免回表?
答:如果有可能的话,尽量只在索引上查询,不用回表或者只少量回表,有效的利用索引,减少回表次数,例如 count 也不要 count(*),依据需求 count 列或者(1)。
Q10. 一台服务器上跑多套数据库时,如何避免一套数据库出现性能问题时影响其他数据库?
答:CPU_COUNT 指定了 Oracle 实例可以同时使用的 CPU 的数量,数据库本身按需求调优 SGA 和 PGA,对于 data 盘来说要按实例区分数据文件更为安全。
Q11. initrans 等值怎么根据业务进行调整,建议原则是什么。
答:对于跑批 update 多并行多的表,要调整 pct_free 和 ini_trans,也不是越大越好,这个主要要看等待事件是否有:enq: TX - allocate ITL entry
Q12. 分区表空间的分区索引如何实现和表所在的表空间进行分离?
答:表空间和索引空间要设置分开。建表的时候表的 TABLESPACE 参数和索引的 TABLESPACE 参数可以手动设置。表空间使用权限要赋给相应 owner
Q13. 老师,刚才讲的是 sqlplus 中使用绑定变量,实际使用中比如在 PL/SQL 中该如何使用绑定变量?
答:Variable 列名 列参数 Exec :列 :=需要的赋值 ,对于使用频率高的 SQL,查询列一样的 SQL 就要绑定变量减少系统压力。
Q14. filesystemio_options 值为 none 有何影响,在 RAC 下需要设置为 setall 吗?
答:RAC 也需要设置,none 是默认的,要启用异步 IO,SETALL 就是在文件系统文件上启用异步和直接 I/O
Q15. 请问统计信息自动收集不开的话有影响吗?
建议依据生产时间开启自动统计信息窗口,手动统计有大表数据变更大的,不好实时更新统计信息,确保统计信息的准确性将直接影响 CBO 优化器对于 SQL 最佳执行计划的判断,影响 SQL 的执行效率。
Q16. ora-600 异常如何分析?
答:这个错误是 oracle 数据库的内部错误代码,他会因不同的问题触发,有些是致命的例如坏块引发的宕机,有些是需要打新的升级包升级的问题不致命例如[15214],分析的话通过结合 600 的异常参数日志 mos 制定处理方法。
Q17. 两张表关联,如何确定驱动表?
答:确定驱动表要结合多个环境,比如大表和小表的连接。比如一张表长度远远大于另一张表,建议从较大的表上驱动。一个表有索引,另一表无索引,无索引的表通常作为驱动表。对于 NESTED LOOPS、HASH JOIN、SORT MERGE JOIN 方式,驱动表选择较小的表放置右端 ,速度会更快
Q18. 一个数据量在 20t 左右的数据库,查询表空间使用率时执行非常慢,需要 1 个小时才能执行出结果,请问老师有没有什么优化的思路?
答:一般是回收站对象太多导致的,清理下回收站 purge dba_recyclebin,或者查看 dba_extents 看慢么?如果查询这个视图慢则和统计信息有关
Q19. 遇到过一个问题,分区表已经分区交换转储过数据,之后表索引和主键也都重建并收集统计信息了,为啥数据量少了反而查询性能上没有太大的提升?
答:查询的性能主要结合执行计划看,数据量不是主要参考条件,设置合适的索引,条件选择,通过执行计划参考回表等参数来看。
Q20. sql 监控工具有推荐的嘛?
可以试用恩墨白求恩,专业的数据库监控监控工具,监控数据库各项指标,对于 SQL 的监控各项都很细致专业。
🎁直播福利
当晚直播间为积极参与互动和问答的朋友送出了精美奖品。👏恭喜:张怀亮、博、张海 三名用户获得墨天轮周边套装(笔记本+鼠标垫),Billy 获得《Oracle 性能优化和诊断案例》实体书籍。
墨天轮,围绕数据人的学习成长提供一站式的全面服务,打造集新闻资讯、在线问答、活动直播、在线课程、文档阅览、资源下载、知识分享及在线运维为一体的统一平台,持续促进数据领域的知识传播和技术创新。
关注官方公众号: 墨天轮、 墨天轮平台、墨天轮成长营、数据库国产化 、数据库资讯
版权声明: 本文为 InfoQ 作者【墨天轮】的原创文章。
原文链接:【http://xie.infoq.cn/article/a5c3c2c9dbb188e6c8cbee1cd】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论