簡體   English   中英

如何在應用程序中獲取 Oracle sql Id

[英]How to get the Oracle sql Id in the application

我有一個 .net web 服務,它對 ZC3E3F219B6B8CAD735598568ZFE1 進行一些動態生成的 sql 調用,並且它們在生產中執行了 badCA8ZFE1。 DBA 不斷要求 sql id 來調整查詢。 他們可以使用 OEM 工具查找執行緩慢的查詢並獲取 sql id。 但我想知道是否有辦法知道 sql id 並將其記錄下來,以便我可以檢索它並將其提供給 DBA 進行調整。 這是在 .net 中可以實現的嗎?

查詢V$SQL動態視圖得到SQL ID;

有關 V$SQL 的更多信息: https://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2113.htm#REF30246

以下 package dbms_application_info 對於檢測您的查詢非常有用。

在從應用層運行處理邏輯之前,設置模塊/操作,以識別您的模塊。

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

之后,在運行 sql 之前,使用一個標記設置 client_info,該標記指示正在進行的處理。

例如:

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

如果應用程序可以捕獲足夠的信息來識別v$session中的 session ,您可以從另一個 session 查詢它以獲取sql_id的值,或者如果您獲得許可,則查詢v$sql_monitor視圖(需要企業版和診斷和調諧選項)。 使用dbms_application_info標記活動以便更好地跟蹤。

如果您還沒有配置數據庫服務,那么您也可以配置數據庫服務,以便應用程序連接到特定服務而不是通用服務,這將出現在 v$session.service_name 中並在 OEM 等中報告。

If it's practical to capture the session details from the same session immediately after the poorly-performing SQL statement completes (which it may not be, if the connection times out for example), you might try querying the prev_ details from v$session:

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM