IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / Incessant: Blog
IT 2009-10-11 22:33:44 / 累计浏览 3,320

说oracle优化之一

这篇讲的是作者在一年内完成超过百项Oracle性能优化的实践复盘。从体系架构的改造、缓存策略的应用,到具体实现方式的调整,乃至添加提示、建立索引等细节调优,文章系统梳理了这些形形色色的案例。作者并未停留在罗列技术点,而是着重提炼了进行有效优化所必须具备的思维与执行路径:如何诊断瓶颈、选择正确的优化层次(是架构、代码还是SQL),以及如何评估改动带来的实际效果。 文章的核心在于将零散的实战经验沉淀为可复用的方法论。它没有泛泛而谈理论,而是基于“解决真实生产问题”这一主线,穿插了具体的优化措施与背景。例如,如何权衡架构改动带来的长期收益与短期风险,或者一个简单的索引变更背后需要考虑哪些因素。对于面临类似挑战的数据库工程师或开发者来说,这篇总结提供了宝贵的实践视角和决策参考。

本机暂存
IT 2009-10-11 22:33:18 / 累计浏览 3,960

Mysql如何使用内存

这篇文章讲的是MySQL数据库底层的内存使用机制。作者从MySQL服务器整体的内存结构出发,重点剖析了每个数据库连接(session)所占用的内存是如何分配和管理的。 文章的核心在于对比MySQL中几种不同的内存类型。它详细说明了像“连接缓冲区”、“排序缓冲区”这类每个session独有的内存区域,其特点是随连接创建而分配,随连接关闭而释放。同时,文章也指出了与之相对的、所有连接共享的“全局内存区域”,例如最著名的InnoDB缓冲池,这部分内存的分配和释放策略与session内存截然不同。 作者通过具体的参数(如`join_buffer_size`、`sort_buffer_size`)和场景,解释了不合理的内存设置可能带来的影响,比如并发连接数过高时,每个session的私有内存累加可能导致系统内存迅速耗尽,从而引发性能问题甚至崩溃。这帮助开发者理解,为什么有时单纯增加物理内存并不能线性提升数据库性能,关键在于内存的使用方式。 文章没有停留在概念层面,而是引导读者去思考:如何根据实际的业务负载和连接模式,来平衡全局共享内存与session私有内存的比例。这对于进行数据库性能调优和容量规划的工程师来说,提供了清晰的决策思路。

本机暂存
IT 2009-10-11 22:32:51 / 累计浏览 3,660

Mysql中如何批量生成脚本

这篇讲的是如何高效地从MySQL数据库批量生成所需的SQL脚本,例如建表语句、数据导出脚本等。 作者直接从命令行操作切入,展示了利用`mysql`客户端结合特定参数(如`-e`执行命令或利用系统表)来实现脚本的自动化生成。相比于手动编写或单个表导出,这种方法特别适合需要一次性处理大量数据库对象的场景,比如在数据迁移、环境复制或生成标准化备份脚本时,能极大提升工作效率和准确性。 文章的核心在于介绍一个实用的运维技巧,即通过一条或几条组合命令,让数据库自己“说出”其结构或内容,从而生成可重复执行的脚本。对于经常需要维护数据库或进行跨环境部署的开发者和DBA来说,这个方法能有效避免人工操作遗漏,是工具箱里一个值得掌握的小利器。

本机暂存
IT 2009-10-11 22:32:05 / 累计浏览 4,120

Shared pool和library cache latch

这篇技术文章聚焦于Oracle数据库中一个关键却常被忽略的底层机制:Shared pool latch。作者从其核心作用切入——它主要负责保护共享池的内部结构,在内存分配、释放乃至老化处理时都需要被获取,是维护共享池稳定性的关键“门锁”。 文章清晰地梳理了一个重要的技术演进。在Oracle 9i版本之前,整个共享池由单一的Shared pool latch统一保护。而自9i开始,Oracle引入了多子池(sub pool)设计:当服务器CPU核心数超过4个,且`shared_pool_size`设置大于250MB时,共享池会被动态划分为多个子池(最多7个),每个子池拥有独立的内存结构、LRU列表以及自己的latch。这意味着对共享池的操作竞争,从单一的“瓶颈”被分散到了多个子池的latch上,从而提升了在高并发环境下的性能。 此外,文章也指出了人工干预的可能性,管理员可以通过`_kghdsidx_count`参数来手动设定子池的数量,为性能调优提供了一个更精细的调控点。对于理解Oracle内存管理机制和进行性能诊断的DBA来说,厘清这一 latch 的作用与演变历史,是诊断共享池竞争问题的重要基础。

本机暂存
IT 2009-10-11 22:31:21 / 累计浏览 6,780

如何建立合适的索引?

