达梦_TPC-C测试

2026-02-12 19:16:26

1、运行gentpccdata.bat,生成100个仓库的数据,对应文本数据文件的总大小约为8G左右。

也可以运行下面的命令生成需要的数据:

java -Djava.ext.dirs=./ com.tpcc.IIlIIllllIIIIlll  1  100  100    

2、建表和存储过程,运行scripts目录下的对应建表、建存储过程脚本

3、关于软件包中提供的数据库脚本tpcc_dm7_script.txt

先创建表(九个)

然后创建存储过程(5个--manager中存储过程最后去掉/)

然后进行文本数据的导入,即执行

“ /opt/dmdbms/bin/dmfldr SYSDBA/loongson123 control=\'/home/loongson/tpc/wxq/warehouse[1-9].ctl\' ”

再执行创建索引的语句(两条语句,第一条缺少一个ON,需要加上)

4、上述修改后的脚本如下:

第一次安装无需执行前九条语句

DROP TABLE C_ORDER_LINE;

DROP TABLE C_HISTORY;

DROP TABLE C_ORDER;

DROP TABLE C_NEW_ORDER;

DROP TABLE C_CUSTOMER;

DROP TABLE C_STOCK;

DROP TABLE C_ITEM;

DROP TABLE C_DISTRICT;

DROP TABLE C_WAREHOUSE;

CREATE TABLE C_ITEM ( 

I_ID INT NOT NULL, 

I_IM_ID INT NULL, 

I_NAME VARCHAR (24) NULL,

I_PRICE DOUBLE NULL, 

I_DATA VARCHAR (50) NULL,

CLUSTER PRIMARY KEY(I_ID))

;

CREATE TABLE C_WAREHOUSE ( 

W_ID INT NOT NULL, 

W_NAME VARCHAR (10) NULL, 

W_STREET_1 VARCHAR (20) NULL,

W_STREET_2 VARCHAR (20) NULL,

W_CITY VARCHAR (20) NULL, 

W_STATE CHAR (2) NULL, 

W_ZIP CHAR (9) NULL, 

W_TAX DOUBLE NULL, 

W_YTD DOUBLE NULL,

CLUSTER PRIMARY KEY(W_ID))

;

CREATE TABLE C_DISTRICT ( 

D_ID INT NOT NULL, 

D_W_ID INT NOT NULL, 

D_NAME VARCHAR (10) NULL, 

D_STREET_1 VARCHAR (20) NULL,

D_STREET_2 VARCHAR (20) NULL,

D_CITY VARCHAR (20) NULL, 

D_STATE CHAR (2) NULL, 

D_ZIP CHAR (9) NULL, 

D_TAX DOUBLE NULL, 

D_YTD DOUBLE NULL, 

D_NEXT_O_ID INT NULL,

CLUSTER PRIMARY KEY(D_W_ID,D_ID))

;

CREATE TABLE C_STOCK ( 

S_I_ID INT NOT NULL, 

S_W_ID INT NOT NULL, 

S_QUANTITY INT NULL, 

S_DIST_01 CHAR (24) NULL,

S_DIST_02 CHAR (24) NULL,

S_DIST_03 CHAR (24) NULL,

S_DIST_04 CHAR (24) NULL,

S_DIST_05 CHAR (24) NULL,

S_DIST_06 CHAR (24) NULL,

S_DIST_07 CHAR (24) NULL,

S_DIST_08 CHAR (24) NULL,

S_DIST_09 CHAR (24) NULL,

S_DIST_10 CHAR (24) NULL,

S_DATA VARCHAR (50) NULL ,

S_YTD INT NULL, 

S_ORDER_CNT INT NULL, 

S_REMOTE_CNT INT NULL, 

CLUSTER PRIMARY KEY(S_W_ID,S_I_ID))

;

