Star Schema Benchmark

Compiling dbgen:

  1. git clone [email protected]:vadimtk/ssb-dbgen.git
  2. cd ssb-dbgen
  3. make

Generating data:

  1. ./dbgen -s 1000 -T c
  2. ./dbgen -s 1000 -T l
  3. ./dbgen -s 1000 -T p
  4. ./dbgen -s 1000 -T s
  5. ./dbgen -s 1000 -T d

Creating tables in ClickHouse:

  1. CREATE TABLE customer
  2. (
  3. C_CUSTKEY UInt32,
  4. C_NAME String,
  5. C_ADDRESS String,
  6. C_CITY LowCardinality(String),
  7. C_NATION LowCardinality(String),
  8. C_REGION LowCardinality(String),
  9. C_PHONE String,
  10. C_MKTSEGMENT LowCardinality(String)
  11. )
  12. ENGINE = MergeTree ORDER BY (C_CUSTKEY);
  13. CREATE TABLE lineorder
  14. (
  15. LO_ORDERKEY UInt32,
  16. LO_LINENUMBER UInt8,
  17. LO_CUSTKEY UInt32,
  18. LO_PARTKEY UInt32,
  19. LO_SUPPKEY UInt32,
  20. LO_ORDERDATE Date,
  21. LO_ORDERPRIORITY LowCardinality(String),
  22. LO_SHIPPRIORITY UInt8,
  23. LO_QUANTITY UInt8,
  24. LO_EXTENDEDPRICE UInt32,
  25. LO_ORDTOTALPRICE UInt32,
  26. LO_DISCOUNT UInt8,
  27. LO_REVENUE UInt32,
  28. LO_SUPPLYCOST UInt32,
  29. LO_TAX UInt8,
  30. LO_COMMITDATE Date,
  31. LO_SHIPMODE LowCardinality(String)
  32. )
  33. ENGINE = MergeTree PARTITION BY toYear(LO_ORDERDATE) ORDER BY (LO_ORDERDATE, LO_ORDERKEY);
  34. CREATE TABLE part
  35. (
  36. P_PARTKEY UInt32,
  37. P_NAME String,
  38. P_MFGR LowCardinality(String),
  39. P_CATEGORY LowCardinality(String),
  40. P_BRAND LowCardinality(String),
  41. P_COLOR LowCardinality(String),
  42. P_TYPE LowCardinality(String),
  43. P_SIZE UInt8,
  44. P_CONTAINER LowCardinality(String)
  45. )
  46. ENGINE = MergeTree ORDER BY P_PARTKEY;
  47. CREATE TABLE supplier
  48. (
  49. S_SUPPKEY UInt32,
  50. S_NAME String,
  51. S_ADDRESS String,
  52. S_CITY LowCardinality(String),
  53. S_NATION LowCardinality(String),
  54. S_REGION LowCardinality(String),
  55. S_PHONE String
  56. )
  57. ENGINE = MergeTree ORDER BY S_SUPPKEY;

Inserting data:

  1. clickhouse-client --query "INSERT INTO customer FORMAT CSV" < customer.tbl
  2. clickhouse-client --query "INSERT INTO part FORMAT CSV" < part.tbl
  3. clickhouse-client --query "INSERT INTO supplier FORMAT CSV" < supplier.tbl
  4. clickhouse-client --query "INSERT INTO lineorder FORMAT CSV" < lineorder.tbl

Converting “star schema” to denormalized “flat schema”:

  1. SET max_memory_usage = 20000000000, allow_experimental_multiple_joins_emulation = 1;
  2. CREATE TABLE lineorder_flat
  3. ENGINE = MergeTree
  4. PARTITION BY toYear(LO_ORDERDATE)
  5. ORDER BY (LO_ORDERDATE, LO_ORDERKEY) AS
  6. SELECT *
  7. FROM lineorder
  8. ANY INNER JOIN customer ON LO_CUSTKEY = C_CUSTKEY
  9. ANY INNER JOIN supplier ON LO_SUPPKEY = S_SUPPKEY
  10. ANY INNER JOIN part ON LO_PARTKEY = P_PARTKEY;
  11. ALTER TABLE lineorder_flat DROP COLUMN C_CUSTKEY, DROP COLUMN S_SUPPKEY, DROP COLUMN P_PARTKEY;

Running the queries:

  1. Q1.1
  2. SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toYear(LO_ORDERDATE) = 1993 AND LO_DISCOUNT BETWEEN 1 AND 3 AND LO_QUANTITY < 25;
  3. Q1.2
  4. SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toYYYYMM(LO_ORDERDATE) = 199401 AND LO_DISCOUNT BETWEEN 4 AND 6 AND LO_QUANTITY BETWEEN 26 AND 35;
  5. Q1.3
  6. SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toISOWeek(LO_ORDERDATE) = 6 AND toYear(LO_ORDERDATE) = 1994 AND LO_DISCOUNT BETWEEN 5 AND 7 AND LO_QUANTITY BETWEEN 26 AND 35;
  7. Q2.1
  8. SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA' GROUP BY year, P_BRAND ORDER BY year, P_BRAND;
  9. Q2.2
  10. SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_BRAND BETWEEN 'MFGR#2221' AND 'MFGR#2228' AND S_REGION = 'ASIA' GROUP BY year, P_BRAND ORDER BY year, P_BRAND;
  11. Q2.3
  12. SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_BRAND = 'MFGR#2239' AND S_REGION = 'EUROPE' GROUP BY year, P_BRAND ORDER BY year, P_BRAND;
  13. Q3.1
  14. SELECT C_NATION, S_NATION, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE C_REGION = 'ASIA' AND S_REGION = 'ASIA' AND year >= 1992 AND year <= 1997 GROUP BY C_NATION, S_NATION, year ORDER BY year asc, revenue desc;
  15. Q3.2
  16. SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE C_NATION = 'UNITED STATES' AND S_NATION = 'UNITED STATES' AND year >= 1992 AND year <= 1997 GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc;
  17. Q3.3
  18. SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND year >= 1992 AND year <= 1997 GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc;
  19. Q3.4
  20. SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND toYYYYMM(LO_ORDERDATE) = '199712' GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc;
  21. Q4.1
  22. SELECT toYear(LO_ORDERDATE) AS year, C_NATION, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') GROUP BY year, C_NATION ORDER BY year, C_NATION;
  23. Q4.2
  24. SELECT toYear(LO_ORDERDATE) AS year, S_NATION, P_CATEGORY, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (year = 1997 OR year = 1998) AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') GROUP BY year, S_NATION, P_CATEGORY ORDER BY year, S_NATION, P_CATEGORY;
  25. Q4.3
  26. SELECT toYear(LO_ORDERDATE) AS year, S_CITY, P_BRAND, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE S_NATION = 'UNITED STATES' AND (year = 1997 OR year = 1998) AND P_CATEGORY = 'MFGR#14' GROUP BY year, S_CITY, P_BRAND ORDER BY year, S_CITY, P_BRAND;

Original article