Professional Documents
Culture Documents
8. Improved Defaults
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted
Rownum의 한계를 극복하다
Syntax
[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
{ ROW | ROWS } { ONLY | WITH TIES } ]
OFFSET : 시작위치
FETCT : 출력할 건수
같은 값이 두 개씩 존재함
8
FROM dual 9
CONNECT BY level <= 10; 9
10
10
COMMIT;
20 rows selected.
• 기능적으로는 두 함수가 같지만, APPROX_COUNT_DISTINCT는 정확한 값은 아니고 COUNT (DISTINCT expr) 함수와
미세한 편차가 있다. 정확도 > 97% (신뢰도 95%)
• BFILE, BLOB, CLOB, LONG, LONG RAW, NCLOB 등의 컬럼은 expr로 사용할 수 없다.
Active Managers
---------------
18
WITH_FUNCTION(ID)
-----------------
1
WITH_FUNCTION(ID)
-----------------
1
p_id=1
SQL>
SQL>
WITH WITH
FUNCTION slow_function(p_id IN NUMBER) RETURN NUMBER FUNCTION slow_function(p_id IN NUMBER) RETURN NUMBER
DETERMINISTIC IS IS
BEGIN BEGIN
DBMS_LOCK.sleep(1); DBMS_LOCK.sleep(1);
RETURN p_id; RETURN p_id;
END; END;
SELECT (SELECT slow_function(id) FROM dual) SELECT slow_function(id)
FROM t1 FROM t1
WHERE ROWNUM <= 10; WHERE ROWNUM <= 10;
/ /
(SELECTSLOW_FUNCTION(ID)FROMDUAL) SLOW_FUNCTION(ID)
--------------------------------- -----------------
1 1
1 1
…생략 …생략
10 rows selected.
약 10배 빠름 10 rows selected.
반드시 힌트를
사용해야 함
UPDATE t1 a UPDATE /*+ WITH_PLSQL */ t1 a
SET a.id = (WITH SET a.id = (WITH
FUNCTION with_function(p_id IN NUMBER) FUNCTION with_function(p_id IN NUMBER)
RETURN NUMBER IS RETURN NUMBER IS
BEGIN BEGIN
RETURN p_id; RETURN p_id;
END; END;
SELECT with_function(a.id) SELECT with_function(a.id)
FROM dual); FROM dual);
/ /
SET a.id = (WITH
*
ERROR at line 2:
ERROR 발생 1000000 rows updated.
SQL>
11g 12c
SELECT * SELECT *
FROM employees e, FROM employees e,
(SELECT * LATERAL(SELECT *
FROM departments d FROM departments d
WHERE e.department_id = d.department_id); WHERE e.department_id = d.department_id);
에러 없이
정상 처리됨
commit;
end loop;
/
하나씩 실행됨 | 17 |
| 18 |
PX SELECTOR | |
TABLE ACCESS FULL| TEST_TBL2 |
| 19 | PX RECEIVE | |
| 20 | PX SEND ROUND-ROBIN| :TQ10002 |
| 21 | PX SELECTOR | |
| 22 | TABLE ACCESS FULL| TEST_TBL3 |
--------------------------------------------------
8. Improved Defaults
• Sequence
• when NULL
X Y
---------- ------------------------------
1 hello world
Table created.
X Y Z
---------- ---------- ----------
2 55 42
3 100 200
-1 -2 -3
CREATE TABLE t1
(id NUMBER GENERATED AS IDENTITY,
first_name varchar2(30)
);
Table created.
X Y
---------- ----------
1 100
42 200
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted
ORA-00972 에러를 제거하라
1. Longer Identifiers (12.2)
테이블명은 28 bytes
인덱스명은 31 bytes
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 56
Data Conversion and Validation
CREATE TABLE t1 ( ON CONVERSION ERROR 옵션을 이용하여
data VARCHAR2(20) 에러발생시 디폴트 값을 출력함
);
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 57
Data Conversion and Validation
ON CONVERSION ERROR 옵션을 이용하여
에러발생시 디폴트 값을 출력함
TO_DATE(D
---------
01-JAN-00
01-JAN-16
01-JAN-00
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 58
Data Conversion and Validation
CAST(DATAASTIMESTAMPDEFAULTNULLONCONVERSIONERROR,'DD-MON-YYYY')
---------------------------------------------------------------------------
01-JAN-16 12.00.00.000000000 AM
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 59
Data Conversion and Validation
형변환이 가능한지 판단함 NUMBER TYPE으로 변환이 가능한지 검사함
1: 형변환 가능
0: 형변환 불가능
SELECT data
FROM t1
WHERE VALIDATE_CONVERSION (data AS NUMBER ) = 1;
DATA
--------------------
11111 변환이 가능한 데이터만 출력함
DATE TYPE으로 변환이 가능한지 검사함
SELECT data
FROM t1
WHERE VALIDATE_CONVERSION(data AS DATE, 'DD-MON-YYYY') = 1;
DATA
--------------------
01-JAN-2016
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 60
같은 그룹은 가로로 펼쳐라
주문번호 제품명
1000 제품1, 제품2, 제품3, 제품4, 제품5 원하는 결과
1001 제품1…..
주문번호 제품명
1000 제품1
1000 제품2
주문번호 제품명
1000 제품3
1000 제품1, 제품2, 제품3, 제품4, 제품5
1000 제품4
1000 제품5
SELECT id
, LISTAGG(str,'-' ON OVERFLOW TRUNCATE ) WITHIN GROUP(ORDER BY 1) AS string_created
FROM test
GROUP BY id
4000 Bytes를 초과하는
결과는 생략가능
ID STRING_CREATED
-- ------------------------------------------
0 TextXXXXXX-TextXXXXXX-TextXXXXXX-...(1068)
1 TextXXXXXX-TextXXXXXX-TextXXXXXX-...(1069) 1069건이 생략됨
2 TextXXXXXX-TextXXXXXX-TextXXXXXX-...(1069)
SELECT id
, LISTAGG(str,'-' ON OVERFLOW TRUNCATE ' [more] ' WITHOUT COUNT ) WITHIN GROUP(ORDER BY 1) AS string_created
FROM test
GROUP BY id
그럼 MView를 써볼까?
하지만…..
소스테이블이
소스테이블의 데이터가변경되면
변경되면
Query Rewrite가 안됨
Query Rewrite가 안됨
12.2 부터 소스 변경분을
감안한 Mview 등장
소스 테이블 변경
• 제약사항
– ENABLE ON QUERY COMPUTATION 옵션을 반드시 사용해야함
– QUERY_REWRITE_INTEGRITY가 ENFORCED (the default) 또는 TRUSTED로 설정되어야 가능함
STALE_TOLERATED는 불가능
– REFRESH … ON COMMIT 옵션과 같이 사용할 수 없음
– Mview 소스테이블은 database link가 될 수 없음
– 소스 테이블에 변경분이 있을 때 Mview를 Direct로 select 하면 변경분이 반영되지 않음
(FRESH_MV 힌트를 사용하면 가능함)
• 유의사항
– Real Time Mview를 사용하더라도 Refresh를 최소화할 뿐이며, 변경분이 많아져서 읽어야 할 Log가
많아지면 성느이 느려짐.
– 성능향상을 위해서 정기적인 Refresh 가 필요함
Ext_tab은 세개의
파일로 구성됨
Modify 가능한
파라미터
Location을 수정해서
사용하는 예제
• 장점:
– Partition Pruning으로 성능향상
– 데이터 관리의 편의성
– full and partial partition-wise join이 가능함
Range Y Y N N
List Y Y N N
Interval N N N N
Select * from salesrp_xt_hdfs partition (p2) order by c2; where s.l_orderkey = e.sal and e.job = 'SALESMAN';
------------------------------------------------------------------------ --------------------------------------------------------------------------
------------------------------------------------------------------------ --------------------------------------------------------------------------
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted
External Table을 동적으로 Control한다
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal 93
In-Memory For External Tables(2/2)
External Data도 빠른 분석이 가능해짐 3. External 테이블을 In-Memory
영역에 Loading
1. 파라미터 설정(In-Memory option)
inmemory_size = XXX GB
SQL> exec dbms_inmemory.populate(USER,'S_ET');
create table s_et(
s_suppkey number , PL/SQL procedure successfully completed.
s_name char(25) ,
s_address varchar2(40) , SQL> exec dbms_inmemory.populate(USER,'SUPPLIER');
s_nationkey number ,
s_phone char(15) , PL/SQL procedure successfully completed. 4. External 테이블이 In-Memory
s_acctbal number , 영역에 Loading되었는지 확인
s_comment varchar2(101)
SQL> select
)
organization external ( SEGMENT_NAME,INMEMORY_SIZE,BYTES_NOT_POPULATED,POPULATE_STATUS,IS_EXTERNAL
type ORACLE_LOADER from v$im_segments;
2. External 테이블을 In-Memory +
default directory T_WORK Query High 압축으로 생성
access parameters
( SEGMENT_NAME INMEMORY_SIZE BYTES_NOT_POPULATED POPULATE_STAT IS_EX
records delimited by newline ------------ ------------- ------------------- ------------- -----
nobadfile SUPPLIER 2359296 0 COMPLETED FALSE
nologfile S_ET 2228224 0 COMPLETED TRUE
fields terminated by '|'
missing field values are null
)
location (T_WORK:'supplier.tbl') 5. S_ET 테이블이 IN-MEMORY
) 영역에 로딩완료 되었으며 External
reject limit unlimited 테이블임을 확인함
INMEMORY MEMCOMPRESS FOR QUERY HIGH;
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 94
세션에서만 존재하는 임시 테이블
• 데이터도 세션마다 다름
– Session or transaction duration
Commit 시 테이블
drop이 Default임
Sort
Weblog Top-N
Data Read
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | 102
Approximate Top-N vs Common Top-N 성능비교
Group by 및 sort 건수
3202 VS 4
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | 103
Approximate(추정) 함수의 에러율은?
추정치는 항상 과대평가됨
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | 104
Approximate Top-N Queries
• Approx. functions:
– APPROX_COUNT, APPROX_SUM, APPROX_RANK
• 고성능
– 처리할 데이터가 클 수록 효율이 좋음
• 정확도가 높음
– Maximum error reporting : 최대 에러 값을 제시함
• "Top-N Structure" 는 Sort 일량을 줄임으로 메모리에서 처리될 가능성이 높음
– No disk sorts
Weblog Top-N
Read Structure Top-N
Data
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | 105
세션은 취소하지 않은 상태에서 특정 SQL만 취소하라
특정 세션의 특정 SQL을 취소
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | 107
ALTER SYSTEM CANCEL SQL – 필요 스크립트
세션정보를 이용하여
SQL을 취소함
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | 108
Export/Import 재작업을 방지한다
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 110
Import with the CONTINUE_LOAD_ON_FORMAT_ERROR option
CONTINUE_LOAD_ON_FORMAT_ERROR option:
• 전체가 Rollback 되는 대신 에러가 발생한 데이터의 granule은 Skip됨.
• 다음 granule 부터 다시 Loading 시작하기 때문에 수백 ~ 수천행이 Skip될 수 있음
• Stream Format 에러가 없는 행을 찾아 데이터를 계속 로드 함
• Network Mode Import에서는 옵션이 무시됨(소스가 DB Link인 경우)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 111
파티션 변경도 Online으로 가능하다
SQL> ALTER TABLE sales MODIFY PARTITION BY RANGE (c1) INTERVAL (100)
(PARTITION p1 …, PARTITION p2 …) ONLINE UPDATE INDEXES;
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 114
Online Modification of Subpartitioning Strategy: Example
SQL> CREATE TABLE sales (prodno NUMBER NOT NULL, custno NUMBER, time_id DATE,
… qty_sold NUMBER(10,2), amt_sold NUMBER(10,2))
PARTITION BY RANGE (time_id)
(PARTITION s_q1_17 VALUES LESS THAN (TO_DATE('01-APR-2017','dd-MON-yyyy')),
PARTITION s_q2_17 VALUES LESS THAN (TO_DATE('01-JUL-2017','dd-MON-yyyy')), …);
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 115
Online MERGE Partition and Subpartition: Example
SQL> ALTER TABLE sales MERGE PARTITIONS jan17,feb17,mar17 INTO PARTITION q1_17
COMPRESS UPDATE INDEXES ONLINE;
서브파티션도 같은 방식으로
수행가능 함
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 116
PK INDEX의 Hot Block을 제거하라
하위 블록이 없음
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 119
Scalable Extend Sequence
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 120
Scalable Extend Sequence - enq: TX - index contention 문제가 줄어드는 이유
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 121
PK 인덱스를 이용한 Table Access를 빠르게
8. Memoptimized Rowstore
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 124
Memoptimized Rowstore – 적용(1/3)
1. memoptimize_pool_size 지정
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 125
Memoptimized Rowstore – 적용(2/3)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 126
Memoptimized Rowstore – 적용(3/3)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 127
Memoptimized Rowstore – 구조
Memoptimize 버퍼 영역:
• memoptimize 버퍼는 데이터베이스 버퍼 캐시와 동일한 구조를
사용함
• 하지만 버퍼캐시에 포함되지 않는 별개의 메모리 구조임
• memoptimize 버퍼 영역은 memoptimize 풀의 75 %를 차지함
Hash Index 영역
• 해시 인덱스를 여러 개의 인접하지 않은 메모리 Unit 에 할당함
• 각 유닛에는 많은 해시 버킷이 있음
• 해시 인덱스는 memoptimize 풀의 25 %를 차지함
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 128
Memoptimized Rowstore – DBMS_MEMOPTIMIZE 패키지
Hash 인덱스 구조와 테이블(혹은 파티션)
data를 Memoptimize Pool에 Loading 함
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 129
Memoptimized Rowstore - 주의 사항(1/2)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 130
Memoptimized Rowstore - 주의 사항(2/2)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. 5 - 131
18c SQL을 실행하려면 LIVE SQL을 이용하라
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 133
Learn More
18c?
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 134
Learn More 18c?
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 135
학습의 의미
學而時習之 不亦說乎
“배워서(學) 시간이 날 때마다 반복해(習) 몸에 익히면 진실로 기쁘지 않겠는가?”
학습 = 여러 번의 실습
공자(BC.551 ~ BC.479)