Amazon Aurora MySQL에서 TPC-H 설정
이 점을 하기 위해 나는 몇 가지 기준 테스트 도구를 설정해야 하는데 데이터베이스에 대해서 말하자면 아직도 매우 많다.그러나 테스트 데이터베이스 조회의 표준 기준 중 하나는 TPC 기준 테스트이다.그중에 많은 것들이 있다. 나는 당연히 모든 넓이를 완전히 이해하지 못하지만 그 중 하나는 내가 찾는 물건의 기준 테스트에서 특히 유용하다. 이 기준 테스트는TPC-H이다.
나는 함께 모이는 데 아주 짧은 시간이 필요하다고 생각했지만, 주말 후에도 나는 여전히 발버둥치고 있었다.대부분의 원인은 내가 SQL에 대한 모든 지식이 부족하기 때문일 수 있지만, 나는 그것을 어떻게 시작하고 실행하는지 기록하고 공유하며, 다른 사람들을 위해 시간을 절약할 수 있기를 바란다.
시작하기 전에 뭐 필요하세요?
내가 유일하게 필요로 하는 것은 표준build essential/gcc 도구를 설치한 linux 데스크톱 (AWS에서 Ubuntu 실례를 실행하지만 다른 사람이 사용할 수 있습니다) 이다.다음 모든 단계는 이 워크스테이션에서 수행됩니다.
또한 병렬 쿼리 엔진이 구성된 Amazon Aurora 데이터베이스 클러스터가 필요합니다.
또한 워크스테이션 인스턴스를 Amazon Aurora 데이터베이스에 안전하게 연결하고 MySQL 클라이언트 도구를 모두 사용하도록 구성했습니다.Amazon 세션 관리자를 사용하여 Ubuntu 워크스테이션에 액세스합니다.
샘플 데이터 다운로드 및 생성
첫 번째 작업은 download the TPC-H files from TPC 이고,dbgen이라는 프로그램을 설정하고 컴파일하는 것입니다. 이 프로그램은 예시 데이터를 생성합니다.이것은 매우 간단하지만, 나는 다음과 같은 몇 가지를 해야 한다.
1. 파일 중 하나가 압축을 풀었습니다.dbgen 폴더에서makefile의 이름을 바꾸어야 합니다.makefile 키트
2. MySQL을 생성하고 컴파일러를 지정하기 위해dbgen을 설정하려면makefile을 편집해야 합니다.너는 단지 약간의 변화만 할 수 있다.
CC = gcc
DATABASE= MYSQL #database format is mysql
MACHINE = LINUX #System environment is linux
WORKLOAD = TPCH #Workloaded as tpch
3. 현재 헤더 파일 tpcd에 MYSQL 부분을 추가해야 합니다.h 다음 내용을 추가합니다 (열거된 다른 데이터베이스 제공 프로그램 다음에 추가했습니다)#ifdef MYSQL
#define GEN_QUERY_PLAN ""
#define START_TRAN "START TRANSACTION"
#define END_TRAN "COMMIT"
#define SET_OUTPUT ""
#define SET_ROWCOUNT "limit %d;\n"
#define SET_DBASE "use %s;\n"
#endif
4. 변경이 완료되면 make를 실행하여 코드를 컴파일할 수 있고 마지막으로dbgen 실행 가능한 파일을 얻을 수 있습니다. 현재 아래 명령을 사용하여 이 파일을 실행하여 예시 데이터를 생성할 수 있습니다.(이하 명령은 1GB의 데이터를 생성합니다. [-s1]에서는 매뉴얼 페이지를 보고 더 많은 옵션을 볼 수 있습니다.)$ ./dbgen -s 1
정상적으로 작동하면 폴더에서 다음 내용을 볼 수 있습니다.잠시 후 우리는 이것들을 사용할 것이다.customer.tbl
lineitem.tbl
nation.tbl
orders.tbl
part.tbl
partsupp.tbl
region.tbl
supplier.tbl
데이터베이스 만들기 및 샘플 데이터 가져오기
5.이제 데이터가 생겼어요. 데이터베이스와 패턴만 만들면 쓸모가 있어요. 저는 조회를 실행해서 Amazon Aurora를 테스트할 수 있어요.
ds라는 파일이 있습니다.dbgen 폴더의ddl, 이 동작을 수행할 수 있습니다.사용자/비밀번호를 사용하여 mysql 클라이언트를 Aurora 엔드포인트에 연결
$ mysql -h$DB -u$DBUSER -p"$DBPASS"
연결된 후 데이터베이스를 만듭니다.mysql > create database tpch;
6.dss를 사용하여 아래로 모드를 만듭니다.ddl 파일 (dbgen 폴더에서 mysql 클라이언트 명령을 실행했기 때문에 이 파일은 '루트' 폴더에 있을 것 같습니다)mysql > \. dss.ddl
이것은 테이블을 만들어야 합니다. ("show tables"명령을 실행해서 검사할 수 있습니다.) 인덱스와 키를 설정하려면 더 많은 sql를 실행해야 합니다.TPC 문서는 ds를 사용하는 것을 알려 줍니다.ri 서류에 대해 의견이 있습니다.이것은 내가 마지막으로 사용한 파일입니다.-- ALTER TABLE REGION DROP PRIMARY KEY;
-- ALTER TABLE NATION DROP PRIMARY KEY;
-- ALTER TABLE PART DROP PRIMARY KEY;
-- ALTER TABLE SUPPLIER DROP PRIMARY KEY;
-- ALTER TABLE PARTSUPP DROP PRIMARY KEY;
-- ALTER TABLE ORDERS DROP PRIMARY KEY;
-- ALTER TABLE LINEITEM DROP PRIMARY KEY;
-- ALTER TABLE CUSTOMER DROP PRIMARY KEY;
-- For table REGION
ALTER TABLE REGION
ADD PRIMARY KEY (R_REGIONKEY);
-- For table NATION
ALTER TABLE NATION
ADD PRIMARY KEY (N_NATIONKEY);
ALTER TABLE NATION
ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references REGION(R_REGIONKEY);
COMMIT WORK;
ALTER TABLE PART
ADD PRIMARY KEY (P_PARTKEY);
COMMIT WORK;
ALTER TABLE SUPPLIER
ADD PRIMARY KEY (S_SUPPKEY);
ALTER TABLE SUPPLIER
ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references NATION(N_NATIONKEY);
COMMIT WORK;
ALTER TABLE PARTSUPP
ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
COMMIT WORK;
ALTER TABLE CUSTOMER
ADD PRIMARY KEY (C_CUSTKEY);
ALTER TABLE CUSTOMER
ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references NATION(N_NATIONKEY);
COMMIT WORK;
ALTER TABLE LINEITEM
ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
COMMIT WORK;
ALTER TABLE ORDERS
ADD PRIMARY KEY (O_ORDERKEY);
COMMIT WORK;
ALTER TABLE PARTSUPP
ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references SUPPLIER(S_SUPPKEY);
COMMIT WORK;
ALTER TABLE PARTSUPP
ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references PART(P_PARTKEY);
COMMIT WORK;
ALTER TABLE ORDERS
ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references CUSTOMER(C_CUSTKEY);
COMMIT WORK;
ALTER TABLE LINEITEM
ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references ORDERS(O_ORDERKEY);
COMMIT WORK;
ALTER TABLE LINEITEM
ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references
PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
COMMIT WORK;
7.dbgen으로 만든 데이터를 가져옵니다.이것이 바로 내가 많은 문제에 부딪힌 부분이다. 왜냐하면 특정한 순서에 따라 데이터를 가져와야 할 것 같기 때문이다.이것은 나에게 유효한 명령이다.LOAD DATA LOCAL INFILE 'part.tbl' INTO TABLE PART FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE 'region.tbl' INTO TABLE REGION FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE 'nation.tbl' INTO TABLE NATION FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE 'customer.tbl' INTO TABLE CUSTOMER FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE 'orders.tbl' INTO TABLE ORDERS FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE 'supplier.tbl' INTO TABLE SUPPLIER FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE 'partsupp.tbl' INTO TABLE PARTSUPP FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE 'lineitem.tbl' INTO TABLE LINEITEM FIELDS TERMINATED BY '|';
너는 실수를 해서는 안 된다. 만약 네가 잘못을 저질렀다면, 너는 멈춰서 네가 한 일을 되돌아보아야 한다.만약 데이터베이스, 키/인덱스, 데이터의 이러한 설정이 정확하게 설정되지 않으면 일을 진행할 수 없습니다.8. 마지막으로 표를 소문자로 다시 명명하는 것이 좋습니다.나는 다음과 같은 방법을 사용하여 이 점을 실현한다. 다시 mysql 클라이언트에 로그인한 후.
alter table CUSTOMER rename to customer ;
alter table LINEITEM rename to lineitem ;
alter table NATION rename to nation ;
alter table ORDERS rename to orders ;
alter table PART rename to part ;
alter table PARTSUPP rename to partsupp ;
alter table REGION rename to region ;
alter table SUPPLIER rename to supplier ;
그렇겠지.이제 TPC-H 데이터 세트에 대한 질의를 실행할 수 있습니다.하나의 조회로 이 점을 테스트하다
9. 다음 조회를 실행했습니다.
SELECT
l_orderkey,
SUM(l_extendedprice * (1-l_discount)) AS revenue,
o_orderdate,
o_shippriority
FROM customer, orders, lineitem
WHERE
c_mktsegment='AUTOMOBILE'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate < date '1995-03-13'
AND l_shipdate > date '1995-03-13'
GROUP BY
l_orderkey,
o_orderdate,
o_shippriority
ORDER BY
revenue DESC,
o_orderdate LIMIT 15;
이 출력을 얻었습니다.
+------------+-------------+-------------+----------------+
| l_orderkey | revenue | o_orderdate | o_shippriority |
+------------+-------------+-------------+----------------+
| 4791171 | 452497.4729 | 1995-02-23 | 0 |
| 4163074 | 437267.7799 | 1995-02-13 | 0 |
| 4676933 | 412072.0035 | 1995-02-07 | 0 |
| 3778628 | 399682.3516 | 1995-02-25 | 0 |
| 2773540 | 398691.5039 | 1995-02-27 | 0 |
| 2692902 | 394554.8742 | 1995-03-06 | 0 |
| 181414 | 393083.4426 | 1995-03-08 | 0 |
| 4178471 | 390099.4832 | 1995-02-28 | 0 |
| 4739141 | 385442.5444 | 1995-03-07 | 0 |
| 1310209 | 381336.0532 | 1995-02-23 | 0 |
| 1757283 | 380264.2700 | 1995-02-16 | 0 |
| 4011108 | 377256.1264 | 1995-03-10 | 0 |
| 5235941 | 373361.7169 | 1995-03-07 | 0 |
| 900581 | 367622.8600 | 1995-02-25 | 0 |
| 2729412 | 367211.1485 | 1995-03-10 | 0 |
+------------+-------------+-------------+----------------+
EXPLAIN을 실행하면 다음과 같은 정보가 제공됩니다.+----+-------------+----------+------+--------------------+------+---------+------+---------+-----------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+--------------------+------+---------+------+---------+-----------------------------------------------------------------+
| 1 | SIMPLE | customer | ALL | PRIMARY | NULL | NULL | NULL | 150000 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | orders | ALL | PRIMARY,ORDERS_FK1 | NULL | NULL | NULL | 1488084 | Using where; Using join buffer (Hash Join Outer table orders) |
| 1 | SIMPLE | lineitem | ALL | PRIMARY | NULL | NULL | NULL | 5642734 | Using where; Using join buffer (Hash Join Outer table lineitem) |
+----+-------------+----------+------+--------------------+------+---------+------+---------+-----------------------------------------------------------------+
10. 나는 새로운 검색의 테스트/기준 테스트를 재현하기 위해 캐시를 새로 고쳐야 한다는 것을 발견했다.나는 아래의 명령을 사용하여 이 일을 완성했다.mysql > reset query cache;
11. 테스트 병렬 질의는 Jeff의 블로그 기사 이후에 수행됩니다.+----+-------------+----------+------+--------------------+------+---------+------+---------+--------------------------------------------------------------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+--------------------+------+---------+------+---------+--------------------------------------------------------------------------------------------------------------------------------+
| 1 | SIMPLE | customer | ALL | PRIMARY | NULL | NULL | NULL | 150000 | Using where; Using temporary; Using filesort; Using parallel query (2 columns, 1 filters, 0 exprs; 0 extra) |
| 1 | SIMPLE | orders | ALL | PRIMARY,ORDERS_FK1 | NULL | NULL | NULL | 1488084 | Using where; Using join buffer (Hash Join Outer table orders); Using parallel query (4 columns, 1 filters, 1 exprs; 0 extra) |
| 1 | SIMPLE | lineitem | ALL | PRIMARY | NULL | NULL | NULL | 5642734 | Using where; Using join buffer (Hash Join Outer table lineitem); Using parallelquery (4 columns, 1 filters, 1 exprs; 0 extra) |
+----+-------------+----------+------+--------------------+------+---------+------+---------+--------------------------------------------------------------------------------------------------------------------------------+
이게 다야!
나는 이것이 당신에게 도움이 되고, 시작과 실행을 시도할 때 당신을 위해 시간을 절약할 수 있기를 바랍니다.
Reference
이 문제에 관하여(Amazon Aurora MySQL에서 TPC-H 설정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws/setting-up-tpc-h-on-amazon-mysql-aurora-4203텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)