찾다
데이터 베이스MySQL 튜토리얼oracle中怎么确定性能差的SQL语句

oracle中怎么确定性能差的SQL语句,当涉及 SQL 时,性能不佳有两方面:CPU 密集型语句(CPU-intensive statements)和 I/O 密集型语句(I/O-intensive statements)。

oracle中怎么确定性能差的SQL语句,当涉及 SQL 时,性能不佳有两方面:CPU 密集型语句(CPU-intensive statements)和 I/O 密集型语句(I/O-intensive statements)。

前者很容易定位。所有的操作系统都可以让我们查看 CPU 密集型任务。这些任务可以追溯到一个特定用户,一个特定应用程序模块。 CPU 密集型模块一般都是由较差的代码和/或结构造成,而不是性能差的 SQL。一旦确定模块,你必须试图使之更有效率。一个可能的解决方案是将把某些处理移除程序,让数据库处理(高明点的 SQL,存储对象,内联函数,数组处理等)。

第二个是 I/O 密集型的 SQL 语句。这些语句会导致大量的数据库 I/O(全表扫描,排序,更新等),并以很高代价运行几个小时。从 Oracle 7 开始,解决了 SQL 识别问题。通过查询数据库共享池区域,我们可以很容易确定大多数 I/O 密集型 SQL 语句。

下面 SQL 语句演示了如何确定 I/O 命中率低于 80%的 SQL 语句。这个命中率是,自从 SQL 语句第一次被解析到共享池,通过所有执行的语句反应整体 I/O。下面可能是最近几分钟或几天的结果:

 代码如下 复制代码

sql> SELECT executions,

   2        disk_reads,

   3        buffer_gets,

   4        ROUND((buffer_gets - disk_reads) / buffer_gets, 2) hit_ratio,

   5        sql_text

   6     FROM   v$sqlarea

   7    WHERE  executions  > 0

   8     AND    buffer_gets > 0

   9     AND    (buffer_gets - disk_reads) / buffer_gets

   10   order by 4 desc ;

 

EXECUTIONS DISK_READS BUFFER_GETS  HIT_RATIO SQL_TEXT

---------- ---------- ----------- ---------- -----------------------------------------------------------------------

        16        180         369        .51 SELECT SKU,PREPACK_IND,CASE_ID,TRANSFER_QTY,UNIT_COST,UNIT_RETAIL,ROWID

                                             FROM TSF_DETAIL WHERE transfer = :1  order by sku

        16        30          63         .52 SELECT TRANSFER,TO_STORE,TO_WH FROM TSFHEAD  WHERE TRANSFER = :b1  AND

                                             TRANSFER_STATUS = 'A'

        2         3           7          .57 SELECT SKU   FROM UPC_EAN  WHERE UPC = :b1

        12        14          35         .60 SELECT SUBSTR(DESC_UP,1,30),DEPT,SYSTEM_IND   FROM DESC_LOOK  WHERE

                                             SKU = :b1

        14        13          35         .63 SELECT UNIT_COST,UNIT_RETAIL,SUBCLASS FROM WIN_SKUS WHERE SKU = :b1

事实上,我们发现对特定的 SQL,上面的数据有些误导,其实语句没有问题。考虑下面 v$sqlarea 输出:

Executions Disk_Reads Buffer_Gets Hit_Ratio Sql_Text

---------- ---------- ----------- --------- --------------------

    2          6          19         0.68   SELECT A.EMP_NO, ...

该语句的命中率很低,但事实上它很有效。因为,SQL 是通过 UNIQUE 索引操作的,物理磁盘读取的数量几乎与逻辑读取一样。UNIQUE 索引显著减少了整体的物理和逻辑磁盘 I/O 数量,导致了一个令人误解的低命中率。

下面例子,命中率很好。但是真的很好吗?

 代码如下 复制代码

Executions Disk_Reads Buffer_Gets Hit_Ratio Sql_Text

---------- ---------- ----------- --------- --------------------

    2         3625       178777      0.98   SELECT A.EMP_NO, ...