CREATE TABLE C_CUSTOMER ( 

C_ID INT NOT NULL, 

C_D_ID INT NOT NULL, 

C_W_ID INT NOT NULL, 

C_FIRST VARCHAR (16) NULL, 

C_MIDDLE CHAR (2) NULL,

C_LAST VARCHAR (16) NULL, 

C_STREET_1 VARCHAR (20) NULL, 

C_STREET_2 VARCHAR (20) NULL, 

C_CITY VARCHAR (20) NULL, 

C_STATE CHAR (2) NULL, 

C_ZIP CHAR (9) NULL, 

C_PHONE VARCHAR (16) NULL, 

C_SINCE DATETIME NULL, 

C_CREDIT CHAR (2) NULL, 

C_CREDIT_LIM DOUBLE NULL, 

C_DISCOUNT DOUBLE NULL, 

C_BALANCE DOUBLE NULL, 

C_DATA VARCHAR (500) NULL, 

C_YTD_PAYMENT DOUBLE NULL, 

C_PAYMENT_CNT INT NULL, 

C_DELIVERY_CNT INT NULL, 

CLUSTER PRIMARY KEY(C_W_ID,C_D_ID,C_ID))

;

CREATE TABLE C_HISTORY ( 

H_C_ID INT NULL, 

H_C_D_ID INT NULL, 

H_C_W_ID INT NULL, 

H_D_ID INT NULL, 

H_W_ID INT NULL, 

H_DATE DATETIME DEFAULT NOW,

H_AMOUNT DOUBLE NULL, 

H_DATA VARCHAR (24) NULL )

;

CREATE TABLE C_ORDER ( 

O_ID INT NOT NULL, 

O_C_ID INT NULL, 

O_D_ID INT NOT NULL, 

O_W_ID INT NOT NULL, 

O_ENTRY_D DATETIME DEFAULT NOW,

O_CARRIER_ID INT NULL, 

O_OL_CNT INT NULL, 

O_ALL_LOCAL INT NULL,

CLUSTER PRIMARY KEY(O_W_ID,O_D_ID,O_ID))

;

CREATE TABLE C_ORDER_LINE ( 

OL_O_ID INT NOT NULL, 

OL_D_ID INT NOT NULL, 

OL_W_ID INT NOT NULL, 

OL_NUMBER INT NOT NULL, 

OL_I_ID INT NULL, 

OL_SUPPLY_W_ID INT NULL, 

OL_QUANTITY INT NULL, 

OL_AMOUNT DOUBLE NULL, 

OL_DIST_INFO CHAR (24) NULL,

OL_DELIVERY_D DATETIME NULL,

CLUSTER PRIMARY KEY(OL_W_ID,OL_D_ID,OL_O_ID,OL_NUMBER))

;

CREATE TABLE C_NEW_ORDER(

NO_O_ID INT NOT NULL, 

NO_D_ID INT NOT NULL, 

NO_W_ID INT NOT NULL,

CLUSTER PRIMARY KEY(NO_W_ID,NO_D_ID,NO_O_ID))

;

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

manager工具中将END后的/去掉

CREATE OR REPLACE PROCEDURE TPCC_DELIVERY(V_W_ID IN INT,V_CARRIER_ID IN INT, V_RET OUT INT)

IS

V_D_ID INT;

V_NO_O_ID INT;

V_C_ID INT;

V_OL_TOTAL DOUBLE PRECISION;

CURSOR C_NO FAST IS SELECT NO_O_ID FROM C_NEW_ORDER WHERE NO_D_ID=V_D_ID AND NO_W_ID=V_W_ID ORDER BY NO_O_ID ASC;

BEGIN

FOR I IN 1..10 LOOP

V_D_ID := I;

OPEN C_NO;

FETCH C_NO INTO V_NO_O_ID;

CONTINUE WHEN C_NO%NOTFOUND;

CLOSE C_NO;

DELETE FROM C_NEW_ORDER WHERE NO_O_ID=V_NO_O_ID AND NO_D_ID=V_D_ID AND NO_W_ID=V_W_ID;

SELECT O_C_ID INTO V_C_ID FROM C_ORDER WHERE O_ID=V_NO_O_ID AND O_W_ID=V_W_ID AND O_D_ID=V_D_ID;

