프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 19.27.0.0

 

방법 : 오라클 19c 유저 100개, 테이블 100개, 인덱스 100개, 데이터 1000건 생성

본문 내용은 오라클 19c에서 유저 100개와 해당 유저에 테이블 100개, 인덱스 100개 생성 후 데이터도 1000건씩 생성하는 테스트용 스크립트임

 

 

유저 100개 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL>
BEGIN
    FOR i IN 1..100 LOOP
        EXECUTE IMMEDIATE '
            CREATE USER IMSI' || LPAD(i, 3, '0') || ' IDENTIFIED BY IMSI' || LPAD(i, 3, '0') || 
            ' DEFAULT TABLESPACE users QUOTA UNLIMITED ON users';
        
        EXECUTE IMMEDIATE '
            GRANT CONNECT, RESOURCE TO IMSI' || LPAD(i, 3, '0');
    END LOOP;
END;
/
 
PL/SQL procedure successfully completed.

 

 

각 유저별로 테이블 100개씩 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL>
BEGIN
    FOR u IN 1..100 LOOP  -- 유저명 루프
        FOR t IN 1..100 LOOP  -- 테이블명 루프
            EXECUTE IMMEDIATE '
                CREATE TABLE IMSI' || LPAD(u, 3, '0') || '.IMSI' || LPAD(u, 3, '0') ||
                '_tbl' || LPAD(t, 3, '0') || ' (
                    id   NUMBER,
                    name VARCHAR2(100)
                )';
        END LOOP;
    END LOOP;
END;
/
 
PL/SQL procedure successfully completed.

 

 

각 테이블에 데이터도 1000건씩 삽입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SQL>
CREATE TABLE SYSTEM.SAMPLE_1K (
  id   NUMBER,
  name VARCHAR2(100)
);
 
INSERT INTO SYSTEM.SAMPLE_1K (id, name)
SELECT LEVEL, 'name' || TO_CHAR(LEVEL, 'FM0000')
FROM dual
CONNECT BY LEVEL <= 1000;
 
COMMIT;
 
DECLARE
  v_user  VARCHAR2(30);
  v_tbl   VARCHAR2(128);
BEGIN
  FOR u IN 1..100 LOOP
    v_user := 'IMSI' || LPAD(u, 3, '0');
 
    FOR t IN 1..100 LOOP
      v_tbl := v_user || '_tbl' || LPAD(t, 3, '0');
 
      EXECUTE IMMEDIATE
        'INSERT /*+ APPEND */ INTO ' || v_user || '.' || v_tbl || ' (id, name) ' ||
        'SELECT id, name FROM SYSTEM.SAMPLE_1K';
 
      COMMIT;
    END LOOP;
  END LOOP;
END;
/
 
PL/SQL procedure successfully completed.

 

 

테이블 건수 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
SQL>
SET SERVEROUTPUT ON SIZE UNLIMITED
DECLARE
    v_user  VARCHAR2(30);
    v_tbl   VARCHAR2(128);
    v_cnt   NUMBER;
BEGIN
    FOR u IN 1..100 LOOP
        v_user := 'IMSI' || LPAD(u, 3, '0');
 
        FOR t IN 1..100 LOOP
            v_tbl := v_user || '_tbl' || LPAD(t, 3, '0');
 
            EXECUTE IMMEDIATE
                'SELECT COUNT(*) FROM ' || v_user || '.' || v_tbl
            INTO v_cnt;
 
            DBMS_OUTPUT.PUT_LINE(v_user || '.' || v_tbl || ' count : ' || v_cnt);
        END LOOP;
    END LOOP;
END;
/
 
IMSI001.IMSI001_tbl001 count : 1000
IMSI001.IMSI001_tbl002 count : 1000
IMSI001.IMSI001_tbl003 count : 1000
...
IMSI100.IMSI100_tbl098 count : 1000
IMSI100.IMSI100_tbl099 count : 1000
IMSI100.IMSI100_tbl100 count : 1000
 
PL/SQL procedure successfully completed.

각 테이블당 1000건씩 삽입됨

 

 

각 유저 테이블에 인덱스도 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL>
BEGIN
    FOR u IN 1..100 LOOP  -- 유저명 루프
        FOR t IN 1..100 LOOP  -- 테이블명 루프
            EXECUTE IMMEDIATE '
                CREATE INDEX IMSI' || LPAD(u, 3, '0') || '.IMSI' || LPAD(u, 3, '0') ||
                '_tbl' || LPAD(t, 3, '0') || '_id_idx ' ||
                'ON IMSI' || LPAD(u, 3, '0') || '.IMSI' || LPAD(u, 3, '0') ||
                '_tbl' || LPAD(t, 3, '0') || ' (id)';
        END LOOP;
    END LOOP;
END;
/
 
PL/SQL procedure successfully completed.

 

 

100개의 유저에 100개의 인덱스가 있는 100개의 테이블에 1000건씩 데이터가 삽입됨

1
2
3
4
5
6
7
8
9
10
11
SQL> select count(*) from dba_tables where table_name like '%IMSI%';
 
  COUNT(*)
----------
     10000
 
SQL> select count(*) from dba_indexes where index_name like '%IMSI%';
 
  COUNT(*)
----------
     10000

 

 

용량 확인

1
2
3
4
5
6
7
SQL> 
select count(*), sum(bytes/1024/1024) mb from dba_segments
where segment_name like '%IMSI%';
 
  COUNT(*)         MB
---------- ----------
     20000       1250

1.2gb정도 생성됨

 

 

참조 :