【问题标题】:How to get the Oracle sql Id in the application如何在应用程序中获取 Oracle sql Id
【发布时间】:2021-07-25 13:03:01
【问题描述】:

我有一个 .net Web 服务,它对 ORACLE 进行一些动态生成的 sql 调用,它们在生产中表现不佳。 DBA 不断要求 sql id 来调整查询。他们可以使用 OEM 工具查找执行缓慢的查询并获取 sql id。但我想知道是否有办法知道 sql id 并记录它,以便我可以检索它并将其提供给 DBA 进行调整。 这是可以在.net中实现的吗?

【问题讨论】:

    标签: sql .net oracle performance query-optimization


    【解决方案1】:

    如果应用程序可以捕获足够的信息来识别 v$session 中的会话,您可以从另一个会话中查询它以获取 sql_id 的值,或者如果您获得许可,则查询 v$sql_monitor 视图(需要 Enterprise版和诊断和调整选项)。使用dbms_application_info 标记活动以便更好地跟踪。

    如果您还没有配置数据库服务,您也可以配置数据库服务,以便应用程序连接到特定服务而不是通用服务,这将出现在 v$session.service_name 中并在 OEM 等中报告。

    如果在性能不佳的 SQL 语句完成后立即从同一会话中捕获会话详细信息是可行的(例如,如果连接超时),您可以尝试查询 prev_ 详细信息v$会话:

    select s.prev_sql_id
         , s.prev_child_number
         , s.prev_exec_start
         , s.prev_exec_id
         , p.sql_text as prev_sql
         , p.plan_hash_value as prev_plan
    from   v$session s
           left join v$sql p on p.sql_id = s.prev_sql_id and p.child_number = s.prev_child_number
    where  s.audsid = sys_context('userenv', 'sessionid')
    

    【讨论】:

      【解决方案2】:

      以下包 dbms_application_info 对于检测您的查询非常有用。

      在从应用层运行处理逻辑之前,设置模块/操作,以识别您的模块。

      DBMS_APPLICATION_INFO.set_module(module_name => 'add_order',
                                       action_name => 'processing orders');
      

      之后,使用一个标记设置 client_info,该标记指示在运行 sql 之前正在进行的处理。

      例如:

      exec dbms_application_info.set_client_info('starting load from staging');
      
      --Run the query 
      insert into dest_table select * from staging;
      
      update dest_table set last_updated=sysdate;
      
      exec dbms_application_info.set_client_info('updated the last_updated column');
      
      delete from dest_table where order_value<0;
      
      exec dbms_application_info.set_client_info('deleted -ve orders');
      

      发生这种情况时,我们可以查看 v$session/v$sql 以了解当前处理的位置

      SELECT sid,
             serial#,
             username,
             osuser,
             module,
             action,
             client_info
      FROM   v$session
      WHERE module='add_order'
      
      SELECT *
      FROM   v$sql
      WHERE module='add_order'
      

      看看链接 https://oracle-base.com/articles/8i/dbms_application_info

      【讨论】:

        【解决方案3】:

        查询V$SQL动态视图获取SQL ID;

        关于 V$SQL 的更多信息: https://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2113.htm#REFRN30246

        【讨论】:

          猜你喜欢
          • 2019-11-08
          • 1970-01-01
          • 2016-01-09
          • 1970-01-01
          • 1970-01-01
          • 2014-03-19
          • 2020-09-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多