UPDATE C_ORDER SET O_CARRIER_ID=V_CARRIER_ID WHERE O_ID=V_NO_O_ID AND O_W_ID=V_W_ID AND O_D_ID=V_D_ID;

UPDATE C_ORDER_LINE SET OL_DELIVERY_D=CURRENT_DATE WHERE OL_O_ID=V_NO_O_ID AND OL_D_ID=V_D_ID AND OL_W_ID=V_W_ID;

SELECT SUM(OL_AMOUNT) INTO V_OL_TOTAL FROM C_ORDER_LINE WHERE OL_O_ID=V_NO_O_ID AND OL_D_ID=V_D_ID AND OL_W_ID=V_W_ID;

UPDATE C_CUSTOMER SET C_BALANCE=C_BALANCE+V_OL_TOTAL WHERE C_ID=V_C_ID AND C_D_ID=V_D_ID AND C_W_ID=V_W_ID;

END LOOP;

COMMIT;

V_RET:=1;

EXCEPTION WHEN OTHERS THEN

ROLLBACK;

V_RET:=0;

END;

/

CREATE OR REPLACE PROCEDURE TPCC_NEWORDER

(

V_W_ID IN INT,

V_D_ID IN INT,

V_C_ID IN INT,

V_O_OL_CNT IN INT, 

V_I_ID1 IN INT,

V_I_ID2 IN INT, 

V_I_ID3 IN INT, 

V_I_ID4 IN INT, 

V_I_ID5 IN INT, 

V_I_ID6 IN INT, 

V_I_ID7 IN INT, 

V_I_ID8 IN INT, 

V_I_ID9 IN INT, 

V_I_ID10 IN INT, 

V_I_ID11 IN INT, 

V_I_ID12 IN INT, 

V_I_ID13 IN INT, 

V_I_ID14 IN INT, 

V_I_ID15 IN INT,

V_S_W_ID1 IN INT, 

V_S_W_ID2 IN INT, 

V_S_W_ID3 IN INT, 

V_S_W_ID4 IN INT, 

V_S_W_ID5 IN INT, 

V_S_W_ID6 IN INT, 

V_S_W_ID7 IN INT, 

V_S_W_ID8 IN INT, 

V_S_W_ID9 IN INT, 

V_S_W_ID10 IN INT, 

V_S_W_ID11 IN INT, 

V_S_W_ID12 IN INT, 

V_S_W_ID13 IN INT, 

V_S_W_ID14 IN INT, 

V_S_W_ID15 IN INT,

V_OL_QTY1 IN INT,

V_OL_QTY2 IN INT,

V_OL_QTY3 IN INT,

V_OL_QTY4 IN INT,

V_OL_QTY5 IN INT,

V_OL_QTY6 IN INT,

V_OL_QTY7 IN INT,

V_OL_QTY8 IN INT,

V_OL_QTY9 IN INT,

V_OL_QTY10 IN INT,

V_OL_QTY11 IN INT,

V_OL_QTY12 IN INT,

V_OL_QTY13 IN INT,

V_OL_QTY14 IN INT,

V_OL_QTY15 IN INT,

V_O_ALL_LOCAL IN INT,

V_RET OUT INT

)

IS

TYPE REC IS RECORD(

INAME VARCHAR(24),

IPRICE DOUBLE,

OLAMOUNT DOUBLE,

BGFLAG CHAR(1),

SQUANTITY INT);

TYPE ALL_SEL IS TABLE OF REC INDEX BY BINARY_INTEGER

TYPE INTTABLE IS TABLE OF INT INDEX BY BINARY_INTEGER;

V_TMP_OID INT;

V_ARR_ALL ALL_SEL;

V_S_DATA  VARCHAR(50);

V_I_DATA  VARCHAR(50);

V_DIST_INFO VARCHAR(25);

V_C_DISCOUNT DOUBLE;

V_C_CREDIT CHAR(2);

V_W_TAX DOUBLE;

V_CUR_OID INT;

V_D_TAX DOUBLE;

V_TOTAL_AMOUNT DOUBLE;

V_COMMIT_FLAG INT;

V_O_ENTRY_D DATE;

V_ARR_I_ID INTTABLE ;

