当前位置: 首页 > news >正文

[20260604]简单测试获取sid的最佳方法.txt

[20260604]简单测试获取sid的最佳方法.txt

--//对比测试sys_context('userenv', 'sid') ,userenv('sid'),以及执行sql语句select sid from v$mystat where rownum=1;。
--//那种方法最佳。
--//另外测试分析为什么pdb与cdb下使用sys用户执行select sid from v$mystat where rownum=1;存在巨大差异。

1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.建立测试脚本:
--//SCOTT@book01p> create table job_times (sid number, serial# number,time_ela1 number,time_ela2 number ,start_date timestamp,end_date timestamp,method varchar2(20));
--//Table created.

$ cat z1.txt
set verify off
variable vmethod varchar2(30);
exec :vmethod := '&&2';

insert into job_times values ( sys_context ('userenv', 'sid') ,&3,dbms_utility.get_time ,null , localtimestamp,null ,:v_method) ;
commit ;

declare
v_sid number;
v_d date;
v varchar2(30);
begin
    for i in 1 .. &&1 loop
      &&4 v_sid := sys_context ('userenv', 'sid');
      &&5 v_sid := userenv('sid');
      &&6 select sid into v_sid from v$mystat where rownum=1;
    end loop;
end ;
/

update job_times set time_ela2 = dbms_utility.get_time ,end_date=localtimestamp  where sid=sys_context ('userenv', 'sid') and serial#= &3 and method= :v_method ;
commit;
quit

3.单个会话执行测试:

sqlplus -s -l scott/book@book01p @z1.txt 1e6 sys_context1 1 '' -- --
sqlplus -s -l scott/book@book01p @z1.txt 1e6 userenv1     1 -- '' --
sqlplus -s -l scott/book@book01p @z1.txt 1e6 select1      1 -- -- ''

SCOTT@book01p> select method,count(*),round(avg(TIME_ELA2-TIME_ELA1),0),sum(TIME_ELA2-time_ela1) from scott.job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA2-TIME_ELA1),0) SUM(TIME_ELA2-TIME_ELA1)
-------------------- ---------- --------------------------------- ------------------------
sys_context1                  1                                89                       89
userenv1                      1                               164                      164
select1                       1                              1632                     1632

4.多个会话执行测试:

seq 50 | xargs -IQ -P 50 sqlplus -s -l scott/book@book01p @z1.txt 1e6 sys_context50 Q '' -- -- > /dev/null
seq 50 | xargs -IQ -P 50 sqlplus -s -l scott/book@book01p @z1.txt 1e6 userenv50     Q -- '' -- > /dev/null
seq 50 | xargs -IQ -P 50 sqlplus -s -l scott/book@book01p @z1.txt 1e6 select50      Q -- -- '' > /dev/null

SCOTT@book01p> select method,count(*),round(avg(TIME_ELA2-TIME_ELA1),0),sum(TIME_ELA2-time_ela1) from scott.job_times where method like '%50' group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA2-TIME_ELA1),0) SUM(TIME_ELA2-TIME_ELA1)
-------------------- ---------- --------------------------------- ------------------------
sys_context50                50                              1022                    51110
userenv50                    50                              1917                    95866
select50                     50                             21324                   106622

--//可以看出还是采用sys_context+赋值语句的方法最快。

SCOTT@book01p> select min(start_date),max(end_date) from scott.job_times where method ='select50';
MIN(START_DATE)             MAX(END_DATE)
--------------------------- ---------------------------
2026-06-04 10:21:07.642414  2026-06-04 10:24:48.450645

SYS@book> @ ashtop event 1=1 "timestamp'2026-06-04 10:21:07'" "timestamp'2026-06-04 10:24:49'"
    Total                                                                                                      Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                                      FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------------ ------------------- ------------------- ---------- -------- -----------
     6895    31.1   64% |                                            2026-06-04 10:21:07 2026-06-04 10:24:48       3885      221        4103
     3859    17.4   36% | cursor: pin S                              2026-06-04 10:21:10 2026-06-04 10:24:46          1      211         211
        4      .0    0% | log file parallel write                    2026-06-04 10:21:13 2026-06-04 10:24:44          1        4           4
        3      .0    0% | LGWR all worker groups                     2026-06-04 10:22:01 2026-06-04 10:23:28          1        3           3
        1      .0    0% | control file parallel write                2026-06-04 10:24:26 2026-06-04 10:24:26          1        1           1
        1      .0    0% | log file sync                              2026-06-04 10:21:13 2026-06-04 10:21:13          1        1           1
6 rows selected.

