- Notifications
You must be signed in to change notification settings - Fork1
Prototype database for designing database kernel
License
NotificationsYou must be signed in to change notification settings
daviszhen/plan
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
单机事务数据库内核。
围绕执行tpch query而设计的,有计算引擎和存储引擎。
文档:快速实现数据库内核
两个bin:
plandb:psql交互执行
tester:非交互。
- create schema创建schema. 内置的schema是
public
。
create schema if not exists s1;
- create table创建表。
CREATE TABLE NATION ( N_NATIONKEY INTEGER NOT NULL,N_NAME VARCHAR(25) /*CHAR(25)*/ NOT NULL,N_REGIONKEY INTEGER NOT NULL,N_COMMENT VARCHAR(152),PRIMARY KEY (N_NATIONKEY));
- copy从parquet,csv文件中导入数据到表中。
copy nationfrom '/home/pengzhen/Documents/tpch-parquet/nation.parquet'with (FORMAT 'parquet');
insert ... values
tpch 22条query
tpch query 1
selectl_returnflag,l_linestatus,sum(l_quantity) as sum_qty,sum(l_extendedprice) as sum_base_price,sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,avg(l_quantity) as avg_qty,avg(l_extendedprice) as avg_price,avg(l_discount) as avg_disc,count(*) as count_orderfromlineitemwherel_shipdate <= date '1998-12-01' - interval '112 day'group byl_returnflag,l_linestatusorder byl_returnflag,l_linestatus;
使用psql连接交互执行。
make plandb./plandbpsql -h 127.0.0.1
make tester
配置文件tester.toml
配置文件搜索路径。以下路径都没有配置文件,报错退出。
././etc/tpch/1g/
执行支持的语句。不限于tpch的query.
tester tpch1gddl --ddl'sql'
创建tpch表并从parquet中导入数据。
tester tpch1gddl--ddl "CREATETABLENATION ( N_NATIONKEYINTEGERNOT NULL,N_NAMEVARCHAR(25)/*CHAR(25)*/NOT NULL,N_REGIONKEYINTEGERNOT NULL,N_COMMENTVARCHAR(152),PRIMARY KEY (N_NATIONKEY));CREATETABLEREGION ( R_REGIONKEYINTEGERNOT NULL,R_NAMEVARCHAR(25)/*CHAR(25)*/NOT NULL,R_COMMENTVARCHAR(152),PRIMARY KEY (R_REGIONKEY));CREATETABLEPART ( P_PARTKEYINTEGERNOT NULL, P_NAMEVARCHAR(55)NOT NULL, P_MFGRVARCHAR(25)/*CHAR(25)*/NOT NULL, P_BRANDVARCHAR(10)/*CHAR(10)*/NOT NULL, P_TYPEVARCHAR(25)NOT NULL, P_SIZEINTEGERNOT NULL, P_CONTAINERVARCHAR(10)/*CHAR(10)*/NOT NULL, P_RETAILPRICEDECIMAL(15,2)NOT NULL, P_COMMENTVARCHAR(23)NOT NULL,PRIMARY KEY (P_PARTKEY));CREATETABLESUPPLIER ( S_SUPPKEYINTEGERNOT NULL, S_NAMEVARCHAR(25)/*CHAR(25)*/NOT NULL, S_ADDRESSVARCHAR(40)NOT NULL, S_NATIONKEYINTEGERNOT NULL, S_PHONEVARCHAR(15)/*CHAR(15)*/NOT NULL, S_ACCTBALDECIMAL(15,2)NOT NULL, S_COMMENTVARCHAR(101)NOT NULL,PRIMARY KEY (S_SUPPKEY));CREATETABLEPARTSUPP ( PS_PARTKEYINTEGERNOT NULL, PS_SUPPKEYINTEGERNOT NULL, PS_AVAILQTYINTEGERNOT NULL, PS_SUPPLYCOSTDECIMAL(15,2)NOT NULL, PS_COMMENTVARCHAR(199)NOT NULL,PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY));CREATETABLECUSTOMER ( C_CUSTKEYINTEGERNOT NULL, C_NAMEVARCHAR(25)NOT NULL, C_ADDRESSVARCHAR(40)NOT NULL, C_NATIONKEYINTEGERNOT NULL, C_PHONEVARCHAR(15)/*CHAR(15)*/NOT NULL, C_ACCTBALDECIMAL(15,2)NOT NULL, C_MKTSEGMENTVARCHAR(10)/*CHAR(10)*/NOT NULL, C_COMMENTVARCHAR(117)NOT NULL,PRIMARY KEY (C_CUSTKEY));CREATETABLEORDERS ( O_ORDERKEYBIGINTNOT NULL, O_CUSTKEYINTEGERNOT NULL, O_ORDERSTATUSVARCHAR(1)/*CHAR(1)*/NOT NULL, O_TOTALPRICEDECIMAL(15,2)NOT NULL, O_ORDERDATEDATENOT NULL, O_ORDERPRIORITYVARCHAR(15)/*CHAR(15)*/NOT NULL, O_CLERKVARCHAR(15)/*CHAR(15)*/NOT NULL, O_SHIPPRIORITYINTEGERNOT NULL, O_COMMENTVARCHAR(79)NOT NULL,PRIMARY KEY (O_ORDERKEY));CREATETABLELINEITEM ( L_ORDERKEYBIGINTNOT NULL, L_PARTKEYINTEGERNOT NULL, L_SUPPKEYINTEGERNOT NULL, L_LINENUMBERINTEGERNOT NULL, L_QUANTITYINTEGER/*DECIMAL(15,2)*/NOT NULL, L_EXTENDEDPRICEDECIMAL(15,2)NOT NULL, L_DISCOUNTDECIMAL(15,2)NOT NULL, L_TAXDECIMAL(15,2)NOT NULL, L_RETURNFLAGVARCHAR(1)NOT NULL, L_LINESTATUSVARCHAR(1)NOT NULL, L_SHIPDATEDATENOT NULL, L_COMMITDATEDATENOT NULL, L_RECEIPTDATEDATENOT NULL, L_SHIPINSTRUCTVARCHAR(25)/*CHAR(25)*/NOT NULL, L_SHIPMODEVARCHAR(10)/*CHAR(10)*/NOT NULL, L_COMMENTVARCHAR(44)NOT NULL,PRIMARY KEY (L_ORDERKEY, L_LINENUMBER));copy nationfrom'/home/pengzhen/Documents/tpch-parquet/nation.parquet'with (FORMAT'parquet');copy regionfrom'/home/pengzhen/Documents/tpch-parquet/region.parquet'with (FORMAT'parquet');copy partfrom'/home/pengzhen/Documents/tpch-parquet/part.parquet'with (FORMAT'parquet');copy supplierfrom'/home/pengzhen/Documents/tpch-parquet/supplier.parquet'with (FORMAT'parquet');copy partsuppfrom'/home/pengzhen/Documents/tpch-parquet/partsupp.parquet'with (FORMAT'parquet');copy customerfrom'/home/pengzhen/Documents/tpch-parquet/customer.parquet'with (FORMAT'parquet');copy ordersfrom'/home/pengzhen/Documents/tpch-parquet/orders.parquet'with (FORMAT'parquet');copy lineitemfrom'/home/pengzhen/Documents/tpch-parquet/lineitem.parquet'with (FORMAT'parquet');"
testerhelp tpch1g//测试tpch querytester tpch1g --query_id int 运行指定序号的query。范围[1,22]。为0时,按顺序执行22条query。 --data_path string tpch1g 数据位置 --data_format string tpch1g 数据格式。csv,parquet --result_path string query结果位置 --need_headline bool query结果第一行为headline行
tpch1g测试结果
**注意:在忽略精度和结果标题前提下,进行对比
tpch 1g qX | status | 与duckdb相同 | 与mo相同 |
---|---|---|---|
q1 | right | y | y |
q2 | right | n (s_ddress,s_comment 不同) | y |
q3 | right | y | y |
q4 | right | y | y |
q5 | right | y | y |
q6 | right | y | y |
q7 | right | y | y |
q8 | right | y | y |
q9 | right | y | y |
q10 | right (use topN further) | n (c_address,c_comment 不同) | y |
q11 | right | y | y |
q12 | right | y | y |
q13 | almost right. (duckdb convert left join to inner join) | n | almost y. count(NULL) is diff |
q14 | right | y | y |
q15 | right | n (s_address 不同) | y |
q16 | right | y | y |
q17 | right | y | y |
q18 | right | y | y |
q19 | right | y | y |
q20 | right | n (s_address 不同) | y |
q21 | right | y | y |
q22 | right | y | y |
**