如何测试PLSQL性能_DBMS_UTILITY.GET_TIME毫秒级耗时计算
DBMS_UTILITY.GET_TIME 返回的是百分之一秒,不是毫秒
不少朋友在调试PL/SQL性能时,都踩过这个坑:想用dbms_utility.get_time来测量毫秒级耗时,结果发现两次调用相减的结果总是整数,数值跳变明显,甚至偶尔还会出现负数。这到底是怎么回事?其实,问题出在对这个函数返回单位的理解上。它返回的并非毫秒,而是「自数据库实例启动以来的百分之一秒(centisecond)」,也就是以10毫秒为单位的计数值。所以,它的最小分辨率就是10ms,而不是我们通常期望的1ms。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

这意味着什么呢?简单来说,如果你的代码执行时间小于10毫秒,GET_TIME很可能返回相同的值,相减结果就是零。如果执行时间落在10到19毫秒之间,它只会显示1;20到29毫秒则显示2……本质上,它是向下取整到最近的10毫秒倍数。因此,有几点需要特别注意:
- 别用它来测量单条SQL或极短的PL/SQL代码块,误差会大到失去参考意义。
- 它更适合粗粒度的对比,比如评估两个存储过程的整体耗时差异是否超过了数十毫秒。
- 跨会话调用时要小心,虽然不同会话看到的时间基准一致,但系统时钟漂移或实例重启都会影响返回的绝对值。
正确计算耗时的写法:相减后乘 10 得到毫秒近似值
虽然无法获得精确的毫秒值,但只要理解了单位,进行合理换算就能得到可用的近似值。这里的关键,与其说是“怎么转换成毫秒”,不如说是“如何避免除法优先级导致的截断错误”和“怎样规避会话状态带来的干扰”。
一个典型的错误写法是:elapsed := end_time - start_time / 100;。这里由于除法优先级更高,会导致计算结果完全错乱。
- 正确的做法是必须先做减法,再乘以10:
elapsed_ms := (end_time - start_time) * 10; - 变量类型推荐使用
NUMBER或PLS_INTEGER,以避免隐式转换可能带来的精度损失。 - 如果想得到更易读的整数结果,可以四舍五入:
ROUND((end_time - start_time) * 10)。 - 需要牢记的是,这样计算出的值仍是近似值,实际误差范围在±5毫秒左右。
比 GET_TIME 更准的替代方案:DBMS_PROFILER 或 DBMS_SESSION
当真正需要定位毫秒级瓶颈时——比如想知道函数内部某一段逻辑具体卡在哪里——DBMS_UTILITY.GET_TIME就显得力不从心了。好在Oracle自带了一些更可靠的分析工具。
DBMS_PROFILER可以逐行统计代码的执行次数和耗时,不过需要经过开启、收集数据、分析结果三个步骤。- 可以用
DBMS_SESSION.SLEEP(0.01)配合GET_TIME来验证时间单位是否生效(注意,SLEEP操作不要在生产环境随意使用)。 - 对于Oracle 12c及以上的版本,推荐使用
DBMS_MONITOR结合ASH(Active Session History)数据,查询V$ACTIVE_SESSION_HISTORY视图中的TIME_WAITED字段,其单位是微秒,精度更高。 - 如果只是简单的脚本调试,其实不如直接使用SQL*Plus的
SET TIMING ON命令,它的底层调用了精度更高的计时器。
容易被忽略的陷阱:时区、RAC 节点、自治事务干扰
看起来只是一个简单的减法运算,但背后其实藏着几个容易踩中的隐蔽雷区。
- 在RAC(Real Application Clusters)环境下,不同节点的
GET_TIME基准时间可能存在微小偏差,因此跨节点进行计时比较并不建议。 - 在自治事务(
AUTONOMOUS_TRANSACTION)中调用GET_TIME,其返回值仍然遵循父会话的时间线,并不会为自治事务提供独立的计时。 - 数据库时间受操作系统时钟影响;如果数据库主机进行了NTP时间校正,
GET_TIME的返回值可能出现突变(虽然不常见,但在设置监控告警时需要留意)。 - 不要在循环中高频调用它——这个函数本身也有开销,频繁调用反而会扭曲被测代码的真实耗时。
说到底,要进行真正的性能压测或深度调优,必须结合AWR报告来分析DB Time和SQL执行计划,而不能仅仅依赖几个GET_TIME的测量点去猜测性能瓶颈所在。
相关攻略
台铃电动车锁车,真的不耗电吗? 关于电动车锁车后是否还在“偷偷”用电,很多用户心里都有个问号。答案很明确:台铃电动车的锁车状态本身,几乎不产生额外电量消耗。其核心在于一套精心设计的电子防盗系统,在锁止后,整车的主供电电路会被立刻切断,只留下防盗模块、钥匙信号接收器等核心安防单元,以极低的功耗维持待命
老年助听器怎么安装后能用吗? 开门见山地说,给长辈选配助听器,可千万别把它当成“即插即用”的普通电子产品。这本质上是一套严谨的医疗康复流程,核心在于“专业验配”与“科学适应”。没有这两步,再好的设备也可能沦为抽屉里的闲置品。 真正的效能发挥,始于一份精准的听力“地图”——通过纯音测听、声导抗等医学检
高考前冲刺口号 话说回来,每年到了这个时节,教室里、走廊上、甚至学生的课桌一角,总能看到一些凝聚着决心与期盼的句子。它们不仅仅是口号,更像是一股无声的力量,在最后关头为学子们注入信念。下面这份汇集了多年备考智慧的清单,或许能为你带来一些启发。 信念与心态篇 1 Everything is poss
班风口号:胜不骄,败不馁,有志不在年高,但求力争上游 “胜不骄,败不馁”这六个字,分量可不轻。它源自《商君书·战法》,原话是“王者之兵,胜而不骄,败而不怨。”这提醒我们,成功时别让骄傲蒙了眼,失败时也别被沮丧拖垮了脚。保持清醒与韧性,才是长久之道。 紧接着的“有志不在年高”,出自《封神演义》。这话说
下学期中班孩子评语1 1、 这孩子聪明又活泼,课堂上总能看到他高高举起的小手,思维活跃得很,发言特别踊跃。做数学题又快又准,小脑袋转得飞快,语言表达能力也强,还经常主动上来给大家讲故事。要是以后能加强小手的锻炼,让它变得更灵巧,那就更棒了,咱们一起朝着心灵手巧的目标加油吧! 2、 小家伙的口才真不错
热门专题
热门推荐
智能文本处理引擎在文本分类中的优点 提到文本分类,很多人首先想到的是海量数据和繁琐的人工标注。但智能文本处理引擎的出现,正在彻底改变这一局面。那么,它究竟带来了哪些实实在在的优势呢?以下几个方面,或许能给你清晰的答案。 高效性 面对成山堆的文本数据,人工逐篇审阅分类的效率瓶颈显而易见。智能文本处理引
快递面单OCR识别:让物流信息“开口说话”的技术 在现代物流体系中,让一纸面单上的信息快速、准确地“活”起来,是提升效率的关键。这背后,倚赖的正是光学字符识别技术,也就是我们常说的OCR。这项技术的核心任务很明确:把快递面单上印刷或手写的文字信息,通过图像扫描转化为计算机能直接理解和处理的数字格式,
半监督信息抽取 信息抽取这事儿,如果纯靠人工标注,耗时费力;如果全无监督,效果又难以保证。于是,一种折中且高效的策略应运而生——半监督信息抽取。它巧妙地将监督学习与无监督学习的优势结合了起来。 那么,它具体是如何运作的呢?简单说,就是先由人工“播种”。研究者会预先定义好需要抽取的关系类型,并手动添加
超级自动化平台:企业效率革命的核心引擎 如果说单一的工具是解决特定问题的“螺丝刀”,那么超级自动化平台,就是为企业提供的一整套“智能工具箱”。它并非某项孤立的技术,而是集机器人流程自动化、人工智能、机器学习等多种能力于一身的综合性解决方案。更关键的是,它还集成了低代码开发、智能流程编排与数据分析等功
多平台电商店铺财务账单核对指南 在多个电商平台同时运营店铺,财务账单的核对工作是一项不小的挑战。这事儿有多重要,想必各位掌柜都深有体会。今天,咱们就来系统地聊聊,怎么把这份复杂的工作变得清晰、高效。 一、统一数据格式:打好基础第一步 想象一下,面对来自不同平台、格式各异的报表,光是“对齐口径”就能让