这个 SQL 语句看上去很有效。但是, 当我们仔细看时,事情就不是那么回事了。命中率并没有透露出,该语句存在五个表连接,并且每次执行进行了超过 3600 个物理磁盘读取。这是否太多了?是否有效?若不进一步研究,无法回答这两个问题。事实上,这个实例中,五个表的中其一个错误地执行了全表扫描。通过重新构造 SQL,我们可以减少物理磁盘 I/O 到小于 50,同时,也显著减少逻辑磁盘 I/O。巧合的是,命中率也下降到不到 70%。

我们首选 V$SQLAREA 查询是每个语句执行的物理磁盘 I/O 的真实报告。命中率是信息性的,但有时会产生误导。逻辑 I/O 相关的很少。如果语句执行 1,000,000 个逻辑 I/O,但只用了不到十分之一秒,这就没人在乎了。这是总的物理 I/O,几乎消耗了所有的时间,和确定潜在不正确的 SQL。例如:

 代码如下 复制代码

sql> SELECT sql_text, executions,

             ROUND(disk_reads / executions, 2) reads_per_run,

             disk_reads, buffer_gets,

             ROUND((buffer_gets - disk_reads)

                  / buffer_gets, 2) hit_ratio,

             sql_text

      FROM   v$sqlarea

      WHERE  executions  > 0

      AND    buffer_gets > 0

      AND    (buffer_gets - disk_reads) / buffer_gets

      ORDER by 3 desc ;

 

前两个语句会报告更具启发性的结果:

 代码如下 复制代码

Executions Reads_Per_Run Disk_Reads Buffer_Gets Hit_Ratio Sql_Text

---------- ------------- ---------- ----------- --------- ------------

    2           3            6          19        0.68    SELECT ...

    2         1812.5       3625       178777      0.98    SELECT ...

从视图 V$SQLAREA 中,我们可以立即隔离所有具有高物理读取的语句。这些语句可能并不一定低效或写得不好,但恰恰是它们需要进一步调查或调整。

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
MySQL에서 데이터베이스 업그레이드를 어떻게 처리합니까?MySQL에서 데이터베이스 업그레이드를 어떻게 처리합니까?Apr 30, 2025 am 12:28 AM

MySQL 데이터베이스를 업그레이드하는 단계에는 다음이 포함됩니다. 1. 데이터베이스 백업, 2. 현재 MySQL 서비스 중지, 3. 새 버전의 MySQL 설치, 4. 새 버전의 MySQL 서비스 시작, 5. 데이터베이스 복구. 업그레이드 프로세스 중에 호환성 문제가 필요하며 Perconatoolkit과 같은 고급 도구를 테스트 및 최적화에 사용할 수 있습니다.

MySQL에 사용할 수있는 다른 백업 전략은 무엇입니까?MySQL에 사용할 수있는 다른 백업 전략은 무엇입니까?Apr 30, 2025 am 12:28 AM

MySQL 백업 정책에는 논리 백업, 물리적 백업, 증분 백업, 복제 기반 백업 및 클라우드 백업이 포함됩니다. 1. 논리 백업은 MySQLDump를 사용하여 데이터베이스 구조 및 데이터를 내보내며 소규모 데이터베이스 및 버전 마이그레이션에 적합합니다. 2. 물리적 백업은 데이터 파일을 복사하여 빠르고 포괄적이지만 데이터베이스 일관성이 필요합니다. 3. 증분 백업은 이진 로깅을 사용하여 변경 사항을 기록합니다. 이는 큰 데이터베이스에 적합합니다. 4. 복제 기반 백업은 서버에서 백업하여 생산 시스템에 미치는 영향을 줄입니다. 5. AmazonRDS와 같은 클라우드 백업은 자동화 솔루션을 제공하지만 비용과 제어를 고려해야합니다. 정책을 선택할 때 데이터베이스 크기, 가동 중지 시간 허용 오차, 복구 시간 및 복구 지점 목표를 고려해야합니다.

MySQL 클러스터링이란 무엇입니까?MySQL 클러스터링이란 무엇입니까?Apr 30, 2025 am 12:28 AM