这篇文章从一个典型的运维场景出发:当你在 statspack 报表中发现逻辑读、物理读极高的 SQL,分析过表统计信息且执行计划已走索引时,该如何进一步判断其是否真正优化?作者没有停留在表面指标,而是深入探讨了在“看似合理”的表象下,如何验证索引选择的效能与 SQL 语句执行质量之间的深层关联。 文章的核心在于提供一种系统性的诊断思路,而不仅仅是工具使用教程。它引导读者超越“是否走了索引”这个二元判断,去追问索引类型(比如是否是覆盖索引)、访问路径(如回表次数)、以及索引效率与数据分布的实际匹配度。通过对这些细节的剖析,文章旨在帮助读者建立一套从性能现象反推至设计根源的完整优化逻辑。 读完能感受到,真正的优化工作往往从那些“看起来已经优化过了”的地方开始。它教会我们如何拆解一个“标准答案”,并在实际业务场景中做出更精准、更有效的判断,这对于任何需要与数据库性能打交道的工程师来说,都是一次扎实的思维训练。

本机暂存
IT 2009-10-11 22:30:14 / 累计浏览 4,460

我这几年

作者从大学时代对联想、方正这些“洋气”大公司的憧憬谈起,回忆了自己毕业后意外加入方正春元的幸运经历——没有复杂面试,因为公司急需人手而直接入职。这篇小文的核心,并非讲述一个逆袭的职场故事,而是借由这段初期经历,剖析了“第一份工作”的潜在价值。 大公司带来的系统性训练让他印象深刻:从做人做事的规范,到学习方法、客户沟通技巧,甚至每日工作日志的要求,这些看似刻板的流程,实则为他搭建了职业世界的底层框架。作者认为,正是这段经历让他“明白了以后要做什么”,其重要性甚至超越了技能本身。 这段平实的回顾提醒我们,职业生涯的起点或许不在于岗位的光鲜,而在于能否获得一次完整的、结构化的职业启蒙。它帮助新手从“学生思维”切换到“职业思维”,看清自己未来的方向——这可能是比起薪更宝贵的初始馈赠。

本机暂存
IT 2009-10-11 22:29:05 / 累计浏览 3,560

如何使用dbms_stats分析统计信息?

这篇讲的是Oracle数据库中一个非常实用的程序包——dbms_stats的入门使用。作者从Oracle 8i版本引入dbms_stats这一背景切入,提到它如今已广泛推荐用来替代传统的analyze命令,主要优势在于让统计信息的生成与处理变得更加便捷高效。 文章简明地梳理了dbms_stats的基本定位:它不仅仅是一个工具,更是现代Oracle优化器赖以准确评估SQL执行计划的数据基石。作者分享了自己的学习笔记视角,没有停留在概念堆砌,而是隐含地指向了一个关键对比——与analyze命令相比,dbms_stats在并行处理、分区统计以及历史信息管理等方面都更为强大和灵活,这也解释了为何它能逐渐成为行业标准。 对于希望理解优化器工作原理或进行SQL调优的DBA与开发者而言,掌握dbms_stats是必不可少的一环。这篇文章提供了一个清晰的起点,帮助读者从“知道有这么个工具”迈向“理解为何要用它以及如何用好它”,为后续更深入的统计信息管理实践打下基础。

本机暂存
IT 2009-10-11 22:27:37 / 累计浏览 3,420

library cache pin和lock的区别

这篇讲的是Oracle数据库中library cache pin与library cache lock这两个常被混淆的概念。作者从一个经典的面试问题出发,坦言自己曾被难住,并在与同事的深入讨论和查阅官方文档后,终于理清了二者的本质区别。 文章的核心在于细致对比。简单说,lock保护的是对象在共享池中的存在性(如一个游标的打开状态),而pin则保护的是对象本身的内容(如SQL语句的执行计划)不被修改或刷出。关键差异体现在阻塞场景上:lock通常阻塞DDL或依赖管理操作,而pin则直接阻塞那些需要执行SQL的会话。它们就像数据库门卫和内容保镖的不同分工。 作者没有停留在概念,还结合了V$SESSION_WAIT视图的观测,剖析了它们在争用时的不同等待事件。这种从实际讨论到理论梳理,再回归实践验证的路径,为理解Oracle共享池的底层保护机制提供了清晰的逻辑线索。

本机暂存
IT 2009-10-11 22:24:35 / 累计浏览 2,820

Index Full Scans和Fast Full Index Scans的区别

这篇对比了Oracle数据库中两种常见的索引扫描方法:Index Full Scans和Fast Full Index Scans。作者从查询优化的实际需求出发,详细解释了它们的核心差异——Index Full Scans通常通过顺序读取索引块来执行,依赖单块I/O,虽然操作直接,但在处理大量数据时可能效率不高;而Fast Full Index Scans则利用多块读取和并行机制,能显著加快全索引扫描的速度,更适合性能要求高的场景。文章还结合具体例子,比如当SQL查询需要快速获取索引列数据时,Fast Full Index Scans可以减少I/O开销,提升整体响应时间。通过分析各自的实现特点和适用场合,读者可以更灵活地选择合适的方法,避免不必要的性能损耗,从而在数据库调优中做出更精准的决策。

