Oracle에서 시간이 많이 걸리는 상위 5개의 SQL 쿼리
Oracle에서 성능이 떨어지는 SQL 쿼리를 찾으려면 어떻게 해야 합니까?
Oracle은 공유 SQL 영역에 대한 통계를 유지하며 SQL 문자열(v$sqlarea)당 하나의 행을 포함합니다.하지만 그 중 어떤 것이 제대로 작동하지 않는지 어떻게 확인할 수 있을까요?
이 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이 아기에게 주입하는 방법:-
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', &child));
SQL 캐시의 실제 계획과 SQL 전문이 표시됩니다.
디스크 부하가 높은 풀테이블 스캔은 다음과 같습니다.
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;
인스턴스의 액티비티 기간 동안 실행당 평균 버퍼 get을 얻을 수 있습니다.
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
사용하는 Oracle 버전에 따라 다르지만 Statspack 이하가 10g 이상이면 상위 SQL 및 기타 많은 기능을 제공합니다.
톰-오라클에게 들은 완전한 정보입니다도움이 됐으면 좋겠다
select *
from v$sql
where buffer_gets > 1000000
or disk_reads > 100000
or executions > 50000
다음 쿼리는 대량의 디스크 읽기를 수행하는 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로 실행하고 과도한 것으로 간주되는 항목에 따라 디스크 읽기 수를 조정합니다(100,000개면 충분합니다).
최근 이 쿼리를 사용하여 이용 거부 사용자를 추적하고 있습니다.Explain Plans그들의 진술을 이행하기 전에.
이 쿼리는 오래된 Oracle SQL 튜닝북(유감스럽게도 더 이상 가지고 있지 않음)에서 발견되었으므로 죄송합니다.
여러 가지 방법이 있지만 tkprof를 위한 구글을 사용하세요.
GUI는 없습니다.커맨드 라인 뿐이고, Oracle의 초보자에게는 위협적인 조작이지만, 매우 파워풀합니다.
이 링크는 좋은 시작처럼 보입니다.
http://www.oracleutilities.com/OSUtil/tkprof.html
검색하는 동안 하나의 가정으로 작업을 수행하는 다음과 같은 쿼리를 받았습니다(쿼리 실행 시간 > 6초).
사용자 이름, sql_text, 지금까지, 총 작업, 단위 선택
시작 v$sql,v$session_longops
여기서 sql_address = address AND sql_sql_value = hash_value
ORDER BY 주소, hash_value, child_number;
위 쿼리는 현재 사용자의 세부사항을 나열할 것이라고 생각합니다.
댓글은 대환영!!
언급URL : https://stackoverflow.com/questions/316812/top-5-time-consuming-sql-queries-in-oracle
'programing' 카테고리의 다른 글
| React.element를 JSX 문자열로 변환합니다. (0) | 2023.02.11 |
|---|---|
| 분리된 범위를 가진 지침에서 동작을 노출하려면 어떻게 해야 합니까? (0) | 2023.02.11 |
| Uncaught SyntaxError: Unexpected token : (0) | 2023.02.05 |
| MySQL에서 열려 있는 트랜잭션 표시 (0) | 2023.02.05 |
| Twitter Bootstrap의 data-toggle 속성 (0) | 2023.02.05 |