V_ARR_W_ID INTTABLE ;

V_ARR_OL_QTY INTTABLE ;

V_TMP_QUANTITY INT;

V_C_LAST VARCHAR(16);

BEGIN

V_ARR_I_ID(1) := V_I_ID1; 

V_ARR_I_ID(2) := V_I_ID2; 

V_ARR_I_ID(3) := V_I_ID3; 

V_ARR_I_ID(4) := V_I_ID4; 

V_ARR_I_ID(5) := V_I_ID5; 

V_ARR_I_ID(6) := V_I_ID6; 

V_ARR_I_ID(7) := V_I_ID7; 

V_ARR_I_ID(8) := V_I_ID8; 

V_ARR_I_ID(9) := V_I_ID9; 

V_ARR_I_ID(10) := V_I_ID10; 

V_ARR_I_ID(11) := V_I_ID11; 

V_ARR_I_ID(12) := V_I_ID12; 

V_ARR_I_ID(13) := V_I_ID13; 

V_ARR_I_ID(14) := V_I_ID14; 

V_ARR_I_ID(15) := V_I_ID15; 

V_ARR_W_ID(1) := V_S_W_ID1; 

V_ARR_W_ID(2) := V_S_W_ID2; 

V_ARR_W_ID(3) := V_S_W_ID3; 

V_ARR_W_ID(4) := V_S_W_ID4; 

V_ARR_W_ID(5) := V_S_W_ID5; 

V_ARR_W_ID(6) := V_S_W_ID6; 

V_ARR_W_ID(7) := V_S_W_ID7; 

V_ARR_W_ID(8) := V_S_W_ID8; 

V_ARR_W_ID(9) := V_S_W_ID9; 

V_ARR_W_ID(10) := V_S_W_ID10; 

V_ARR_W_ID(11) := V_S_W_ID11; 

V_ARR_W_ID(12) := V_S_W_ID12; 

V_ARR_W_ID(13) := V_S_W_ID13; 

V_ARR_W_ID(14) := V_S_W_ID14; 

V_ARR_W_ID(15) := V_S_W_ID15; 

V_ARR_OL_QTY(1) := V_OL_QTY1; 

V_ARR_OL_QTY(2) := V_OL_QTY2; 

V_ARR_OL_QTY(3) := V_OL_QTY3; 

V_ARR_OL_QTY(4) := V_OL_QTY4; 

V_ARR_OL_QTY(5) := V_OL_QTY5; 

V_ARR_OL_QTY(6) := V_OL_QTY6; 

V_ARR_OL_QTY(7) := V_OL_QTY7; 

V_ARR_OL_QTY(8) := V_OL_QTY8; 

V_ARR_OL_QTY(9) := V_OL_QTY9; 

V_ARR_OL_QTY(10) := V_OL_QTY10; 

V_ARR_OL_QTY(11) := V_OL_QTY11; 

V_ARR_OL_QTY(12) := V_OL_QTY12; 

V_ARR_OL_QTY(13) := V_OL_QTY13; 

V_ARR_OL_QTY(14) := V_OL_QTY14; 

V_ARR_OL_QTY(15) := V_OL_QTY15; 

V_TOTAL_AMOUNT := 0;

V_O_ENTRY_D := CURRENT_DATE;

UPDATE C_DISTRICT 

SET D_NEXT_O_ID = D_NEXT_O_ID + 1 

WHERE D_ID = V_D_ID 

AND D_W_ID =V_W_ID 

RETURNING D_NEXT_O_ID,D_TAX 

INTO V_TMP_OID, V_D_TAX;

V_CUR_OID := V_TMP_OID - 1;

INSERT INTO C_ORDER(O_ID, O_C_ID, O_D_ID, O_W_ID, O_ENTRY_D, O_CARRIER_ID, O_OL_CNT, O_ALL_LOCAL) 

VALUES (V_CUR_OID, V_C_ID, V_D_ID, V_W_ID, V_O_ENTRY_D, 0, V_O_OL_CNT, V_O_ALL_LOCAL);

FOR I IN 1..V_O_OL_CNT LOOP