本机暂存
IT 2009-10-11 22:22:55 / 累计浏览 3,560

Oracle9i中如何恢复误删除数据?

这篇讲的是一个让很多DBA或开发人员心头一紧的场景:在Oracle9i环境中,不小心执行了删除操作,导致重要数据丢失。文章聚焦于这个紧急问题,没有泛泛而谈数据库原理,而是直接针对Oracle9i这个特定版本,给出了具体的恢复路径。 核心方法是利用Oracle的闪回查询(Flashback Query)特性,通过查询指定时间点或SCN(系统变更号)的数据状态,来还原误删的记录。文章会详细说明如何精确地构建查询语句,找到数据被删除前的那个“时间切片”,并将其重新插入表中。这对于尚未升级到拥有更完善闪回功能的较新版本的系统来说,是一套非常实用的应急方案。 作者不仅列出了步骤,也提示了该方案生效的几个前提条件,比如Undo表空间需要足够大且保留时间设置得当。这对于实际操作至关重要,避免了用户按照步骤操作却发现数据早已被覆盖的窘境。整体来看,这是一份针对特定版本、解决具体痛点的操作手册。

本机暂存
IT 2009-10-11 22:22:30 / 累计浏览 2,320

pl/sql developer编译存储过程中遇到了ORA-07445错误...

这篇讲的是一个在Oracle 9205环境下,使用PL/SQL Developer或Toad等第三方工具编译存储过程时遇到的诡异故障。作者发现,用这些工具编译时,连接会莫名断开并失败,但切换回sqlplus执行同样的DDL语句却能顺利通过。检查数据库日志后,发现了大量的ORA-07445内存访问错误。 经过排查,作者将问题根源定位为Oracle数据库与特定第三方客户端工具之间的兼容性缺陷,这很可能是Oracle该版本的一个小bug。一个关键的验证线索是:问题只发生在使用第三方工具时,而使用官方的sqlplus则完全正常。作者后续在Oracle的官方支持网站Metalink上检索到了相关案例,证实了这一判断。 这篇文章的价值在于,它记录了一个典型的“工具链”兼容性问题排查思路。当遇到类似的不明确报错时,除了检查代码和权限,更换一个已知稳定可靠的客户端工具进行交叉验证,往往是定位问题的快捷路径。

本机暂存
IT 2009-10-11 22:21:46 / 累计浏览 2,220

利用DBMS_REDEFINITION在线重定义表

这篇讲的是如何在不停机、不中断业务的情况下给数据库表“动手术”。对于那些7×24小时运行的核心业务系统,对一张正在被频繁增删改查的表进行结构修改(比如加列、改数据类型)堪称噩梦,传统的做法往往需要停机维护,造成业务中断。 作者从这个常见的痛点出发,介绍了Oracle从9i版本就提供的一个强大工具——`DBMS_REDEFINITION`包。它的核心思路是“暗度陈仓”:先在后台创建一个与原始表结构一致的“影子表”,在此期间允许业务正常读写原始表。等到“影子表”准备就绪,再通过该包快速将两者交换,并同步期间产生的差异数据。整个过程实现了在线重定义,业务几乎感知不到,巧妙地解决了结构变更与业务连续性之间的矛盾。对于需要高可用保障的DBA和开发来说,这是一个必须掌握的运维技巧。

本机暂存
IT 2009-10-11 12:32:39 / 累计浏览 2,020

如何关闭统计信息自动分析?

这篇讲的是Oracle 10g中一个常被提及却容易误解的功能——统计信息的自动分析。它默认会在每天晚上22点启动一个调度任务,但并非全盘扫描所有表,其设计智慧在于只关注那些行数据变动超过10%的表。这种基于变化率的选择性分析,旨在以较低的资源开销维持优化器的统计信息新鲜度。 然而,任何自动化的机制都可能存在与特定业务场景不适配的情况。比如,对于更新频率极低或变更规律明确的表,定期的自动分析或许并非必需,甚至可能在特定时段引入不必要的负载。文章指出,是否关闭这个功能,没有一刀切的答案。它完全取决于你的数据库负载特征、维护窗口以及对性能波动的容忍度。 因此,作者的建议是回归到自身的需求分析:评估自动分析带来的收益(优化器更准确的统计信息)与潜在的成本(资源消耗、对特定操作的干扰)之间的平衡。这篇内容的价值在于厘清了这个功能“在做什么”,并将最终的决策权交还给了需要结合实际场景判断的数据库管理员。

本机暂存