기본 콘텐츠로 건너뛰기

MySQL Database Service(MDS) + HeatWave 실습/테스트

 

MySQL 클라우드서비스인 MDS 에서 사용 가능한 HeatWave 적용 방법 테스트를 공유하려고 한다.

HeatWave 는 별도의 ETL 작업 없이 OLTP 에서 사용중인 데이터를 HeatWave 메모리에 실시간으로 반영하여 OLTP와 OLAP 을 동시에 사용할 수 있게 해주는 서비스이다.


이 포스팅은 HeatWave 적용하는 방법을 테스트 해봤다.


오라클 클라우드 계정에 MySQL 을 생성하고 





HeatWave 사용을 위해 Node 두개를 Enable 시켰다.







- 샘플로 사용한 테이블 생성

CREATE TABLE ORDERS ( O_ORDERKEY BIGINT NOT NULL,
O_CUSTKEY INTEGER NOT NULL,
O_ORDERSTATUS CHAR(1) NOT NULL,
O_TOTALPRICE DECIMAL(15,2) NOT NULL,
O_ORDERDATE DATE NOT NULL,
O_ORDERPRIORITY CHAR(15) NOT NULL,
O_CLERK CHAR(15) NOT NULL,
O_SHIPPRIORITY INTEGER NOT NULL,
O_COMMENT VARCHAR(79) NOT NULL,
PRIMARY KEY (O_ORDERKEY));
CREATE TABLE LINEITEM ( L_ORDERKEY BIGINT NOT NULL,
L_PARTKEY INTEGER NOT NULL,
L_SUPPKEY INTEGER NOT NULL,
L_LINENUMBER INTEGER NOT NULL,
L_QUANTITY DECIMAL(15,2) NOT NULL,
L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
L_DISCOUNT DECIMAL(15,2) NOT NULL,
L_TAX DECIMAL(15,2) NOT NULL,
L_RETURNFLAG CHAR(1) NOT NULL,
L_LINESTATUS CHAR(1) NOT NULL,
L_SHIPDATE DATE NOT NULL,
L_COMMITDATE DATE NOT NULL,
L_RECEIPTDATE DATE NOT NULL,
L_SHIPINSTRUCT CHAR(25) NOT NULL,
L_SHIPMODE CHAR(10) NOT NULL,
L_COMMENT VARCHAR(44) NOT NULL,
PRIMARY KEY (L_ORDERKEY, L_LINENUMBER))
PARTITION BY KEY()
PARTITIONS 128;


- MySQL Shell을 이용하여 업로드

MySQL>SQL> \js
MySQL>JS>
util.importTable("/home/opc/tpc/dbgen/orders.tbl", {schema:"normal", table:"orders", fieldsTerminatedBy:"|", bytesPerChunk:"100M", threads:16})
util.importTable("/home/opc/tpc/dbgen/lineitem.tbl", {schema:"normal", table:"lineitem", fieldsTerminatedBy:"|", bytesPerChunk:"100M", threads:16})





- 테스트할 테이블에 comment  encoding 설정을 하고
 - 각 Node 에 분배할 Key지정(defualt : PK)
 - 해당 테이블 HeatWave 에 지정

