Skip to content

Commit 7ec6eda

Browse files
committed
Adds materialized CTE, with performance tracking code
1 parent 017fa63 commit 7ec6eda

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

src/api/tables.ts

+32-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,21 @@ import { DEFAULT_SYSTEM_SCHEMAS } from '../lib/constants'
55
import { Tables } from '../lib/interfaces'
66
import sqlTemplates = require('../lib/sql')
77

8+
// const { PerformanceObserver, performance } = require('perf_hooks')
9+
10+
// const obs = new PerformanceObserver((items) => {
11+
// console.log(items.getEntries()[0].duration)
12+
// performance.clearMarks()
13+
// })
14+
// obs.observe({ entryTypes: ['measure'] })
15+
// performance.measure('Start to Now')
16+
17+
// performance.mark('A')
18+
// performance.measure('A to Now', 'A')
19+
20+
// performance.mark('B')
21+
// performance.measure('A to B', 'A', 'B')
22+
823
/**
924
* @param {string} [include_system_schemas=false] - Return system schemas as well as user schemas
1025
*/
@@ -15,17 +30,28 @@ interface QueryParams {
1530
const router = Router()
1631

1732
router.get('/', async (req, res) => {
33+
console.time('Total: GET tables')
1834
try {
35+
console.time('\n\nbuild sql')
1936
const sql = getTablesSql(sqlTemplates)
37+
console.timeEnd('\n\nbuild sql')
38+
39+
console.time('GET table data')
2040
const { data } = await RunQuery(req.headers.pg, sql)
41+
console.timeEnd('GET table data')
2142
const query: QueryParams = req.query
43+
44+
console.time('remove system tables')
2245
const include_system_schemas = query?.include_system_schemas === 'true'
2346
let payload: Tables.Table[] = data
2447
if (!include_system_schemas) payload = removeSystemSchemas(data)
48+
console.timeEnd('remove system tables')
2549
return res.status(200).json(payload)
2650
} catch (error) {
2751
console.log('throwing error', error)
2852
res.status(500).json({ error: 'Database error', status: 500 })
53+
} finally {
54+
console.timeEnd('Total: GET tables')
2955
}
3056
})
3157

@@ -122,12 +148,12 @@ router.delete('/:id', async (req, res) => {
122148
const getTablesSql = (sqlTemplates) => {
123149
const { columns, grants, policies, primary_keys, relationships, tables } = sqlTemplates
124150
return `
125-
WITH tables AS ( ${tables} ),
126-
columns AS ( ${columns} ),
127-
grants AS ( ${grants} ),
128-
policies AS ( ${policies} ),
129-
primary_keys AS ( ${primary_keys} ),
130-
relationships AS ( ${relationships} )
151+
WITH tables AS MATERIALIZED ( ${tables} ),
152+
columns AS MATERIALIZED ( ${columns} ),
153+
grants AS MATERIALIZED ( ${grants} ),
154+
policies AS MATERIALIZED ( ${policies} ),
155+
primary_keys AS MATERIALIZED ( ${primary_keys} ),
156+
relationships AS MATERIALIZED ( ${relationships} )
131157
SELECT
132158
*,
133159
${coalesceRowsToArray('columns', 'SELECT * FROM columns WHERE columns.table_id = tables.id')},

src/lib/helpers.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export const coalesceRowsToArray = (source: string, joinQuery: string) => {
2+
// Note that array_to_json(array_agg(row_to_json())) seems to perform better than json_agg
23
return `
34
COALESCE(
45
(

0 commit comments

Comments
 (0)