UNPKG

@clickup/ent-framework

Version:

A PostgreSQL graph-database-alike library with microsharding and row-level security

97 lines 4.55 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = default_1; const delay_1 = __importDefault(require("delay")); const range_1 = __importDefault(require("lodash/range")); const pg_1 = require("pg"); const test_utils_1 = require("../__tests__/test-utils"); const MAX_TIME_MS = 20000; const TBL = "batched_bench"; const COMMON_HEADER = "SET LOCAL search_path TO public"; const TEMPLATE_BATCHED = [ "WITH rows(name, url_name, some_flag, json_text_field, json_strongly_typed_field, jsonb_field, encrypted_field, created_at, updated_at, parent_id, id, _key) AS (VALUES\n" + `((NULL::${TBL}).name, (NULL::${TBL}).url_name, (NULL::${TBL}).some_flag, (NULL::${TBL}).json_text_field, (NULL::${TBL}).json_strongly_typed_field, (NULL::${TBL}).jsonb_field, (NULL::${TBL}).encrypted_field, (NULL::${TBL}).created_at, (NULL::${TBL}).updated_at, (NULL::${TBL}).parent_id, (NULL::${TBL}).id, ''),`, ` ('abc%s', 'aaa', true, '{"a":10,"b":{"c":20},"m":"%m"}', '{"a":42}', '{"a":"%m","b%m":"10"}', 'encrypted:ufyu', now(), now(), NULL, nextval('${TBL}_id_seq'), %k)`, ")\n" + `INSERT INTO ${TBL} (name, url_name, some_flag, json_text_field, json_strongly_typed_field, jsonb_field, encrypted_field, created_at, updated_at, parent_id, id)\n` + "SELECT name, url_name, some_flag, json_text_field, json_strongly_typed_field, jsonb_field, encrypted_field, created_at, updated_at, parent_id, id FROM rows OFFSET 1\n" + `ON CONFLICT DO NOTHING RETURNING (SELECT _key FROM rows WHERE rows.id=${TBL}.id), id`, ]; const TEMPLATE_MULTI = `INSERT INTO ${TBL} (name, url_name, some_flag, json_text_field, json_strongly_typed_field, jsonb_field, encrypted_field, created_at, updated_at, parent_id, id) VALUES\n` + `('abc%s', 'aaa', true, '{"a":10,"b":{"c":20},"m":"%m"}', '{"a":42}', '{"a":"%m","b%m":"10"}', 'encrypted:ufyu', now(), now(), NULL, nextval('${TBL}_id_seq')) ON CONFLICT DO NOTHING RETURNING id`; let seq = 0; let seqKey = 0; async function* default_1() { const pool = new pg_1.Pool({ ...test_utils_1.TEST_CONFIG, max: 1, idleTimeoutMillis: 30000, }); yield { name: "beforeEach", func: async () => { seq = 0; await pool.query(` BEGIN; ${COMMON_HEADER}; DROP TABLE IF EXISTS ${TBL}; CREATE TABLE ${TBL}( id bigserial NOT NULL PRIMARY KEY, name text NOT NULL, url_name text, some_flag boolean, json_text_field text, json_strongly_typed_field text, jsonb_field jsonb, encrypted_field text, created_at timestamptz NOT NULL, updated_at timestamptz NOT NULL, parent_id bigint, UNIQUE (name) ); CREATE INDEX ${TBL}_json_text_field ON ${TBL}(json_text_field); CREATE INDEX ${TBL}_jsonb_field ON ${TBL} USING gin (jsonb_field); COMMIT; `); await pool.query("CHECKPOINT"); await (0, delay_1.default)(2000); }, }; for (const batchSize of [2, 10, 20, 50, 100, 200, 400]) { const RANGE = (0, range_1.default)(0, batchSize); for (let i = 0; i < 1; i++) { yield { name: `each request = 1 batched query (${batchSize} rows each)`, maxTimeMs: MAX_TIME_MS, func: async () => { const query = `${COMMON_HEADER};\n` + `${TEMPLATE_BATCHED[0]}\n` + RANGE.map(() => replace(TEMPLATE_BATCHED[1])).join(",\n") + `\n${TEMPLATE_BATCHED[2]}`; await pool.query(query); }, }; } for (let i = 0; i < 1; i++) { yield { name: `each request = ${batchSize} queries ("multi-query")`, maxTimeMs: MAX_TIME_MS, func: async () => { const query = `${COMMON_HEADER};\n` + RANGE.map(() => replace(TEMPLATE_MULTI)).join(";\n"); await pool.query(query); }, }; } } } function replace(template) { return template .replace(/%s/g, `${seq++}`) .replace(/%m/g, `${seq++ % 10}`) .replace(/%k/g, `'${seqKey++}'`); } //# sourceMappingURL=batched-inserts.benchmark.js.map