Computing

[빅데이터 및 지식관리시스템] TPC-C Benchmarking

ysk1m 2025. 4. 3. 23:43

Benchmarking

performance를 평가하는 지표이다.

DB benchmark 종류

  • OLTP

사용자 요청(transaction)이 빈번하게 발생하고, 각 요청이 작고 빠르게 처리되어야하는 시스템이다.

짧고 간단한 쿼리로 구성되며 높은 동시성을 가진다.

  • OLAP

대용량 데이터를 바탕으로 복잡한 분석 및 리포팅 작업을 수행하는 시스템이다.

실시간성보다는 분석 정확성을 중시한다.

  • HTAP

OLTP와 OLAP를 동시에 처리하는 시스템이다.

 

TPC-C Scenario

New-Order, Payment, Order-Status, Delivery, Stock-Level에 대해 작업을 수행하고 benchmark를 평가할 수있다.

  • Data model: WAREHOUSE, DISTRICT, CUSTOMER, ORDERS, ITEM과 같은 table을 포함한다.
  • Concurrency: users들이 동시에 접속해서 update할 수있기 때문에 충돌이 안되게 해야한다.

벤치마크는 파라미터를 설정하여 다양한 크기, 시간에 대해 평가 할 수있다.

cd /root/benchbase/target/benchbase-postgres/config/postgres
vim sample_tpcc_config.xml

TPC-C 벤치마크 설정 파일에 들어가면

다음과 같이 time, scalefactor를 설정할 수 있다.

time은 어느 시간동안 수행하겠다는 의미이고 scalefactor는 얼만큼의 data를 처리하는지에 대한 값이다.

java -jar benchbase.jar -b tpcc -c /root/benchbase/target/benchbase-postgres/config/postgres/sample_tpcc_config.xml --create=true --load=true --execute=true

에서 create을 통해 테이블을 형성할 것 인지, load는 준비된 테이블에 데이터를 넣겠다는 것이고 execute는 실행하겠다는 의미로 여기서 원하는 benchmark수행에 따라 정하면 된다.

 

실행결과를 보면 초당 약 700개의 transaction을 처리 하는 것이다.

 

SQL Practice

 TPC-C table을 보려면(https://github.com/cmu-db/benchbase/wiki/TPC-C)

\d

table에 대한 자세한 정보를 얻으려면 table이름를 다음과 같이 입력한다.

\d customer

  • oorder

각 주문에 대한 일반적인 정보를 저장한다.

누가 주문했는지, 언제 주문했는지, 몇개의 아이템을 주문했는지

  • new_order

아직 배송되지 않은 주문들을 추적한다.

주문이 새로 생성되면 이 테이블에 한 행이 추가된다.

해당 주문이 배송을 위해 선택 되면, 이 테이블에서 삭제된다.

  • order_line

주문 내에 포함된 각 개별 상품의 상세정보를 저장한다.

어떤 상품이 주문됐는지, 수량은 얼마나 되는지, 금액은 얼마인지에 해당한다.

SQL practice1: I_DATA 컬럼에 "original"이라는 단어가 포함된 상품의 개수

SELECT COUNT(*) AS original_item_count FROM item WHERE i_data ILIKE"%original%";

 

SQL practice2: 재고 수량이 20 미만인 품목의 정보(I_ID,I_NAME,S_QUANTITY)를 10개만 조회

SELECT s.s_i_id,i.i_name,s.s_quantity FROM stock s JOIN item i ON i.i_id =s.s_i_id where s.s_quantity <20 limit 10;

SQL practice3:각 지역별로 배송되지 않은 주문(new_order)수를 구하여라

new_order table의 column들에 대해 설명해보면

  • no_w_id: 주문이 속한 창고(warehouse)를 나타낸다.
  • no_d_id: 주문이 속한 지점(district)의 ID이다.
  • no_o_id: 주문 번호(order id)이다.
SELECT no_d_id,COUNT(*) AS pending_orders FROM new_order GROUP BY no_d_id ORDER BY no_d_id;

SQL practice4: 각 지역별로 고객의 평균 지불 금액을 구하시오.

SELECT c_d_id, AVG(C_YTD_PAYMENT) AS avg_payment FROM customer GROUP BY c_d_id ORDER BY c_d_id;

SQL practice5: 가장 많이 주문된 상품 5개를 수량 기준으로 조회하세요.

SELECT ol_i_id,SUM(ol_quantity) AS total_quantity FROM order_line GROUP BY ol_i_id ORDER BY total_quantity DESC LIMINT 5;