SYS@book> @ ashtop sql_id "event='cursor: pin S'" "timestamp'2026-06-04 10:21:07'" "timestamp'2026-06-04 10:24:49'"
    Total                                                                         Distinct Distinct    Distinct
  Seconds     AAS %This   SQL_ID        FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------- ------------------- ------------------- ---------- -------- -----------
     2747    12.4   71% |               2026-06-04 10:21:10 2026-06-04 10:24:46          1      204         204
     1112     5.0   29% | 3cx1jjd8hkhv1 2026-06-04 10:21:10 2026-06-04 10:24:46          1      195         195

SYS@book> @ sql_id 3cx1jjd8hkhv1
-- SQL_ID = 3cx1jjd8hkhv1 come from shared pool
SELECT SID FROM V$MYSTAT WHERE ROWNUM=1;

--//可以看出使用赋值方式要优于执行sql语句,而且sys_context优于userenv。
--//一般情况优先选择赋值方式操作,减少sql语句执行导致的上下文切换.

--//11g 下如果赋值如果采用出现使用如下情况,实际上调用的sql语句。
--// 类似于 v := user 或者 n := seq.nextval ,就是取当前用户名或者seq号的下一个值.
--//21c 仅仅 n := seq.nextval ,还是调用sql语句.
--//有点不好理解的是取sysdate的值11g与21c都不会调用sql语句.

--//另外发现在cdb下密集执行select sid into v_sid from v$mystat where rownum=1;与pdb下密集执行性能差异巨大,限于篇幅另外
--//写一篇文章分析。



http://www.jsqmd.com/news/976879/

相关文章:

  • Umi-OCR终极指南:Windows与Linux环境下的高效离线文字识别解决方案
  • 从零开始掌握OpenSeesPy:Python结构分析的7个关键步骤
  • macOS 命令行自动投稿 B 站:biliup-rs 安装 + 一键投稿脚本
  • 终极Edge浏览器卸载工具:如何彻底移除Microsoft Edge的专业指南
  • Umi-OCR插件完全指南:7款免费OCR引擎的终极安装与使用教程
  • 5分钟掌握AI视频生成:零基础打造专业短视频的终极指南
  • 国产MCU替代实战:华大HC32F460串口DMA+超时中断,如何搞定不定长数据帧?
  • 第六十三天
  • 河北304不锈钢冲孔板厂家排行:实力供应商盘点 - 奔跑123
  • 2026国内智慧供热服务综合实力排行榜:4个维度深度分析,天津半径科技稳居榜首 - 新闻快传
  • 告别网盘限速困扰:八大平台直链下载助手全面指南
  • Oracle RAC私网多网卡配置,别让rp_filter=2这个小参数坑了你一整天
  • 避坑指南:在Allegro 16.6中调用Cadence原理图模块,这些电源/地和命名错误千万别踩
  • 长沙二手车商选哪家比较靠谱?经营年限、收车模式、效率、保障多维度对比 - 麦克杰
  • 如何在5分钟内快速上手3D点云标注?完整指南助你解决自动驾驶数据标注难题
  • KeSpeech:如何用开源数据集破解八大方言语音识别难题?
  • Linux动态壁纸终极指南:解锁桌面美学与性能平衡
  • 10分钟黑苹果配置终极指南:OpCore-Simplify一键自动化EFI生成工具
  • 别再只复现了!用Docker 5分钟搭建Drupal 7.x靶场,实战CVE-2018-7600漏洞
  • SPT-AKI存档编辑器:5分钟掌握单机版塔科夫存档修改全攻略 [特殊字符]
  • JAVA算法刷题---DAY2 牛牛的快递、最小花费爬楼梯、数组中两个字符串的最小距离
  • 电子系统噪声抑制与EMC设计:从原理到工程实践
  • 2026年模锻机厂家推荐榜单:半轴/凸轮轴/齿轮/盘齿/传动轴/航空/航天/军品精密锻件,重型锻压新势力! - 企业推荐官【官方】
  • 我的智能恒温箱项目笔记:STM32F4通过SPI读取MAX31865温度传感器全流程
  • RTL8153B-VB-CG、集成 LDO / 开关稳压器,支持 EEE 节能与双唤醒功能的网口 IC
  • 航空危险品运输全流程智能监管平台技术方案
  • 手把手教你用Python爬取‘可可英语’《现代大学英语精读》原文与音频(以第六单元A篇为例)
  • 3步掌握XAPK转APK:零依赖Android应用格式转换终极指南
  • 亚马逊团队“最优快递员“:把一个臃肿的AI大脑变成高效专家小组
  • 别再为跨时钟域头疼了!手把手教你用Verilog实现格雷码转换(附完整测试代码)