Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Oracle中最耗时的5个SQL查询_Performance_Oracle - Fatal编程技术网

Performance Oracle中最耗时的5个SQL查询

Performance Oracle中最耗时的5个SQL查询,performance,oracle,Performance,Oracle,如何在Oracle中找到性能较差的SQL查询 Oracle维护共享SQL区域的统计信息,每个SQL stringv$sqlarea包含一行。 但是我们怎样才能确定哪一个表现糟糕呢?有很多可能的方法可以做到这一点,但是有一个谷歌tkprof 没有GUI。。。它完全是命令行,对于Oracle初学者来说可能有点吓人;但是它非常强大 此链接看起来是一个良好的开端: 我发现这个SQL语句是一个很有用的开始,很抱歉,我不能将其归因于原始作者;我在网上的某个地方找到了它: SELECT * FROM (SEL

如何在Oracle中找到性能较差的SQL查询

Oracle维护共享SQL区域的统计信息,每个SQL stringv$sqlarea包含一行。
但是我们怎样才能确定哪一个表现糟糕呢?

有很多可能的方法可以做到这一点,但是有一个谷歌tkprof

没有GUI。。。它完全是命令行,对于Oracle初学者来说可能有点吓人;但是它非常强大

此链接看起来是一个良好的开端:


我发现这个SQL语句是一个很有用的开始,很抱歉,我不能将其归因于原始作者;我在网上的某个地方找到了它:

SELECT * FROM
(SELECT
    sql_fulltext,
    sql_id,
    elapsed_time,
    child_number,
    disk_reads,
    executions,
    first_load_time,
    last_load_time
FROM    v$sql
ORDER BY elapsed_time DESC)
WHERE ROWNUM < 10
/

这显示了SQL缓存中的实际计划和SQL的全文。

在搜索时,我得到了以下查询,该查询使用一个assumptionquery执行时间>6秒完成任务

选择用户名、sql\u文本、sofar、totalwork、单位

从v$sql,v$session_longops

其中,sql\u地址=地址,sql\u哈希值=哈希值

按地址、哈希值、子编号排序

我认为上面的查询将列出当前用户的详细信息


欢迎评论

这取决于您所使用的oracle版本,因为9i及以下版本是您所追求的,10g及以上版本是您想要的,这两种工具都将为您提供顶级sql和许多其他功能。

您可以获取实例活动期间每次执行的平均缓冲区:

SELECT username,
       buffer_gets,
       disk_reads,
       executions,
       buffer_get_per_exec,
       parse_calls,
       sorts,
       rows_processed,
       hit_ratio,
       module,
       sql_text
       -- elapsed_time, cpu_time, user_io_wait_time, ,
  FROM (SELECT sql_text,
               b.username,
               a.disk_reads,
               a.buffer_gets,
               trunc(a.buffer_gets / a.executions) buffer_get_per_exec,
               a.parse_calls,
               a.sorts,
               a.executions,
               a.rows_processed,
               100 - ROUND (100 * a.disk_reads / a.buffer_gets, 2) hit_ratio,
               module
               -- cpu_time, elapsed_time, user_io_wait_time
          FROM v$sqlarea a, dba_users b
         WHERE a.parsing_user_id = b.user_id
           AND b.username NOT IN ('SYS', 'SYSTEM', 'RMAN','SYSMAN')
           AND a.buffer_gets > 10000
         ORDER BY buffer_get_per_exec DESC)
 WHERE ROWNUM <= 20

您可以通过以下方式找到磁盘密集型全表扫描:

SELECT Disk_Reads DiskReads, Executions, SQL_ID, SQL_Text SQLText, 
   SQL_FullText SQLFullText 
FROM
(
   SELECT Disk_Reads, Executions, SQL_ID, LTRIM(SQL_Text) SQL_Text, 
      SQL_FullText, Operation, Options, 
      Row_Number() OVER 
         (Partition By sql_text ORDER BY Disk_Reads * Executions DESC) 
         KeepHighSQL
   FROM
   (
       SELECT Avg(Disk_Reads) OVER (Partition By sql_text) Disk_Reads, 
          Max(Executions) OVER (Partition By sql_text) Executions, 
          t.SQL_ID, sql_text, sql_fulltext, p.operation,p.options
       FROM v$sql t, v$sql_plan p
       WHERE t.hash_value=p.hash_value AND p.operation='TABLE ACCESS' 
       AND p.options='FULL' AND p.object_owner NOT IN ('SYS','SYSTEM')
       AND t.Executions > 1
   ) 
   ORDER BY DISK_READS * EXECUTIONS DESC
)
WHERE KeepHighSQL = 1
AND rownum <=5;

以下查询返回执行大量磁盘读取的SQL语句,还包括有问题的用户和查询的运行次数:

SELECT t2.username, t1.disk_reads, t1.executions,
    t1.disk_reads / DECODE(t1.executions, 0, 1, t1.executions) as exec_ratio,
    t1.command_type, t1.sql_text
  FROM v$sqlarea t1, dba_users t2
  WHERE t1.parsing_user_id = t2.user_id
    AND t1.disk_reads > 100000
  ORDER BY t1.disk_reads DESC
以SYS的形式运行查询,并根据您认为对我来说过多的内容调整磁盘读取的数量

我最近使用这个查询来追踪那些在执行语句之前拒绝利用解释计划的用户


我在一本旧的Oracle SQL调优书中找到了这个查询,很遗憾,我已经没有了,所以很抱歉,没有了属性。

我从askTom Oracle获得的完整信息。我希望它能帮助你

select * 
from v$sql 
where buffer_gets > 1000000 
or disk_reads > 100000 
or executions > 50000 

有没有办法通过sql查询获取数据?Oracle是否在某些系统表中维护相关数据?它在系统表中维护的数据没有tkprof中维护的数据多。查看我的答案,寻找一种快速而肮脏的方法来寻找不好的陈述。tkprof更好,但您需要专门设置一个测试并运行它。链接会悬空。域正在出售…此查询不限于当前用户,并且仅当查询出现在v$session_longops中时才起作用。Longops记录Oracle通过排序、表扫描、索引完全扫描的距离。如果由于嵌套循环计划不正确而导致查询速度缓慢,它不会显示,因为没有长操作。您应该在select中添加已用时间,否则会非常混乱。在内部查询中添加此WHERE子句,以仅包括reacent慢速查询:WHERE LAST\u LOAD\u time>“2020-04-10”在运行APEX时,这两个字段也很有用:模块、操作、,DISK_READS不是磁盘读取的总数吗,所以不需要乘以执行数?
select * 
from v$sql 
where buffer_gets > 1000000 
or disk_reads > 100000 
or executions > 50000