반응형


MariaDB JSON 형식 데이터 사용 : MariaDB 10.2 부터 가능

참고 사이트

https://mariadb.com/kb/en/library/json-functions/
https://mariadb.com/resources/blog/json-with-mariadb-10-2/
https://bstar36.tistory.com/359


1. 버전 확인
    MariaDB [(test)]> select @@version;
    +-----------------+
    | @@version       |
    +-----------------+
    | 10.3.17-MariaDB |
    +-----------------+
    1 row in set (0.000 sec)

2. JSON 데이터 타입 지원(내부적으로 LongTEXT로 저장)    
    MariaDB [test]> create table json_test (id int, data json);
    Query OK, 0 rows affected (0.015 sec)

    MariaDB [test]> show create table json_test;
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table     | Create Table                                                                                                                                                                                  |
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | json_test | CREATE TABLE `json_test` (
      `id` int(11) DEFAULT NULL,
      `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.000 sec)


3. JSON 데이터 조작
   A. json_object 함수를 이용하여 key,value 형식으로 Insert
    MariaDB [test]> insert into json_test values (1 , json_object('Name' , 'Kil-Dong, Hong' , 'Sex' , 'M' , 'Phone' , '010-1234-5678')) ;
    Query OK, 1 row affected (0.003 sec)
    
    MariaDB [test]> commit;
    Query OK, 0 rows affected (0.000 sec)
    
    MariaDB [test]> select * from json_test ;
    +------+------------------------------------------------------------------+
    | id   | data                                                             |
    +------+------------------------------------------------------------------+
    |    1 | {"Name": "Kil-Dong, Hong", "Sex": "M", "Phone": "010-1234-5678"} |
    +------+------------------------------------------------------------------+
    1 row in set (0.000 sec)

   B. 특정 key 값만 조회 하고자 할때 json_value 함수를 사용 
   
    MariaDB [test]> select id , json_value(data,'$.Name') As Name , json_value(data,'$.Phone') as Phone from json_test ;
    +------+----------------+---------------+
    | id   | Name           | Phone         |
    +------+----------------+---------------+
    |    1 | Kil-Dong, Hong | 010-1234-5678 |
    +------+----------------+---------------+
    1 row in set (0.001 sec)
    
    C. 특정 하나 Key 값을 update 하고자 할때,  json_replace 함수를 사용
    
    ※ 단, 이름은 중복날 수 있으니 Unique 값으로 비교하는 것을 추천 (사용방법 안내)
    MariaDB [test]> update json_test set data = json_replace(data,'$.Phone','010-2345-6789') where json_value(data,'$.Name') = 'Kil-Dong, Hong';
    Query OK, 1 row affected (0.002 sec)
    Rows matched: 1  Changed: 1  Warnings: 0


    MariaDB [test]> select id , json_value(data,'$.Name') As Name , json_value(data,'$.Phone') as Phone from json_test ;
    +------+----------------+---------------+
    | id   | Name           | Phone         |
    +------+----------------+---------------+
    |    1 | Kil-Dong, Hong | 010-2345-6789 |
    +------+----------------+---------------+
    1 row in set (0.000 sec)
    
    
    Object 값 자체로 추출("" 형태)
    MariaDB [test]> SELECT JSON_EXTRACT(data, '$.Name') from json_test;
    +------------------------------+
    | JSON_EXTRACT(data, '$.Name') |
    +------------------------------+
    | "Su, Peng"                   |
    | "Dori Go"                    |
    | "DaHan, Wi "                 |
    | NULL                         |
    | NULL                         |
    +------------------------------+
    5 rows in set (0.000 sec)
    
    
    MariaDB [test]> SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.Name')) from json_test;
    +--------------------------------------------+
    | JSON_UNQUOTE(JSON_EXTRACT(data, '$.Name')) |
    +--------------------------------------------+
    | Su, Peng                                   |
    | Dori Go                                    |
    | DaHan, Wi                                  |
    | NULL                                       |
    | NULL                                       |
    +--------------------------------------------+
    5 rows in set (0.000 sec)


    
    D. 하나 이상의 Key 값을 변경할 때는 json_set 함수 사용

    MariaDB [test]> update json_test set data = json_set(data,'$.Phone','010-3456-7890', '$.Name','Su, Peng') where id = 1 ;
    Query OK, 1 row affected (0.001 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

    MariaDB [test]> select id , json_value(data,'$.Name') As Name , json_value(data,'$.Phone') as Phone from json_test ;
    +------+----------+---------------+
    | id   | Name     | Phone         |
    +------+----------+---------------+
    |    1 | Su, Peng | 010-3456-7890 |
    +------+----------+---------------+
    1 row in set (0.000 sec)

 
    E. Json 형태가 추가되어도 입력이 가능
    insert into json_test values (2 , json_object('Name' , 'Dori Go' , 'Sex' , 'F' , 'Phone' , '02-123-4567' , 'Birth', '2000-01-01')) ; 
    
    MariaDB [test]> insert into json_test values (2 , json_object('Name' , 'Dori Go' , 'Sex' , 'F' , 'Phone' , '02-123-4567' , 'Birth', '2000-01-01')) ;
    Query OK, 1 row affected (0.001 sec)
    
    MariaDB [test]> commit;
    Query OK, 0 rows affected (0.000 sec)
    
    MariaDB [test]> select * from json_test;
    +------+--------------------------------------------------------------------------------+
    | id   | data                                                                           |
    +------+--------------------------------------------------------------------------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"}                     |
    |    2 | {"Name": "Dori Go", "Sex": "F", "Phone": "02-123-4567", "Birth": "2000-01-01"} |
    +------+--------------------------------------------------------------------------------+
    2 rows in set (0.000 sec)

    F. json 데이터 값의 Like 검색
    
    MariaDB [test]> select count(*) from json_test where json_value(data,'$.Phone') like '02%' ;
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.000 sec)
     
    G. json 데이터 타입의 key를 가상 컬럼을 생성 후 Index 작업 가능
    
    - 테이블 변경(가상 컬럼 추가)
    MariaDB [test]> alter table json_test add phone varchar(20) as (json_value(data,'$.phone')) ;
    Query OK, 0 rows affected (0.341 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    MariaDB [test]> select * from json_test limit 1 ;
    +------+------------------------------------------------------------+-------+
    | id   | data                                                       | phone |
    +------+------------------------------------------------------------+-------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"} | NULL  |
    +------+------------------------------------------------------------+-------+
    1 row in set (0.000 sec)

    현재 화면에서 데이터가 안나오는 이유는 Key의 Phone은 P가 대문자 생성시에는 소문자로 만들었음
    삭제 후 다시 추가

    MariaDB [test]> alter table json_test drop phone;
    Query OK, 0 rows affected (0.009 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    MariaDB [test]>  select * from json_test limit 1 ;
    +------+------------------------------------------------------------+
    | id   | data                                                       |
    +------+------------------------------------------------------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"} |
    +------+------------------------------------------------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> alter table json_test add phone varchar(20) as (json_value(data,'$.Phone')) ;
    Query OK, 0 rows affected (0.012 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    MariaDB [test]>  select * from json_test;
    +------+--------------------------------------------------------------------------------+---------------+
    | id   | data                                                                           | phone         |
    +------+--------------------------------------------------------------------------------+---------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"}                     | 010-3456-7890 |
    |    2 | {"Name": "Dori Go", "Sex": "F", "Phone": "02-123-4567", "Birth": "2000-01-01"} | 02-123-4567   |
    +------+--------------------------------------------------------------------------------+---------------+
    2 rows in set (0.000 sec)
    
       
    - 인덱스 생성
    key 값을 기준으로 가상 생성된 컬럼에 index를(ix_json_test_01)  추가
    MariaDB [test]> create index ix_json_test_01 on json_test(phone) ;
    Query OK, 0 rows affected (0.021 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    explain 을 통해 plan을 조회합니다.
    MariaDB [test]> explain select count(*) from json_test where Phone like '02%' ;
    +------+-------------+-----------+-------+-----------------+-----------------+---------+------+------+--------------------------+
    | id   | select_type | table     | type  | possible_keys   | key             | key_len | ref  | rows | Extra                    |
    +------+-------------+-----------+-------+-----------------+-----------------+---------+------+------+--------------------------+
    |    1 | SIMPLE      | json_test | index | ix_json_test_01 | ix_json_test_01 | 63      | NULL |    2 | Using where; Using index |
    +------+-------------+-----------+-------+-----------------+-----------------+---------+------+------+--------------------------+
    1 row in set (0.000 sec)

    H. Json Object를 사용하지 않은 Insert
    MariaDB [test]> insert into json_test(id, data) values (3, '{"Name": "DaHan, Wi ", "Sex": "M", "Phone": "010-9876-5432", "Birth": "1999-12-31"}');
    Query OK, 1 row affected (0.003 sec)

    MariaDB [test]> select * from json_test;
    +------+-------------------------------------------------------------------------------------+---------------+
    | id   | data                                                                                | phone         |
    +------+-------------------------------------------------------------------------------------+---------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"}                          | 010-3456-7890 |
    |    2 | {"Name": "Dori Go", "Sex": "F", "Phone": "02-123-4567", "Birth": "2000-01-01"}      | 02-123-4567   |
    |    3 | {"Name": "DaHan, Wi ", "Sex": "M", "Phone": "010-9876-5432", "Birth": "1999-12-31"} | 010-9876-5432 |
    +------+-------------------------------------------------------------------------------------+---------------+
    3 rows in set (0.000 sec)


4. Json 관련 함수들
   관련 링크 :  https://mariadb.com/kb/en/library/json-functions/
   
   - JSON_Query와 JSON_VALUE 차이
     아래와 같이 임시로 json 변수를 선언하고 json 데이터를 저장합니다.
     
    MariaDB [test]> SET @json='{ "x": [0,1], "y": "[0,1]", "z": "Monty" }';
    Query OK, 0 rows affected (0.001 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$'), JSON_VALUE(@json,'$');
    +--------------------------------------------+-----------------------+
    | JSON_QUERY(@json,'$')                      | JSON_VALUE(@json,'$') |
    +--------------------------------------------+-----------------------+
    | { "x": [0,1], "y": "[0,1]", "z": "Monty" } | NULL                  |
    +--------------------------------------------+-----------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$.x'), JSON_VALUE(@json,'$.x');
    +-------------------------+-------------------------+
    | JSON_QUERY(@json,'$.x') | JSON_VALUE(@json,'$.x') |
    +-------------------------+-------------------------+
    | [0,1]                   | NULL                    |
    +-------------------------+-------------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$.y'), JSON_VALUE(@json,'$.y');
    +-------------------------+-------------------------+
    | JSON_QUERY(@json,'$.y') | JSON_VALUE(@json,'$.y') |
    +-------------------------+-------------------------+
    | NULL                    | [0,1]                   |
    +-------------------------+-------------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$.z'), JSON_VALUE(@json,'$.z');
    +-------------------------+-------------------------+
    | JSON_QUERY(@json,'$.z') | JSON_VALUE(@json,'$.z') |
    +-------------------------+-------------------------+
    | NULL                    | Monty                   |
    +-------------------------+-------------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$.x[0]'), JSON_VALUE(@json,'$.x[0]');
    +----------------------------+----------------------------+
    | JSON_QUERY(@json,'$.x[0]') | JSON_VALUE(@json,'$.x[0]') |
    +----------------------------+----------------------------+
    | NULL                       | 0                          |
    +----------------------------+----------------------------+
    1 row in set (0.000 sec)

    - JSON_ARRAY 함수
      10.2.3 버전부터 추가됨
      MariaDB [test]> SELECT Json_Array(56, 3.1416, 'My name is "Foo"', NULL);
    +--------------------------------------------------+
    | Json_Array(56, 3.1416, 'My name is "Foo"', NULL) |
    +--------------------------------------------------+
    | [56, 3.1416, "My name is \"Foo\"", null]         |
    +--------------------------------------------------+
    1 row in set (0.000 sec)


    MariaDB [test]> insert into json_test(id, data) values (4, JSON_ARRAY("Name","Ra, Ro ", "Sex", "F", "Phone", "010-1122-3344", "Birth", "1990-06-01"));
    Query OK, 1 row affected (0.003 sec)
 
     
    MariaDB [test]> select * from json_test;
    +------+-------------------------------------------------------------------------------------+---------------+
    | id   | data                                                                                | phone         |
    +------+-------------------------------------------------------------------------------------+---------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"}                          | 010-3456-7890 |
    |    2 | {"Name": "Dori Go", "Sex": "F", "Phone": "02-123-4567", "Birth": "2000-01-01"}      | 02-123-4567   |
    |    3 | {"Name": "DaHan, Wi ", "Sex": "M", "Phone": "010-9876-5432", "Birth": "1999-12-31"} | 010-9876-5432 |
    |    4 | ["Name", "Ra, Ro ", "Sex", "F", "Phone", "010-1122-3344", "Birth", "1990-06-01"]    | NULL          |
    +------+-------------------------------------------------------------------------------------+---------------+
    4 rows in set (0.000 sec)

    위의 id 4번 값은 아래에 보듯이 Type이 맞지 않기 때문에 phone값이 정상 인식 되지 않았음.
    
    MariaDB [test]> select json_type(data) from json_test;
    +-----------------+
    | json_type(data) |
    +-----------------+
    | OBJECT          |
    | OBJECT          |
    | OBJECT          |
    | ARRAY           |
    +-----------------+
    4 rows in set (0.001 sec)

    - 함수들 간략한 설명
    2
    JSON_QUERY와 JSON_VALUE의 차이점
        JSON_QUERY와 JSON_VALUE의 예제와 비교합니다.
    JSON_ARRAY
        나열된 값이 포함 된 JSON 배열을 반환합니다.
    JSON_ARRAY_APPEND
        JSON 문서 내에서 주어진 배열의 끝에 값을 추가합니다.
    JSON_ARRAY_INSERT
        JSON 문서에 값을 삽입합니다.
    JSON_COMPACT
        불필요한 모든 공간을 제거하여 json 문서가 가능한 한 짧습니다.
    JSON_CONTAINS
        지정된 JSON 문서 또는 문서 내의 지정된 경로에서 값을 찾을 수 있는지 여부
    JSON_CONTAINS_PATH
        지정된 JSON 문서에 지정된 경로의 데이터가 있는지 여부를 나타냅니다.
    JSON_DEPTH
        JSON 문서의 최대 깊이.
    JSON_DETAILED
        중첩 구조를 강조하는 가장 이해하기 쉬운 방식으로 JSON을 나타냅니다.
    JSON_EXISTS
        지정된 데이터에 지정된 JSON 값이 있는지 확인합니다. 
    JSON_EXTRACT
        JSON 문서에서 데이터를 추출합니다.
    JSON_INSERT
        JSON 문서에 데이터를 삽입합니다.
    JSON_KEYS
        JSON 객체의 최상위 값에서 키를 반환하거나 경로에서 최상위 키를 반환합니다.
        MariaDB [test]> select id, json_keys(data) from json_test;
        +------+-----------------------------------+
        | id   | json_keys(data)                   |
        +------+-----------------------------------+
        |    1 | ["Name", "Sex", "Phone"]          |
        |    2 | ["Name", "Sex", "Phone", "Birth"] |
        |    3 | ["Name", "Sex", "Phone", "Birth"] |
        |    4 | NULL                              |
        |    5 | NULL                              |
        +------+-----------------------------------+
        5 rows in set (0.000 sec)

    JSON_LENGTH
        JSON 문서의 길이 또는 문서 내 값의 길이를 반환합니다.
    JSON_LOOSE
        더 읽기 쉽게 보이도록 JSON 문서에 공백을 추가합니다.
    JSON_MERGE
        주어진 JSON 문서를 병합합니다.
    JSON_MERGE_PATCH
        주어진 JSON 문서의 RFC 7396 호환 병합
    JSON_MERGE_PRESERVE
        JSON_MERGE의 동의어
    JSON_OBJECT
        주어진 키 / 값 쌍을 포함하는 JSON 객체를 반환합니다. 
    JSON_QUERY
        JSON 문서가 주어지면 경로로 지정된 객체 또는 배열을 반환합니다.
    JSON_QUOTE
        문자열을 JSON 값으로 인용합니다.
    JSON_REMOVE
        JSON 문서에서 데이터를 제거합니다.
    JSON_REPLACE
        JSON 문서에서 기존 값을 바꿉니다.
    JSON_SEARCH
        JSON 문서 내에서 지정된 문자열의 경로를 반환합니다.
    JSON_SET
        JSON 문서에 데이터를 업데이트하거나 삽입합니다.
    JSON_TYPE
        JSON 값의 유형을 반환합니다.
    JSON_UNQUOTE
        JSON 값을 인용 해제하여 문자열을 반환합니다. 
    JSON_VALID
        값이 유효한 JSON 문서인지 여부 
    JSON_VALUE
        JSON 문서가 주어지면 지정된 스칼라를 반환합니다.
     

반응형

'Database > MYSQL' 카테고리의 다른 글

MariaDB connect 설치  (0) 2019.11.07
MariaDB 테이블 백업 및 복구  (0) 2019.11.01
MariaDB 우편번호 Import 하기  (0) 2019.11.01
MariaDB SHA2 512 방식으로 암호화 예제  (0) 2019.10.25
Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
반응형

무료 DB인 MariaDB를 사용함에 있어서

 

암복호화를 하는 것이 필요했습니다.

 

다음 예제는 임의의 Table 생성 후

 

SHA2 512 방식으로 암복호화 하는 예제를 첨부하였습니다.

 

다만,

 

- Function에서 길이나 별도의 예외 상황에 대한 추가 처리는 더 필요해 보입니다.

- key_value는 사이트 특성에 맞춰 수행이 필요합니다.

 

function 에서 암호화 키 값이 보일수 있기 때문에 보안 목적과 잘 고려하여 설정이 필요합니다.


-- 암호화 할 컬럼은 Byte 값을 반환하기 때문에 blob 사용

CREATE TABLE private_data ( 
NAME VARCHAR(21), 
phone BLOB, 
address BLOB 
); 

 

-- 데이터 입력

insert into private_data values( 
'김대식', 
AES_ENCRYPT('010-1234-1234',SHA2('key_value',512)), 
AES_ENCRYPT('서울시 송파구',SHA2('key_value',512))  
); 

 

-- 암호화 컬럼 데이터 조회

select name,  
CONVERT(AES_DECRYPT(phone,SHA2('key_value',512)) using utf8) phone,  
CONVERT(AES_DECRYPT(address,SHA2('key_value',512)) using utf8) address  
from private_data;


 

-- 함수 사용 데이터 조회

SELECT test.decfn(test.encfn('010-1234-1234')) FROM dual; 

SELECT NAME 
     , test.decfn(phone) AS phone 
     , test.decfn(address) AS address 
 FROM private_data;

 

encfn 함수

DELIMITER $$
DROP FUNCTION IF EXISTS test.encfn;
CREATE FUNCTION test.encfn(encvalue VARCHAR(1000)) RETURNS blob
BEGIN
DECLARE result BLOB DEFAULT '';
select AES_ENCRYPT(encvalue,SHA2('key_value',512)) INTO result FROM dual;
RETURN result;
END $$
DELIMITER ;

 

decfn 함수

DELIMITER $$
DROP FUNCTION IF EXISTS test.decfn;
CREATE FUNCTION test.decfn(decvalue blob) RETURNS VARCHAR(1000)
BEGIN
DECLARE result VARCHAR(1000) DEFAULT '';
select CONVERT(AES_DECRYPT(decvalue,SHA2('key_value',512)) using UTF8) INTO result FROM dual;
RETURN result;
END $$
DELIMITER ;

 

계정 생성 및 실행 권한 부여

(해당 쉘로 접속하여 수행)

 

CREATE USER 'testuser'@'%' IDENTIFIED BY 'testuser';

GRANT SELECT ON test.* TO 'testuser'@'%';

GRANT EXECUTE ON FUNCTION test.encfn TO testuser@'%';

GRANT EXECUTE ON FUNCTION test.decfn TO testuser@'%';

 

(만약 HediSQL에서 아래 에러가 발생하면)

 

원격 root에 대한(%) 권한 부족으로

해당 mariaDB에 접속하여 with grant option을 설정해 주면 됩니다.

 

SQL> grant all on *.* to 'root'@'%' identified by 'password' with grant option;

 

 

참고 사이트

https://m.blog.naver.com/jjjhyeok/220006204633

 

[mysql] MYSQL Function 함수 생성, 조회, 실행

아래 샘플코드는 코드조회용 FUNCTION생성 스크립트 샘플 DELIMITER $$ DROP...

blog.naver.com

https://hsunryou.blog.me/221543591162

 

MariaDB(10.1.23)의 AES 암호화 Key 길이는 ?

우선 암호화 테스트를 위한 테이블을 아래와 같이 구성해 보았습니다.# AES 암호화 키가 128Bit보다 작...

blog.naver.com

 

https://mariadb.com/kb/en/library/sha2/

 

SHA2

Calculates an SHA-2 checksum.

mariadb.com

 

https://eotlr0806.blog.me/221338753828

 

Mariadb 암호화 복호화

어플리케이션을 서비스 하다보면 개인정보를 다뤄야 하는 민감한 상황들이 옵니다... 이때 대부분 많이 사...

blog.naver.com

 

 

반응형

'Database > MYSQL' 카테고리의 다른 글

MariaDB 테이블 백업 및 복구  (0) 2019.11.01
MariaDB 우편번호 Import 하기  (0) 2019.11.01
Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
MySQL 백업용 쉘스크립트입니다.  (0) 2010.01.18
무료 접속 툴 (Free Tool)  (0) 2009.03.06
반응형


출처 : http://blog.naver.com/onlywin7788?Redirect=Log&logNo=140155221360

출처 : http://cafe.naver.com/ocmkorea/book2025209/9365


/*


--> 방식 1. (이 sql문은 이 방식임)

        1. 테이블 전체 목록 조회

           SQL> select * from tab;


        2. 수행한 쿼리의 Plan을 조회

           SQL> @xplan.sql


        3. 정확한 통계를 위해 힌트 실행

           SQL> select /*+ gather_plan_statistics */ * from tabs;


        * 오타 나지 않도록 주의함.


--> 방식 2

        1. 실행시 Plan  수집

           SQL> EXPLAIN FOR

                 SELECT * FROM TAB;


        2. 실제 정보 조회

           SQL> select * from tab(dbms_xplan.display());


                or


           SQL> select *

                from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST +alias +outline +predicate'))

/




--> 인자 정보


        dbms_xplan.display_cursor(인자1, 인자2, 인자3);


        인자1 : plan table 명을 입력하며, 따로 지정하지 않았을 때는 기본으로 'PLAN_TABLE'이다.


        인자2 : Execution Plan시 Set STATEMENT_ID를 지정한 경우 이를 불러올 수 있다.

                값이 Null일 경우 마지막에 실행된 문장을 불러온다.


        인자3 : 출력 포맷 형태 지정한다.



--> 세번째 인자의 포맷 정보


        1) 기본 Format Controller : 반드시 적용되어야 하는 기본적인 Controller임.

                                    적용하지 않더라도 자동으로 기본값으로 적용된다.


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


                basic    : 가장 기본적인 포맷으로서 Id, Operation, Object Name을 출력한다.

                typical  : basic 옵션에서 한발 더 나아가서 Optimizer가 예상할 수 있는 모든 것을 보여준다.

                           출력되는 정보로는 예상 Rows, 예상 Bytes, 예상 Temporary Space 사용량, Cost 예상 시간 Predicate Imformat(Operation 별로 Access 및 Filter 정보)이다.

                serial   : typical과 같으나 Parallel 쿼리 사용시 관련정보가 나오지 않는다.

                all      : Plan 정보는 typical과 같으나 Plan이외의 정보 중에서 Outline Data 정보를 제외하고 전부 출력한다.

                advanced : all과 같지만 Peeked Binds, Outline Data, Note 등을 더 보여준다.


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


        2) 세부 Format Controller : 기본 포맷정보에 의해서 표시되거나 생략되는 세부적인 포맷을 Control한다.

                                    이 Control은 +표시로 추가되거나 - 표시로 생략이 가능하다.


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


                alias    : 가장 기본적인 포맷으로서 Id, Operation, Object Name을 출력한다.

                bytes    : basic 옵션에서 한발 더 나아가서 Optimizer가 예상할 수 있는 모든 것을 보여준다.

                           출력되는 정보로는 예상 Rows, 예상 Bytes, 예상 Temporary Space 사용량, Cost 예상 시간 Predicate Information (Operation 별로 Access 및 Filter 정보)이다.

                cost     : typical과 같으나 Parallel쿼리 사용시 관련 정보가 나오지 않는다.

                note     : Plan 정보는 typical과 같으나 Plan이외의 정보 중에서 Outline Data 정보를 제외하고 전부 출력한다.

                outline  : all과 같지만 Peeked Binds, Outline Data, Note 등을 더 보여준다.

                parallel : Parallel 쿼리인 경우 TQ, IN-OUT, PQ Distribute 등의 정보를 Control한다.

                partition : Partition Access가 포함된 경우

                peeked_binds : Bind 변수의 값을 control 한다. 단, _optim_peek_user_binds 파라미터의 값이 true로 되어 있는 경우에만 해당되며 파라미터는 세션 단위로 수정이

                               가능하다. (Explain Plan은 출력되지 않음)

                predicate : Predicate Information을 Control한다. Operation 별로 Access 및 Filter 정보를 나타낸다.

                            일반적인 튜닝시 가장 눈 여겨봐야 할 정보이다.

                projection : Projection Information을 Control한다. Operation 별로 Select 되는 컬럼 정보를 나타낸다.

                remote   : DB Link를 사용할 때 Remote 쿼리의 수행 정보를 Control한다.

                rows     : Plan상의 E-Rows 수를 Control한다.


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


        3) 실행통계 Format Controller : 이 Control을 적용하면 실행시의 PGA 통계를 출력한다.


        이 정보들은 DBMS_XPLAN.DISPLAY 함수에는 적용되지 않는다.

        왜냐하면 Explain Plan은 실제 수행되는 것이 아니므로 실행통계정보가 없기 때문이다.


        또한 DBMS_XPLAN.DISPLAY_CURSOR 이나 DBMS_XPLAN.DISPLAY_AWR등의 함수 수행시에도 GATHER_STATISTICS 힌트를 주거나 아니면 STATISTICS_LEVEL 파라미터를 ALL로 설정해야 출력이 가능하다.


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


                allstats : I/O 통계정보(Buffers, Reads, Writes)와 PGA 통계 정보(OMem, 1Mem, Used-Mem, Used-Tmp, Max-Tmp 등)를 동시에 Control 한다.

                iostats  : I/O 통계정보(Buffers, Reads, Writes)를 Control 한다.

                last     : 실행 통계 출력시 이 Control을 명시하면 가장 마지막에 수행된 실행 통계를 출력한다.

                           이 Control을 명시하지 않으면 실행 통계츼 누적치를 출력하므로 주의가 필요합니다.

                memstats : PGA 통계정보(OMem, 1Mem, Used-Mem, Used-Tmp, Max-Tmp등)를 동시에 Control한다.

                runstats_last : iostats과 last Control 과 동일하다.

                                이 Control은 Oracle 10g Release 1에서만 사용할 수 있다.

                runstats_tot : iostats Control과 동일하다.

                               이 Control은 oracle 10g Release 1 에서만 사용할 수 있다.


                * runstats_last와 runstats_tot를 제외한 4가지의 Control은 Oracle 10g Release 2 이상에서만 사용할 수 있다.


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


        4) format 사용 예제


        Format중 가장 많은 정보를 출력 할 수 있는 포맷은 'advanced allstats last'이며 출력 가능한 모든 내용이 출력되게 되므로 상황이나, 자신에 맞는 포맷을 사용해야 적절함.


        4-1) 쿼리 변형이 없는 단순 쿼리 튜닝의 경우(최대한 단순한 포맷형태 사용)


             SQL> select * from table(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'allstats last-rows + predicate');


             => 포맷을 'allstats last-rows + predicate'로 주었으므로 예측 Row 수(E-row)가 생략되고 실행통계와 Predicate Information 만 출력된다.


        4-2) 쿼리 변형이 발생하거나 복잡한 쿼리 튜닝시 쿼리 블러과 힌트 정보를 추가로 출력


             SQL> select * from table(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'allstats last-rows + alias + outline + predicate');


             => 'allstats last-rows + alias + outline + predicate' 포맷을 사용하면 Query Block Name / Object Alias 정보와 Outline Data 정보가 추가로 출력된다.


                + alias는 쿼리블럭 정보를 추가하는 것이며, + Outline는 오라클이 내부적으로 사용하는 힌트정보 출력의 의미이다.


                쿼리 변형이 발생한 경우나 뷰(혹은 인라인뷰) 등을 튜닝할 경우 적합한 옵션이다.


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



        10046 + tkprof 와 동일한 정보를 조회는

        select /*+ gather_plan_statistics */ * from tab;


        select *

        from table(dbms_xplan.display_cursor(null, null, 'advanced ALLSTATS LAST +alias +outline +predicate'))


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



AWR 정보를 이용

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR(SQL_ID입력,NULL,NULL, 'ADVANCED ALLSTATS LAST'));


사용 권한 뷰


DISPLAY_CURSOR 함수 : V$SQL_PLAN, V$SESSION, V$SQL_PLAN_STATISTICS_ALL 뷰에 대한 SELECT 권한 필요

DISPLAY_AWR    함수 : DBA_HIST_SQL_PLAN, DBA_HIST_SQLTEXT, V$DATABASE 뷰에 대한 SELECT 권한 필요

DISPLAY_SQLSET 함수 : ALL_SQLSET_STATEMENTS, ALL_SQLSET_PLANS 뷰에 대한 SELECT 권한 필요


*/

select *

  from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST +alias +outline +predicate'))

/




반응형
반응형


오라클을 이관 후에는 컴파일을 일괄적으로 해야할 때가 존재한다...

1. 일괄 컴파일

 

Set heading off      
Set feedback off      
Set pages 1000      
 
 spool obj.sql
 select 'set termout on' from dual;
 select 'set echo on' from dual;      
      
 select 'alter trigger '||owner||'.'||object_name||' compile;'
 from dba_objects
 where status <> 'VALID'
 and object_type='TRIGGER';
     
 select 'alter package '||owner||'.'||object_name||' compile;'      
 from dba_objects      
 where status <> 'VALID'       
 and object_type='PACKAGE';      

 select 'alter package '||owner||'.'||object_name||' compile body;'     
 from dba_objects      
 where status <> 'VALID'       
 and object_type='PACKAGE BODY';

 select 'alter procedure '||owner||'.'||object_name||' compile;'       
 from dba_objects      
 where status <> 'VALID'       
 and object_type='PROCEDURE';      

 select 'alter function '||owner||'.'||object_name||' compile;'
 from dba_objects      
 where status <> 'VALID'
 and object_type='FUNCTION';

 select 'alter view '||owner||'.'||object_name||' compile;'       
 from dba_objects      
 where status <> 'VALID'       
 and object_type='VIEW';       
 
 spool off

[출처] [Oracle] 데이타베이스 한꺼번에 Compile하기|작성자 미친예언자




2. 일괄 컴파일

 host rm -rf comp1.sql comp2.sql
set pages 300
select count(1) as INVALID_OBJECT_COUNT from dba_objects where status !='VALID';
set pages 0
set line 1000
set echo off
set feedback off
set space 0
col compile for a1000
select systimestamp as start_time from dual;
spool comp1.sql
select 'prompt '||object_type||' '||object_name||' compiling'||'
prompt '||'
alter '||object_type||' '||owner||'.'||object_name||' compile;' as compile
from dba_objects
where status !='VALID'
and object_type !='PACKAGE BODY';
spool off
host ls -al comp1.sql
host echo "select systimestamp from dual;" >> comp1.sql
start comp1.sql
show error
spool comp2.sql
select 'prompt '||object_type||' '||object_name||' compiling'||'
prompt '||'
alter package '||owner||'.'||object_name||' compile body;' as compile
from dba_objects
where status !='VALID'
and object_type ='PACKAGE BODY';
spool off
host ls -al comp2.sql
host echo "select systimestamp from dual;" >> comp2.sql
start comp2.sql
show error
set echo on
set feedback on
set pages 3000
set space 1
col owner for a20
col object_name for a28
col object_type for a20
col status for a16
select owner,object_name,object_type,status from dba_objects
where status !='VALID';
select count(1) INVALID_OBJECT_COUNT from dba_objects where status !='VALID';
select systimestamp as end_time from dual;


3. 일괄 컴파일

 1. SQL> @?/rdbms/admin/utlrp.sql

2. utlrp를 parallel하게...
execute utl_recomp.recomp_parallel(4);

3. 만약 ERP라면...위의 두개로 해결이 안될때에는...
cd $AD_TOP/sql/adcompsc를 사용합니다.
adcompsc <== 이게 산타님 말씀하신것 처럼 alter문장을 생성하여 실행합니다.
참고하세요^^

반응형
반응형

AVG() -> 하나 이상의 값들로 부터 평균값을 반환합니다

 AVG() OVER() -> 분석 함수로 사용된 예

 RANK() WITHIN GROUP() -> 전체 값을 대상으로 특정 값의 순위를 반환합니다

 RANK() OVER() -> 특정 순위가 아닌 전체 순위를 반환합니다

 SUM() -> 하나 이상의 행으로 부터 합계를 반환합니다

 MAX() -> 하나 이상의 행으로 부터 최대값을 반환합니다

 MIN() -> 하나 이상의 행으로 부터 최소값을 반환합니다

 COUNT() -> 전체 행의 수를 반환합니다

반응형

'Database > ORACLE' 카테고리의 다른 글

DB NAME 과 SID 조회  (0) 2009.03.08
분석 함수  (0) 2009.03.08
ORACLE 10G PL/SQL USER GUIDE AND REFERENCE  (0) 2009.03.08
DBMS_JOB PACKAGE의 사용 방법과 예제  (0) 2009.03.08
INVALID OBJECT 컴파일 하는 방법  (0) 2009.03.08
반응형

USERENV : USERENV 함수는 현재 세션의 환경 정보를 반환합니다.
  - ENTRYID : 사용 가능한 Auditing entry Identifier를 반환합니다.
  - LABEL : 현재 세션의 Label을 반환합니다.
  - LANGUAGE : 현재 세션에서 사용중인 언어와 테리토리 값을 반환합니다.
  - SESSIONID : Auditing(감사) Session ID를 반환 합니다.
  - TERMINAL : 현재 세션 터미널의 OS ID를 반환 합니다.
반응형

+ Recent posts