-- optimal encodings
--컬럼 성격에 따라서 encoding을 지정해준다
--Variable-length encoding (VARLEN) : Default. distinct value가 높은컬럼(코멘트)
--Dictionary encoding (SORTED) : distinct value가 작은 컬럼(코드,나라이름)
alter table ORDERS change O_ORDERSTATUS O_ORDERSTATUS CHAR(1) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table ORDERS change O_ORDERPRIORITY O_ORDERPRIORITY CHAR(15) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table ORDERS change O_CLERK O_CLERK CHAR(15) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table ORDERS change O_COMMENT O_COMMENT VARCHAR(79) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table LINEITEM change L_RETURNFLAG L_RETURNFLAG CHAR(1) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table LINEITEM change L_LINESTATUS L_LINESTATUS CHAR(1) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table LINEITEM change L_SHIPINSTRUCT L_SHIPINSTRUCT CHAR(25) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table LINEITEM change L_COMMENT L_COMMENT VARCHAR(44) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table LINEITEM change L_SHIPMODE L_SHIPMODE CHAR(10) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
alter table ORDERS change O_COMMENT O_COMMENT VARCHAR(79) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN';
-- optimal data placement
--defualt 는 pk 이나 주로 사용되는 조인key, group by 기준에 따라 설정 가능
alter table LINEITEM change L_ORDERKEY L_ORDERKEY BIGINT NOT NULL COMMENT 'RAPID_COLUMN=DATA_PLACEMENT_KEY=1';
-- mark tables for RAPID
alter table LINEITEM secondary_engine RAPID;
alter table ORDERS secondary_engine RAPID;
-- Set Parallel reads threads to 32
set innodb_parallel_read_threads=32;
ALTER TABLE LINEITEM SECONDARY_LOAD;
ALTER TABLE ORDERS SECONDARY_LOAD;


 - 20기가 정도 되는 Lineitem 테이블을 HeatWave Node에 올리는데 2분 11초 정도 걸렸다.
 - Order 테이블은 3기가 정도로 12초 소요되었다.

MySQL 10.0.0.146:3306 ssl tpch SQL > set innodb_parallel_read_threads=32;
Query OK, 0 rows affected (0.0005 sec)
MySQL 10.0.0.146:3306 ssl tpch SQL > ALTER TABLE LINEITEM SECONDARY_LOAD; --약 15기가
Query OK, 0 rows affected (2 min 11.8548 sec)
MySQL 10.0.0.146:3306 ssl tpch SQL > ALTER TABLE ORDERS SECONDARY_LOAD;
Query OK, 0 rows affected (12.6465 sec)


 - Test 할 SQL 을 HeatWave 사용 / 미사용 실행
 - 일반 MySQL InnoDB에서 11.13 분
 - MySQL HeatWave 에서 0.1 초


--HeatWave 미사용시
SET SESSION use_secondary_engine=OFF;
mysql> SELECT
O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT
FROM ORDERS
WHERE O_ORDERDATE >= DATE '1994-03-01'
-> O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT
-> FROM ORDERS
-> WHERE O_ORDERDATE >= DATE '1994-03-01'
-> AND O_ORDERDATE < DATE '1994-03-01' + INTERVAL '3' MONTH
-> AND EXISTS( SELECT *
-> FROM LINEITEM
-> WHERE L_ORDERKEY = O_ORDERKEY
-> AND L_COMMITDATE < L_RECEIPTDATE)
-> GROUP BY O_ORDERPRIORITY
-> ORDER BY O_ORDERPRIORITY;
+-----------------+-------------+
| O_ORDERPRIORITY | ORDER_COUNT |
+-----------------+-------------+
| 1-URGENT | 210875 |
| 2-HIGH | 209521 |
| 3-MEDIUM | 209832 |
| 4-NOT SPECIFIED | 210284 |
| 5-LOW | 211114 |
+-----------------+-------------+
5 rows in set (11 min 13.53 sec)
--HeatWave 사용시
SET SESSION use_secondary_engine=ON;
mysql> SELECT
O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT
FROM ORDERS
WHERE O_ORDERDATE >= DATE '1994-03-01'
-> O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT
-> FROM ORDERS
-> WHERE O_ORDERDATE >= DATE '1994-03-01'
-> AND O_ORDERDATE < DATE '1994-03-01' + INTERVAL '3' MONTH
-> AND EXISTS( SELECT *
-> FROM LINEITEM
-> WHERE L_ORDERKEY = O_ORDERKEY
-> AND L_COMMITDATE < L_RECEIPTDATE)
-> GROUP BY O_ORDERPRIORITY
-> ORDER BY O_ORDERPRIORITY;
+-----------------+-------------+
| O_ORDERPRIORITY | ORDER_COUNT |
+-----------------+-------------+
| 1-URGENT | 210875 |
| 2-HIGH | 209521 |
| 3-MEDIUM | 209832 |
| 4-NOT SPECIFIED | 210284 |
| 5-LOW | 211114 |
+-----------------+-------------+
5 rows in set (0.10 sec)