SELECT I_NAME, I_PRICE, I_DATA 

INTO      V_ARR_ALL(I).INAME, V_ARR_ALL(I).IPRICE, V_I_DATA 

FROM C_ITEM 

WHERE I_ID = V_ARR_I_ID(I);

UPDATE C_STOCK 

SET    S_YTD       = S_YTD + V_ARR_OL_QTY(I), 

      S_QUANTITY  = S_QUANTITY - V_ARR_OL_QTY(I) + CASE WHEN (S_QUANTITY - V_ARR_OL_QTY(I) < 10) THEN 91 ELSE 0 END, 

S_ORDER_CNT = S_ORDER_CNT + 1, 

        S_REMOTE_CNT = S_REMOTE_CNT + CASE WHEN (V_W_ID = V_ARR_W_ID(I)) THEN 0 ELSE 1 END

WHERE S_I_ID = V_ARR_I_ID(I) 

AND S_W_ID=V_ARR_W_ID(I)

RETURNING S_DATA, S_QUANTITY 

INTO V_S_DATA, V_ARR_ALL(I).SQUANTITY;

IF((INSTR(V_I_DATA,'ORIGINAL') > 0) AND (INSTR(V_S_DATA,'ORIGINAL') > 0)) THEN

V_ARR_ALL(I).BGFLAG := 'B';

ELSE 

V_ARR_ALL(I).BGFLAG := 'G';

END IF;

CASE V_D_ID 

        WHEN 1 THEN SELECT S_DIST_01 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 2 THEN SELECT S_DIST_02 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 3 THEN SELECT S_DIST_03 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 4 THEN SELECT S_DIST_04 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 5 THEN SELECT S_DIST_05 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 6 THEN SELECT S_DIST_06 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 7 THEN SELECT S_DIST_07 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 8 THEN SELECT S_DIST_08 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 9 THEN SELECT S_DIST_08 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

        WHEN 10 THEN SELECT S_DIST_10 INTO V_DIST_INFO FROM C_STOCK WHERE S_I_ID=V_ARR_I_ID(I) AND S_W_ID=V_ARR_W_ID(I);

END;

V_ARR_ALL(I).OLAMOUNT := V_ARR_OL_QTY(I) * V_ARR_ALL(I).IPRICE;

V_TOTAL_AMOUNT := V_TOTAL_AMOUNT  + V_ARR_ALL(I).OLAMOUNT;

INSERT INTO C_ORDER_LINE(OL_O_ID, OL_D_ID, OL_W_ID, OL_NUMBER, OL_I_ID, OL_SUPPLY_W_ID, OL_QUANTITY, OL_AMOUNT, OL_DIST_INFO, OL_DELIVERY_D)  

VALUES(V_CUR_OID, V_D_ID, V_W_ID, I, V_ARR_I_ID(I), V_ARR_W_ID(I), V_ARR_OL_QTY(I), V_ARR_ALL(I).OLAMOUNT, V_DIST_INFO ,DATE'1900-01-01');

END LOOP;

INSERT INTO C_NEW_ORDER VALUES(V_CUR_OID,V_D_ID,V_W_ID);

select c_last, c_discount, c_credit, w_tax INTO V_C_LAST, V_C_DISCOUNT, V_C_CREDIT, V_W_TAX from C_CUSTOMER, C_WAREHOUSE 

where w_id=v_w_id and c_w_id=v_w_id and c_d_id=v_d_id and c_id=v_c_id;

COMMIT;

V_RET:=1;

EXCEPTION WHEN OTHERS THEN

ROLLBACK;

V_RET:=0;

END;

/

CREATE OR REPLACE PROCEDURE TPCC_ORDSTAT

(

    V_C_ID          IN OUT INT,

    V_D_ID          IN INT,

    V_W_ID          IN INT,

    V_C_LAST        IN OUT VARCHAR(16),

    V_BYNAME        IN INT,

    V_RET           OUT INT

)

