Топ 5 трудоемких SQL-запросов в Oracle

вы можете сделать что-то вроде этого

foreach($tags as &$tag){
    $tag['value'] = $tag['url'];
    unset($tag['url']);
}
35
задан JosephStyons 5 December 2008 в 17:44
поделиться

6 ответов

Я нашел, что этот 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, заказанном прошедшим временем. Операторы будут исчезать из кэша со временем, таким образом, это не могла бы быть никакая хорошая попытка диагностировать пакетное задание прошлой ночи, когда Вы прокручиваетесь в работу в полдень.

можно также попытаться заказать disk_reads и выполнением. Выполнение полезно, потому что некоторые некачественные нанесения отправляют тот же SQL-оператор слишком много раз. Этот SQL предполагает, что Вы используете, связывают переменные правильно.

Затем можно взять sql_id и child_number из оператора и подать их в этот baby:-

SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', &child));

, который Это показывает фактическому плану от кэша SQL и полному тексту SQL.

50
ответ дан WW. 5 December 2008 в 17:44
поделиться
  • 1
    Да. Как я сказал относительно нижней части ответа, это относится к каждому ТАК. – Jorge Campos 12 December 2013 в 16:02

Вы могли взять средний буфер, добирается на выполнение в течение периода действия экземпляра:

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
5
ответ дан sjngm 5 December 2008 в 17:44
поделиться

Это зависит, какую версию оракула Вы имеете, для 9i и ниже , Statspack - то, что Вы после, 10 г и выше, Вы хотите awr, и эти инструменты дадут Вам главный sql's и много другого материала.

2
ответ дан Matthew Watson 5 December 2008 в 17:44
поделиться

Существует много возможных способов сделать это, но иметь Google для tkprof

нет никакого GUI..., это - совершенно командная строка и возможно касание, пугающее для новичков Oracle; но это очень мощно.

Эта ссылка похожа на хорошее начало:

http://www.oracleutilities.com/OSUtil/tkprof.html

1
ответ дан cagcowboy 5 December 2008 в 17:44
поделиться

При поиске я получил следующий запрос, который делает задание с одним предположением (время выполнения запросов> 6 секунд)

<час>

ИЗБРАННОЕ имя пользователя, sql_text, sofar, totalwork, единицы

ОТ v$sql, v$session_longops

ГДЕ sql_address = адрес И sql_hash_value = адрес ORDER BY hash_value

, hash_value, child_number;

<час>

я думаю выше запроса, перечислит детали для текущего пользователя.

Комментарии приветствуются!!

-1
ответ дан Kamal Joshi 5 December 2008 в 17:44
поделиться

Вы могли найти диск интенсивным полным сканированием таблицы с чем-то вроде этого:

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;
17
ответ дан Leigh Riffel 6 December 2008 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: