Oracle 인덱스의 크기를 어떻게 추정할 수 있습니까?
Oracle 테이블에 인덱스를 추가하는 것을 고려하고 있지만, 먼저 인덱스가 구축된 후의 크기를 추정하고 싶습니다(정확한 크기는 필요하지 않습니다. 단지 추정치일 뿐입니다.)
테이블에 대한 모든 메타데이터(행 수, 열, 열 데이터 유형 등)에 액세스하여 임의의 Oracle SQL 쿼리를 실행하여 테이블의 현재 상태에 대한 추가 데이터를 가져올 수 있으며 인덱스 정의를 원하는 경우 이 크기를 어떻게 추정할 수 있습니까?
다음을 실행하여 인덱스의 크기를 추정할 수 있습니다.explain plan
인덱스 생성 문:
create table t as
select rownum r
from dual
connect by level <= 1000000;
explain plan for
create index i on t (r);
select *
from table(dbms_xplan.display(null, null, 'BASIC +NOTE'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1744693673
---------------------------------------
| Id | Operation | Name |
---------------------------------------
| 0 | CREATE INDEX STATEMENT | |
| 1 | INDEX BUILD NON UNIQUE| I |
| 2 | SORT CREATE INDEX | |
| 3 | TABLE ACCESS FULL | T |
---------------------------------------
Note
-----
- estimated index size: 4194K bytes
하단의 "참고" 섹션을 확인하십시오. 예상 인덱스 크기: 4194K 바이트
이러한 오라클 용량 계획 및 크기 조정 스프레드쉬트를 사용할 수 있습니다.
완전하지 않은 경우, 지수에 대한 대략적인 추정치를 봉투 유형으로 되돌리려면:
인덱스 키를 구성하는 각 열의 평균 크기를 계산하고 열에 행 ID 하나를 더한 값과 행 헤더에 대해 2바이트를 추가하여 평균 행 크기를 얻습니다.이제 pctfree 값에 약간만 더하면 지수가 오버헤드 인자를 생성할 수 있습니다. pctfree 10의 경우 1.125일 수 있습니다.
색인화된 테이블 행 수 Xavgrow len X 1.125
참고 - 인덱스에 null 가능한 열이 포함된 경우 모든 테이블 행이 인덱스에 나타나지 않을 수 있습니다.열의 90%가 null인 단일 열 인덱스에서는 10%만 인덱스에 들어갑니다.
추정치를 테이블스페이스 익스텐트 할당 방법과 비교하고 필요한 경우 최종 답변을 조정합니다.
또한 인덱스가 더 많은 데이터가 인덱싱될수록 인덱스 구조를 지원하는 데 필요한 분기 블록이 많아지고 계산이 실제로는 리프 블록에 대한 수치에 불과하기 때문에 인덱스가 커질수록 오버헤드 팩터가 커질수록 더 좋을 수 있습니다.
10gR2 버전부터 사용 가능DBMS_SPACE.CREATE_INDEX_COST
DBMS_SPACE.CREATE_INDEX_COST (
ddl IN VARCHAR2,
used_bytes OUT NUMBER,
alloc_bytes OUT NUMBER,
plan_table IN VARCHAR2 DEFAULT NULL);
문서에서: "이 절차는 기존 테이블에 인덱스를 만드는 비용을 결정합니다.입력은 인덱스를 생성하는 데 사용되는 DDL 문입니다.이 절차는 인덱스를 생성하는 데 필요한 스토리지를 출력합니다."
https://docs.oracle.com/database/121/ARPLS/d_space.htm#ARPLS68101 을 참조하십시오.
예제(sqlfiddle에서도):
DECLARE
ub NUMBER;
ab NUMBER;
BEGIN
DBMS_SPACE.CREATE_INDEX_COST (
ddl => 'CREATE INDEX x_1 ON t1 (a,b,c) TABLESPACE users',
used_bytes => ub,
alloc_bytes => ab
);
DBMS_OUTPUT.PUT_LINE('Used MBytes: ' || ROUND(ub/1024/1024));
DBMS_OUTPUT.PUT_LINE('Alloc MBytes: ' || ROUND(ab/1024/1024));
END;
/
출력:
Used MBytes: 1
Alloc MBytes: 2
아래 SQL 쿼리를 사용하여 오라클에서 테이블이 차지하는 예상 인덱스 크기를 알 수 있습니다.
SELECT (row_size_in_bytes * cnt_of_rows)/1000/1000/1000 index_size_in_GB
FROM
(
SELECT table_name ,
(sum (column_length) / 1048576) * 1000000 row_size_in_bytes
FROM user_ind_columns
WHERE table_name=UPPER('&Enter_Table_Name')
GROUP BY table_name
) A,
(SELECT count(1) cnt_of_rows FROM &Enter_Table_Name );
언급URL : https://stackoverflow.com/questions/827123/how-can-i-estimate-the-size-of-an-oracle-index
'programing' 카테고리의 다른 글
Babel 6은 기본값을 내보내는 방법을 변경합니다. (0) | 2023.07.31 |
---|---|
백엔드에서 angular2 부트스트랩 방법으로 렌더링된 매개 변수를 전달하는 방법 (0) | 2023.07.31 |
바이트를 저장하기 위해 사용해야 하는 SQL Server 데이터 유형[] (0) | 2023.07.31 |
현재 디렉터리 및 모든 하위 디렉터리에 있는 DLL 파일의 파일 버전 및 어셈블리 버전 가져오기 (0) | 2023.07.31 |
인쇄 호출을 차단하는 방법 (0) | 2023.07.31 |