IS

    V_C_BALANCE     DOUBLE;

    V_C_FIRST       VARCHAR(16); 

    V_C_MIDDLE      VARCHAR(2); 

    V_O_ID,V_O_CARRIER_ID  INT;

    V_O_ENTRY_D     DATE;

    CNT INT;

    CURSOR C3 IS SELECT C_BALANCE, C_FIRST, C_MIDDLE, C_ID 

                 FROM   C_CUSTOMER 

                 WHERE  C_LAST = V_C_LAST 

                 AND    C_D_ID = V_D_ID 

                 AND    C_W_ID = V_W_ID 

                 ORDER BY C_FIRST;

    CURSOR C_LINE IS SELECT OL_I_ID, OL_SUPPLY_W_ID, OL_QUANTITY,OL_AMOUNT, OL_DELIVERY_D 

                     FROM   C_ORDER_LINE 

                     WHERE  OL_O_ID = V_O_ID 

                     AND    OL_D_ID = V_D_ID 

                     AND    OL_W_ID = V_W_ID;

                     

    TYPE INTTABLE IS TABLE OF INT INDEX BY BINARY_INTEGER;

    TYPE AMOUNTTABLE IS TABLE OF DOUBLE PRECISION INDEX BY BINARY_INTEGER;

    TYPE DATETABLE IS TABLE OF DATE INDEX BY BINARY_INTEGER;

    OS_C_LINE         C_LINE%ROWTYPE;

        

    OS_OL_I_ID        INTTABLE ;  

    OS_OL_SUPPLY_W_ID INTTABLE ;  

    OS_OL_QUANTITY    INTTABLE ;

    OS_OL_AMOUNT      AMOUNTTABLE;

    OS_OL_DELIVERY_D  DATETABLE;

    I                 INT;

BEGIN

    IF V_BYNAME = 0 THEN

        SELECT  C_BALANCE, C_FIRST, C_MIDDLE, C_LAST 

        INTO    V_C_BALANCE, V_C_FIRST, V_C_MIDDLE, V_C_LAST 

        FROM    C_CUSTOMER 

        WHERE   C_ID    = V_C_ID 

        AND     C_D_ID  = V_D_ID 

        AND     C_W_ID  = V_W_ID;

    ELSE

        SELECT  COUNT(C_ID) 

        INTO    CNT 

        FROM    C_CUSTOMER 

        WHERE   C_LAST = V_C_LAST 

        AND     C_D_ID = V_D_ID 

        AND     C_W_ID = V_W_ID;

  

        IF (MOD(CNT, 2) = 1) THEN

            CNT := (CNT + 1);

        END IF;

    

        CNT := CNT / 2;

        

        OPEN C3;

        FOR I IN 1 .. CNT

        LOOP

            FETCH C3 INTO V_C_BALANCE, V_C_FIRST, V_C_MIDDLE, V_C_ID;

        END LOOP;

    

        CLOSE C3;

    END IF;

    

    SELECT O_ID, O_CARRIER_ID, O_ENTRY_D 

    INTO  V_O_ID, V_O_CARRIER_ID, V_O_ENTRY_D 

    FROM (

            SELECT TOP 1 O_ID, O_CARRIER_ID, O_ENTRY_D 

            FROM   C_ORDER  

            WHERE  O_C_ID = V_C_ID 

            AND    O_D_ID = V_D_ID 

            AND    O_W_ID = V_W_ID 

            ORDER BY O_ID DESC) ;

--    WHERE ROWNUM = 1;

    

    I := 1;

    

    FOR OS_C_LINE IN C_LINE

    LOOP

        OS_OL_I_ID(I)         := OS_C_LINE.OL_I_ID;

        OS_OL_SUPPLY_W_ID(I)  := OS_C_LINE.OL_SUPPLY_W_ID;

        OS_OL_QUANTITY(I)     := OS_C_LINE.OL_QUANTITY;

        OS_OL_AMOUNT(I)       := OS_C_LINE.OL_AMOUNT;

        OS_OL_DELIVERY_D(I)   := OS_C_LINE.OL_DELIVERY_D;

        

        I := I + 1;

    END LOOP;

    COMMIT;

    V_RET:=1;

    EXCEPTION WHEN OTHERS THEN

    ROLLBACK;

    V_RET:=0;

