programing

오라클에서 DBMS_STATS를 사용하는 이유는 무엇입니까?GOLDER_TABLE_STATS?

oldcodes 2023. 11. 5. 14:59
반응형

오라클에서 DBMS_STATS를 사용하는 이유는 무엇입니까?GOLDER_TABLE_STATS?

Oracle이 성능 튜닝 등에 사용한다는 것을 설명하는 문서를 찾았지만 실제로 어떤 기능을 하는지는 잘 이해하지 못했습니다.

누가 아주 기본적인 예를 들어 간단한 말로 설명해 줄 수 있습니까?

Oracle을 포함한 대부분의 엔터프라이즈 데이터베이스는 비용 기반의 최적화 도구를 사용하여 특정 SQL 문에 대한 적절한 쿼리 계획을 결정합니다.이는 최적화자가 규칙에 의존하지 않고 데이터에 대한 정보를 사용하여 쿼리를 실행하는 방법을 결정한다는 것을 의미합니다(이것이 이전 규칙 기반 최적화자가 수행한 작업입니다).

예를 들어, 간단한 버그 추적 응용 프로그램에 대한 표를 상상해 보십시오.

CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

제가 대기업이라면 이 테이블에 100만 줄이 있을 겁니다.그 중에서 100개는issue_statusACTIVE의 10,000명은issue_status대기 중이며, 989,900의 상태는 COMPLETE입니다.테이블에 대한 쿼리를 실행하여 활성 문제를 찾으려는 경우

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

옵티마이저는 선택할 수 있습니다.이것은 인덱스를 사용할 수 있습니다.issue_status그런 다음 인덱스의 각 행에 대해 테이블에서 단일 행 검색을 수행하거나 테이블 검색을 수행할 수 있습니다.issues표. 어떤 계획이 더 효율적인지는 표에 있는 데이터에 따라 달라집니다.Oracle이 쿼리가 테이블에 있는 데이터의 일부를 반환할 것으로 예상한다면 인덱스를 사용하는 것이 더 효율적일 것입니다.Oracle이 쿼리가 테이블에 있는 데이터의 상당 부분을 반환할 것으로 예상하는 경우 테이블 검색이 더 효율적일 것입니다.

DBMS_STATS.GATHER_TABLE_STATS는 Oracle이 이러한 결정을 내릴 수 있는 통계를 수집합니다.이것은 Oracle에게 테이블에 약 백만 개의 행이 있고, 3개의 다른 값이 있다고 말합니다.issue_status열과 데이터가 불균등하게 분포되어 있음을 나타냅니다.따라서 Oracle은 쿼리에 인덱스를 사용하여 모든 활성 문제를 찾을 수 있습니다.하지만 여러분이 돌아서서 모든 닫힌 문제들을 찾으려 할 때도 알고 있습니다.

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

테이블 스캔을 하는 것이 더 효율적일 것입니다.

통계를 수집하면 데이터 볼륨 및 데이터 분포가 변경됨에 따라 쿼리 계획이 시간에 따라 변경될 수 있습니다.문제 추적기를 처음 설치하면 완료된 문제가 거의 없고 활성화 및 대기 중인 문제가 더 많습니다.시간이 지남에 따라 완료된 문제의 수는 훨씬 더 빠르게 증가합니다.테이블에 행이 많아지면 다양한 상태에 있는 행의 상대적인 비율이 변경되면 쿼리 계획이 변경되어 이상적인 세계에서는 항상 가장 효율적인 계획을 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/15575422/why-does-oracle-use-dbms-stats-gather-table-stats

반응형