mysqlclusteringenhancesdatabaserobustness andscalabilitydaturedingdataacrossmultiplenodes.itusesthendbenginefordatareplicationandfaulttolerance, highavailability를 보장합니다

MySQL의 성능을 위해 데이터베이스 스키마 설계를 어떻게 최적화합니까?MySQL의 성능을 위해 데이터베이스 스키마 설계를 어떻게 최적화합니까?Apr 30, 2025 am 12:27 AM

MySQL에서 데이터베이스 스키마 설계 최적화는 다음 단계를 통해 성능을 향상시킬 수 있습니다. 1. 인덱스 최적화 : 공통 쿼리 열에서 인덱스 생성, 쿼리의 오버 헤드 균형 및 업데이트 삽입. 2. 표 구조 최적화 : 정규화 또는 정상화를 통한 데이터 중복성을 줄이고 액세스 효율을 향상시킵니다. 3. 데이터 유형 선택 : 스토리지 공간을 줄이기 위해 Varchar 대신 Int와 같은 적절한 데이터 유형을 사용하십시오. 4. 분할 및 하위 테이블 : 대량 데이터 볼륨의 경우 파티션 및 하위 테이블을 사용하여 데이터를 분산시켜 쿼리 및 유지 보수 효율성을 향상시킵니다.

MySQL 성능을 어떻게 최적화 할 수 있습니까?MySQL 성능을 어떻게 최적화 할 수 있습니까?Apr 30, 2025 am 12:26 AM

tooptimizemysqlperformance, followthesesteps : 1) 구현 properIndexingToSpeedUpqueries, 2) useExplaintoAnalyzeanDoptimizeQueryPerformance, 3) AdvertServerConfigUrationSettingstingslikeInnodb_buffer_pool_sizeandmax_connections, 4) uspartOflEtOflEtOflestoI

데이터 처리 및 계산에 MySQL 기능을 사용하는 방법데이터 처리 및 계산에 MySQL 기능을 사용하는 방법Apr 29, 2025 pm 04:21 PM

MySQL 기능은 데이터 처리 및 계산에 사용될 수 있습니다. 1. 기본 사용에는 문자열 처리, 날짜 계산 및 수학 연산이 포함됩니다. 2. 고급 사용에는 복잡한 작업을 구현하기 위해 여러 기능을 결합하는 것이 포함됩니다. 3. 성능 최적화를 위해서는 WHERE 절에서 기능 사용 및 GroupBy 및 임시 테이블 사용을 피해야합니다.

MySQL에 데이터를 일괄 삽입하는 효율적인 방법MySQL에 데이터를 일괄 삽입하는 효율적인 방법Apr 29, 2025 pm 04:18 PM

MySQL에 데이터 삽입을위한 효율적인 방법은 다음과 같습니다. 1. InsertInto 사용 ... 값 구문 사용 ... 값 구문, 2. 트랜잭션 처리 사용, 3. 트랜잭션 처리 사용, 4. 배치 크기 조정, 5. 인덱스 비활성화, 6. Insertignore 또는 Insert ... ondupliceKeyUpdate를 사용하여 데이터베이스 작동 효율성을 크게 향상시킬 수 있습니다.

MySQL 테이블에 필드를 추가 및 삭제하는 단계MySQL 테이블에 필드를 추가 및 삭제하는 단계Apr 29, 2025 pm 04:15 PM

MySQL에서는 altertabletable_nameaddcolumnnew_columnvarchar (255) 이후에 필드를 추가하여 altertabletable_namedropcolumncolumn_to_drop을 사용하여 필드를 삭제합니다. 필드를 추가 할 때는 쿼리 성능 및 데이터 구조를 최적화하기위한 위치를 지정해야합니다. 필드를 삭제하기 전에 작업이 돌이킬 수 없는지 확인해야합니다. 온라인 DDL, 백업 데이터, 테스트 환경 및 저하 기간을 사용하여 테이블 구조 수정은 성능 최적화 및 모범 사례입니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.