0

我有一个 ASP.NET 应用程序,它使用 Oracle 进行持久性并通过 ADO.NET 和存储过程对其进行查询。

我拥有完整版的 TOAD 和数据库的管理权限。

有没有办法查看应用程序在过去 10 分钟内发出的所有查询?

4

3 回答 3

2

这是我用来检查慢查询的查询:(可能会让你开始)

SELECT   username, sql_text, elapsed_time, executions, optimizer_cost, loads,
         fetches, rows_processed,
         DECODE (command_type,
                 2, 'Insert',
                 3, 'Select',
                 6, 'Update',
                 7, 'Delete',
                 26, 'Lock Table',
                 35, 'Alter Database',
                 42, 'Alter Session',
                 44, 'Commit',
                 45, 'Rollback',
                 46, 'Savepoint',
                 47, 'Begin/Declare',
                 command_type
                ) AS cmdtype,
         first_load_time, last_load_time, module
    FROM v$sql, v$session_longops
   --longops is a view of statements that took longer than 6 seconds
WHERE    sql_address(+) = address AND sql_hash_value(+) = hash_value
ORDER BY elapsed_time DESC, executions, address, hash_value, child_number;
于 2009-12-31T17:44:13.543 回答
2

我不知道过去 10 分钟的情况,但是如果您使用会话浏览器(关闭工具栏,或数据库菜单 -> 监视器 -> 会话浏览器),您可以查看连接用户的当前语句(展开 w3wp.exe ,然后按机器名称排序以找到正确的连接),然后在浏览应用程序时按住刷新按钮。

摆脱 TOAD GUI 的限制,您可以尝试手动查询v$sqlarea

  select * 
    from v$sqlarea
   where upper(module) = 'W3WP.EXE'
     and parsing_schema_name = 'MY_CONNECTING_SCHEMA'
order by last_active_time desc
于 2009-12-31T17:01:17.517 回答
1

您可能不知道您的应用程序用户会话的 SID。但是您当然知道应用程序正在访问的对象的模式所有者。

要按时间限制结果,您可以使用 awr 快照。(自动工作负载存储库)

有关 AWR 的更多信息:http: //download.oracle.com/docs/cd/B19306_01/server.102/b14211/autostat.htm#PFGRF02601

--Create a snapshot
exec dbms_workload_repository.create_snapshot;

--Wait 10min and create another snapshot;
exec dbms_workload_repository.create_snapshot;

--This Statement does the following:
--1. Get the recent two Snapshot IDs
--2. Select all SQL IDs which are execute between the last two snapshots
--3. Filter the SQL IDs which are accessing objects of a certain owner (Substitute 'APP_OWNER' with the schema owner of your application)
--4. Select the SQL text of all these SQL IDs

SELECT sql_id,
       sql_text
FROM   dba_hist_sqltext
WHERE  sql_id IN (SELECT DISTINCT sql_id
                  FROM   dba_hist_sql_plan
                  WHERE  sql_id IN (SELECT sql_id
                                    FROM   dba_hist_sqlstat
                                    WHERE  snap_id BETWEEN (SELECT max(snap_id) - 1
                                                            FROM   dba_hist_snapshot) AND (SELECT max(snap_id)
                                                                                           FROM   dba_hist_snapshot))
                         AND object_owner = 'APP_OWNER')
/
于 2010-01-02T12:54:01.827 回答