END;

/

CREATE OR REPLACE PROCEDURE TPCC_PAYMENT

(

V_W_ID IN INT,

V_D_ID IN INT,

V_C_ID IN OUT INT,

V_C_W_ID IN INT,

V_C_D_ID IN INT,

V_C_LAST IN OUT VARCHAR2,

V_A_AMOUNT IN DOUBLE,

V_BYNAME IN INT,

V_RET OUT INT

)

IS

V_W_STATE,V_D_STATE,V_C_STATE,V_C_MIDDLE,V_C_CREDIT VARCHAR(2);

V_C_CREDIT_LIM,V_C_DISCOUNT,V_C_BALANCE DOUBLE;

V_C_SINCE,V_H_DATE DATE;

V_W_STREET_1,V_W_STREET_2,V_W_CITY,V_D_STREET_1,V_D_STREET_2,V_D_CITY,V_C_STREET_1,V_C_STREET_2,V_C_CITY VARCHAR(20);

V_C_FIRST,V_C_PHONE VARCHAR(16);

V_W_NAME,V_D_NAME VARCHAR(10);

V_W_ZIP,V_D_ZIP,V_C_ZIP VARCHAR(9);

V_C_DATA VARCHAR(500);

C_DATA_TMP VARCHAR(500);

P_C_NEW_DATA VARCHAR(500);

CNT INT;

CURSOR C1 IS SELECT C_ID 

FROM C_CUSTOMER 

WHERE C_LAST = V_C_LAST 

AND C_D_ID = V_D_ID 

AND C_W_ID = V_C_W_ID 

ORDER BY C_FIRST;

BEGIN

UPDATE C_WAREHOUSE 

SET W_YTD = W_YTD + V_A_AMOUNT 

WHERE W_ID = V_W_ID

RETURNING W_NAME, W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP 

INTO V_W_NAME, V_W_STREET_1, V_W_STREET_2, V_W_CITY, V_W_STATE, V_W_ZIP;

UPDATE C_DISTRICT 

SET    D_YTD = D_YTD + V_A_AMOUNT 

WHERE  D_W_ID = V_W_ID 

AND    D_ID = V_D_ID

RETURNING D_NAME, D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP

INTO V_D_NAME, V_D_STREET_1, V_D_STREET_2, V_D_CITY, V_D_STATE, V_D_ZIP;

IF(V_BYNAME = 1) THEN

SELECT COUNT(*) 

INTO   CNT 

FROM   C_CUSTOMER 

WHERE  C_LAST = V_C_LAST 

AND    C_D_ID = V_C_D_ID 

AND    C_W_ID = V_C_W_ID;

IF (MOD(CNT, 2) = 1) THEN

CNT := (CNT + 1);

END IF;

CNT := CNT / 2;

OPEN C1;

FOR I IN 1..CNT LOOP

FETCH C1 INTO V_C_ID;

END LOOP;

CLOSE C1;

END IF;

UPDATE C_CUSTOMER 

SET C_BALANCE = C_BALANCE - V_A_AMOUNT,

        C_YTD_PAYMENT = C_YTD_PAYMENT + V_A_AMOUNT,

        C_PAYMENT_CNT = C_PAYMENT_CNT + 1 

WHERE C_W_ID = V_C_W_ID 

AND C_D_ID = V_C_D_ID 

AND C_ID  = V_C_ID

RETURNING C_FIRST, C_MIDDLE, C_LAST, C_STREET_1, C_STREET_2, C_CITY, C_STATE, 

C_ZIP, C_PHONE, C_SINCE, C_CREDIT, C_CREDIT_LIM, C_DISCOUNT, C_BALANCE

INTO V_C_FIRST, V_C_MIDDLE, V_C_LAST, V_C_STREET_1, V_C_STREET_2, V_C_CITY, V_C_STATE, V_C_ZIP, 

V_C_PHONE, V_C_SINCE, V_C_CREDIT, V_C_CREDIT_LIM, V_C_DISCOUNT, V_C_BALANCE;