mysql> explain SELECT /*+ set_var(use_secondary_engine=forced) */ O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT FROM ORDERS WHERE O_ORDERDATE >= DATE '1994-03-01' AND O_ORDERDATE < DATE '1994-03-01' + INTERVAL '3' MONTH AND EXISTS( SELECT *
FROM LINEITEM WHERE L_ORDERKEY = O_ORDERKEY AND L_COMMITDATE < L_RECEIPTDATE) GROUP BY O_ORDERPRIORITY ORDER
BY O_ORDERPRIORITY\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: ORDERS
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 29616076
filtered: 11.11
Extra: Using where; Using temporary; Using filesort; Using secondary engine RAPID
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: LINEITEM
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 119026612
filtered: 3.33
Extra: Using where; FirstMatch(ORDERS); Using join buffer (hash join); Using secondary engine RAPID
2 rows in set, 2 warnings (0.00 sec)





 - Extra 에 Using secondary engine RAPID 표시 확인.




* 참고 


#오라클클라우드 #MySQL #HeatWave #MDS #OCI 

댓글

이 블로그의 인기 게시물

[OCI] OCI와 Azure 간 VPN 통신

참고:  https://joungminko.github.io/2021/04/01/oci-azure-vpn-conn.html   [OCI] OCI와 Azure 간 VPN 통신 OCI와 Azure 간 IPsec VPN 연결을 위한 방법 설명입니다.(static 연결) 1. 개요 OCI와 Azure 가 사용하는 private IP 대역이 달라야 합니다(예: OCI(10.5.0.0/16), Azure(10.0.0.0/16)) IPsec 연결을 위해 Azure VPN(virtual network gateway) 장비 생성 후 OCI에서 VPN 연결 생성, 그 다음 Azure에서 OCI의 VPN tunne에 대응하는 local network gateway 생성 후 route table로 연결하는 순서로 작업 하시면 됩니다. 그 밖에 방화벽 설정도 필요합니다. 2. 작업 순서 OCI와 Azure에서 가상 네트워크 생성 Azure에서 marketplace의 virtual network gateway 생성(CPE 장비(VPN)) 경로 기반 설정 static으로 virtual network gateway가 사용할 subnet 주소 설정(Azure의 가상 네트워크의 다른 subnet으로 지정) public IP 생성 OCI에서 IPsec 설정 Azure의 virtual network gateway의 public IP 정보로 OCI CPE 의 public IP 설정 Static route 주소에 Azure의 private network CIDR 정보 입력 default 2개의 tunnel 생성(각 tunnel의 public IP와 Shared secret 생성됨) Azure에서 marketplace의 local network gateway 생성 OCI IPsec에서 만들어진 ...

OCI Oracle database 를 bastion 서버를 통해 접속하는 방법

# 개요: - public subnet 안에 bastion server를 private subnet 안에 database server를 구성한 경우 bastion 서버를 통해 외부에서 database로의 연결 을 한다. 이때 ssh 를 통해 클라이언트의 지정된 포트가 bastion을 통해 database로 연결하는 방법을 사용하도록 한다. # 설정 순서/테스트 1. public subnet의 bastion 서버에서 private subnet의 database으로 접속을 sqlplus로 수행해 routing과 security list 설정을 확인한다. - linux VM에 sqlplus 내려받기 및 실행 wget https://download.oracle.com/otn_software/linux/instantclient/214000/instantclient-basic-linux.x64-21.4.0.0.0dbru.zip wget https://download.oracle.com/otn_software/linux/instantclient/214000/instantclient-sqlplus-linux.x64-21.4.0.0.0dbru.zip   위 2개 파일을 unzip하고 이것을 .bashrc에 path 추가하여 sqlplus가 사용되도록 한다. export LD_LIBRARY_PATH=/home/opc/instantclient_21_4 export PATH=$LD_LIBRARY_PATH:$PATH <- 이러한 형태로 /home/opc/.bashrc에 추가 sqlplus sys/비밀번호@데이터베이스IP:1521/서비스네임 as sysdba <- 이렇게 실행하여 접속이 되는지 확인 이때 내 경우에는 접속이 되지 않았고 이유를 확인해 보니  public subnet -> private subnet의 접속 과정에서 private subnet의 security list 중 ingress rule 이 빠져있기 때문이여서 이를 추가 했다. 예:...