IF(V_C_CREDIT = 'BC') THEN

P_C_NEW_DATA := '' || V_C_ID || ' ' || V_C_D_ID || ' ' || V_C_W_ID || 

' ' || V_D_ID || ' ' || V_W_ID || ' ' || V_A_AMOUNT;

UPDATE C_CUSTOMER 

SET C_DATA = SUBSTR(P_C_NEW_DATA || C_DATA,

                          1,

                          500 - LENGTH(P_C_NEW_DATA)) 

WHERE C_W_ID = V_C_W_ID 

AND C_D_ID = V_C_D_ID 

AND   C_ID   = V_C_ID 

RETURNING C_DATA INTO C_DATA_TMP;

V_C_DATA := SUBSTR(C_DATA_TMP, 1, 200);

END IF;

V_H_DATE := CURRENT_DATE;

INSERT INTO C_HISTORY(H_C_D_ID, H_C_W_ID, H_C_ID, H_D_ID,H_W_ID, H_DATE, H_AMOUNT, H_DATA) 

VALUES (V_C_D_ID, V_C_W_ID, V_C_ID, V_D_ID, V_W_ID, V_H_DATE, V_A_AMOUNT, V_W_NAME || '    ' || V_D_NAME);

COMMIT;

V_RET:=1;

EXCEPTION WHEN OTHERS THEN

ROLLBACK;

V_RET:=0;

END;

CREATE OR REPLACE PROCEDURE TPCC_STOCKLEVEL(V_W_ID IN INT,V_D_ID IN INT,V_A IN INT, O_RET OUT INT) 

IS V_D_NEXT_O_ID INT;

V_DISTINCT_I_ID INT;

BEGIN

SELECT D_NEXT_O_ID INTO V_D_NEXT_O_ID FROM C_DISTRICT WHERE D_ID = V_D_ID AND D_W_ID = V_W_ID;

SELECT COUNT (DISTINCT S_I_ID) INTO V_DISTINCT_I_ID  FROM C_ORDER_LINE, C_STOCK

WHERE OL_D_ID=V_D_ID AND OL_W_ID =V_W_ID

AND OL_I_ID = S_I_ID AND S_W_ID=V_W_ID AND S_QUANTITY < V_A 

AND OL_O_ID BETWEEN (V_D_NEXT_O_ID - 20) AND (V_D_NEXT_O_ID - 1);

COMMIT;

O_RET:=1;

EXCEPTION WHEN OTHERS THEN

ROLLBACK;

O_RET:=0;

END;

/

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

将文本文件导入后再执行:

CREATE  INDEX ORDER01 ON C_ORDER("O_W_ID" ASC,"O_D_ID" ASC,"O_C_ID" ASC,"O_ID" DESC);

CREATE INDEX CUST01 ON C_CUSTOMER(C_W_ID,C_D_ID,C_LAST,C_FIRST);

/*按照TPC-C标准,所有存储过程都应该返回一些信息给客户端,但是这样极易引发网络瓶颈,因此所有的存储过程都只返回是否成功,本应该返回客户端的信息,改为保存到数据库的本地变量中*/

5、使用各数据库的文本数据装载工具,将文本文件中的数据装载到数据库中

[warehouse.ctl文件]

OPTIONS ( SKIP = 0 ROWS = 50000 DIRECT = TRUE INDEX_OPTION = 2 ) LOAD DATA INFILE '/home/loongson/tpc/tpcc_1_100/warehouse1/***.tbl' STR X '0D0A' BADFILE 'warehous.bad' INTO TABLE ***  (tpcc_dm7_script.txt中创建的9个表) FIELDS '|'

(分别执行一次,共需执行九次)

/opt/dmdbms/bin/dmfldr SYSDBA/loongson123 control=\'/home/loongson/tpc/wxq/warehouse[1-9].ctl\'可以同时进行

6、运行测试:

需要在windows系统下运行tpcctest.bat程序,并将jdbc_url项中的localhost修改成测试机器的IP地址

右键,Run Benchmark测试进行10分钟,得到结果

达梦_TPC-C测试

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