postgres loading optimalization
This commit is contained in:
@@ -92,62 +92,22 @@ class Analyser extends DatabaseAnalyser {
|
||||
this.feedback({ analysingMessage: 'DBGM-00243 Loading primary keys' });
|
||||
const pkColumns = await this.analyserQuery('primaryKeys', ['tables']);
|
||||
|
||||
let fkColumns = null;
|
||||
|
||||
this.feedback({ analysingMessage: 'DBGM-00244 Loading foreign key constraints' });
|
||||
// const fk_tableConstraints = await this.analyserQuery('fk_tableConstraints', ['tables']);
|
||||
|
||||
this.feedback({ analysingMessage: 'DBGM-00245 Loading foreign key refs' });
|
||||
this.feedback({ analysingMessage: 'DBGM-00244 Loading foreign keys' });
|
||||
const foreignKeys = await this.analyserQuery('foreignKeys', ['tables']);
|
||||
|
||||
this.feedback({ analysingMessage: 'DBGM-00246 Loading foreign key columns' });
|
||||
const fk_keyColumnUsage = await this.analyserQuery('fk_keyColumnUsage', ['tables']);
|
||||
|
||||
// const cntKey = x => `${x.constraint_name}|${x.constraint_schema}`;
|
||||
const fkRows = [];
|
||||
// const fkConstraintDct = _.keyBy(fk_tableConstraints.rows, cntKey);
|
||||
for (const fkRef of foreignKeys.rows) {
|
||||
// const cntBase = fkConstraintDct[cntKey(fkRef)];
|
||||
// const cntRef = fkConstraintDct[`${fkRef.unique_constraint_name}|${fkRef.unique_constraint_schema}`];
|
||||
// if (!cntBase || !cntRef) continue;
|
||||
const baseCols = _.sortBy(
|
||||
fk_keyColumnUsage.rows.filter(
|
||||
x =>
|
||||
x.table_name == fkRef.table_name &&
|
||||
x.constraint_name == fkRef.constraint_name &&
|
||||
x.table_schema == fkRef.table_schema
|
||||
),
|
||||
'ordinal_position'
|
||||
);
|
||||
const refCols = _.sortBy(
|
||||
fk_keyColumnUsage.rows.filter(
|
||||
x =>
|
||||
x.table_name == fkRef.ref_table_name &&
|
||||
x.constraint_name == fkRef.unique_constraint_name &&
|
||||
x.table_schema == fkRef.ref_table_schema
|
||||
),
|
||||
'ordinal_position'
|
||||
);
|
||||
if (baseCols.length != refCols.length) continue;
|
||||
|
||||
for (let i = 0; i < baseCols.length; i++) {
|
||||
const baseCol = baseCols[i];
|
||||
const refCol = refCols[i];
|
||||
|
||||
fkRows.push({
|
||||
...fkRef,
|
||||
pure_name: fkRef.table_name,
|
||||
schema_name: fkRef.table_schema,
|
||||
ref_table_name: fkRef.ref_table_name,
|
||||
ref_schema_name: fkRef.ref_table_schema,
|
||||
column_name: baseCol.column_name,
|
||||
ref_column_name: refCol.column_name,
|
||||
update_action: fkRef.update_action,
|
||||
delete_action: fkRef.delete_action,
|
||||
});
|
||||
}
|
||||
}
|
||||
fkColumns = { rows: fkRows };
|
||||
const fkColumns = {
|
||||
rows: foreignKeys.rows.map(fk => ({
|
||||
pure_name: fk.table_name,
|
||||
schema_name: fk.table_schema,
|
||||
constraint_name: fk.constraint_name,
|
||||
column_name: fk.column_name,
|
||||
ref_table_name: fk.ref_table_name,
|
||||
ref_schema_name: fk.ref_table_schema,
|
||||
ref_column_name: fk.ref_column_name,
|
||||
update_action: fk.update_action,
|
||||
delete_action: fk.delete_action,
|
||||
})),
|
||||
};
|
||||
|
||||
this.feedback({ analysingMessage: 'DBGM-00247 Loading views' });
|
||||
const views = await this.analyserQuery('views', ['views']);
|
||||
|
||||
@@ -1,22 +1,38 @@
|
||||
module.exports = `
|
||||
select
|
||||
table_schema as "schema_name",
|
||||
table_name as "pure_name",
|
||||
column_name as "column_name",
|
||||
is_nullable as "is_nullable",
|
||||
data_type as "data_type",
|
||||
character_maximum_length as "char_max_length",
|
||||
numeric_precision as "numeric_precision",
|
||||
numeric_scale as "numeric_scale",
|
||||
column_default as "default_value"
|
||||
from information_schema.columns
|
||||
where
|
||||
table_schema !~ '^_timescaledb_'
|
||||
and (
|
||||
('tables:' || table_schema || '.' || table_name) =OBJECT_ID_CONDITION
|
||||
or
|
||||
('views:' || table_schema || '.' || table_name) =OBJECT_ID_CONDITION
|
||||
)
|
||||
and table_schema =SCHEMA_NAME_CONDITION
|
||||
order by ordinal_position
|
||||
SELECT
|
||||
n.nspname AS "schema_name",
|
||||
c.relname AS "pure_name",
|
||||
a.attname AS "column_name",
|
||||
CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS "is_nullable",
|
||||
format_type(a.atttypid, NULL) AS "data_type",
|
||||
CASE
|
||||
WHEN a.atttypmod > 0 AND t.typname IN ('varchar', 'bpchar', 'char') THEN a.atttypmod - 4
|
||||
WHEN a.atttypmod > 0 AND t.typname IN ('bit', 'varbit') THEN a.atttypmod
|
||||
ELSE NULL
|
||||
END AS "char_max_length",
|
||||
CASE
|
||||
WHEN a.atttypmod > 0 AND t.typname = 'numeric' THEN ((a.atttypmod - 4) >> 16) & 65535
|
||||
ELSE NULL
|
||||
END AS "numeric_precision",
|
||||
CASE
|
||||
WHEN a.atttypmod > 0 AND t.typname = 'numeric' THEN (a.atttypmod - 4) & 65535
|
||||
ELSE NULL
|
||||
END AS "numeric_scale",
|
||||
pg_get_expr(d.adbin, d.adrelid) AS "default_value"
|
||||
FROM pg_catalog.pg_attribute a
|
||||
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid
|
||||
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
||||
JOIN pg_catalog.pg_type t ON t.oid = a.atttypid
|
||||
LEFT JOIN pg_catalog.pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum
|
||||
WHERE a.attnum > 0
|
||||
AND NOT a.attisdropped
|
||||
AND c.relkind IN ('r', 'v', 'p', 'f')
|
||||
AND n.nspname !~ '^_timescaledb_'
|
||||
AND (
|
||||
('tables:' || n.nspname || '.' || c.relname) =OBJECT_ID_CONDITION
|
||||
OR
|
||||
('views:' || n.nspname || '.' || c.relname) =OBJECT_ID_CONDITION
|
||||
)
|
||||
AND n.nspname =SCHEMA_NAME_CONDITION
|
||||
ORDER BY a.attnum
|
||||
`;
|
||||
@@ -5,7 +5,8 @@ SELECT
|
||||
con.conname AS constraint_name,
|
||||
nsp2.nspname AS ref_table_schema,
|
||||
rel2.relname AS ref_table_name,
|
||||
conpk.conname AS unique_constraint_name,
|
||||
att.attname AS column_name,
|
||||
att2.attname AS ref_column_name,
|
||||
CASE con.confupdtype
|
||||
WHEN 'a' THEN 'NO ACTION'
|
||||
WHEN 'r' THEN 'RESTRICT'
|
||||
@@ -13,26 +14,26 @@ SELECT
|
||||
WHEN 'n' THEN 'SET NULL'
|
||||
WHEN 'd' THEN 'SET DEFAULT'
|
||||
ELSE con.confupdtype::text
|
||||
END AS update_action,
|
||||
|
||||
CASE con.confdeltype
|
||||
END AS update_action,
|
||||
CASE con.confdeltype
|
||||
WHEN 'a' THEN 'NO ACTION'
|
||||
WHEN 'r' THEN 'RESTRICT'
|
||||
WHEN 'c' THEN 'CASCADE'
|
||||
WHEN 'n' THEN 'SET NULL'
|
||||
WHEN 'd' THEN 'SET DEFAULT'
|
||||
ELSE con.confdeltype::text
|
||||
END AS delete_action
|
||||
|
||||
END AS delete_action
|
||||
FROM pg_constraint con
|
||||
JOIN pg_class rel ON rel.oid = con.conrelid
|
||||
JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
|
||||
JOIN pg_class rel2 ON rel2.oid = con.confrelid
|
||||
JOIN pg_namespace nsp2 ON nsp2.oid = rel2.relnamespace
|
||||
JOIN pg_constraint conpk
|
||||
ON conpk.conrelid = con.confrelid
|
||||
AND conpk.conkey = con.confkey
|
||||
AND conpk.contype IN ('p','u') -- 'p' = primary key, 'u' = unique constraint
|
||||
WHERE con.contype = 'f' AND ('tables:' || nsp.nspname || '.' || rel.relname) =OBJECT_ID_CONDITION AND nsp.nspname =SCHEMA_NAME_CONDITION
|
||||
JOIN LATERAL unnest(con.conkey, con.confkey) WITH ORDINALITY AS cols(attnum, ref_attnum, ordinal_position) ON TRUE
|
||||
JOIN pg_attribute att ON att.attrelid = con.conrelid AND att.attnum = cols.attnum
|
||||
JOIN pg_attribute att2 ON att2.attrelid = con.confrelid AND att2.attnum = cols.ref_attnum
|
||||
WHERE con.contype = 'f'
|
||||
AND ('tables:' || nsp.nspname || '.' || rel.relname) =OBJECT_ID_CONDITION
|
||||
AND nsp.nspname =SCHEMA_NAME_CONDITION
|
||||
ORDER BY con.conname, cols.ordinal_position
|
||||
;
|
||||
`;
|
||||
|
||||
@@ -20,14 +20,11 @@ const listDatabases = require('./listDatabases');
|
||||
const listVariables = require('./listVariables');
|
||||
const listProcesses = require('./listProcesses');
|
||||
|
||||
const fk_keyColumnUsage = require('./fk_key_column_usage');
|
||||
|
||||
module.exports = {
|
||||
columns,
|
||||
tableList,
|
||||
viewModifications,
|
||||
primaryKeys,
|
||||
fk_keyColumnUsage,
|
||||
foreignKeys,
|
||||
views,
|
||||
routines,
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
module.exports = `
|
||||
select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_name",
|
||||
pg_relation_size('"'||infoTables.table_schema||'"."'||infoTables.table_name||'"') as "size_bytes"
|
||||
from information_schema.tables infoTables
|
||||
where infoTables.table_type not like '%VIEW%'
|
||||
and ('tables:' || infoTables.table_schema || '.' || infoTables.table_name) =OBJECT_ID_CONDITION
|
||||
and infoTables.table_schema <> 'pg_internal'
|
||||
and infoTables.table_schema !~ '^_timescaledb_'
|
||||
and infoTables.table_schema =SCHEMA_NAME_CONDITION
|
||||
SELECT
|
||||
n.nspname AS "schema_name",
|
||||
c.relname AS "pure_name",
|
||||
pg_relation_size(c.oid) AS "size_bytes"
|
||||
FROM pg_catalog.pg_class c
|
||||
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
||||
WHERE c.relkind IN ('r', 'p', 'f')
|
||||
AND ('tables:' || n.nspname || '.' || c.relname) =OBJECT_ID_CONDITION
|
||||
AND n.nspname <> 'pg_internal'
|
||||
AND n.nspname !~ '^_timescaledb_'
|
||||
AND n.nspname =SCHEMA_NAME_CONDITION
|
||||
`;
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
module.exports = `
|
||||
select
|
||||
table_name as "pure_name",
|
||||
table_schema as "schema_name",
|
||||
$md5Function(view_definition) as "hash_code"
|
||||
from
|
||||
information_schema.views where table_schema != 'information_schema' and table_schema != 'pg_catalog' and table_schema !~ '^_timescaledb_' and table_schema =SCHEMA_NAME_CONDITION
|
||||
SELECT
|
||||
c.relname AS "pure_name",
|
||||
n.nspname AS "schema_name",
|
||||
$md5Function(pg_get_viewdef(c.oid, true)) AS "hash_code"
|
||||
FROM pg_catalog.pg_class c
|
||||
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
||||
WHERE c.relkind = 'v'
|
||||
AND n.nspname != 'information_schema'
|
||||
AND n.nspname != 'pg_catalog'
|
||||
AND n.nspname !~ '^_timescaledb_'
|
||||
AND n.nspname =SCHEMA_NAME_CONDITION
|
||||
`;
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
module.exports = `
|
||||
select
|
||||
table_name as "pure_name",
|
||||
table_schema as "schema_name",
|
||||
view_definition as "create_sql",
|
||||
$md5Function(view_definition) as "hash_code"
|
||||
from
|
||||
information_schema.views
|
||||
where table_schema !~ '^_timescaledb_' and table_schema =SCHEMA_NAME_CONDITION
|
||||
and ('views:' || table_schema || '.' || table_name) =OBJECT_ID_CONDITION
|
||||
SELECT
|
||||
c.relname AS "pure_name",
|
||||
n.nspname AS "schema_name",
|
||||
pg_get_viewdef(c.oid, true) AS "create_sql",
|
||||
$md5Function(pg_get_viewdef(c.oid, true)) AS "hash_code"
|
||||
FROM pg_catalog.pg_class c
|
||||
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
||||
WHERE c.relkind = 'v'
|
||||
AND n.nspname !~ '^_timescaledb_'
|
||||
AND n.nspname =SCHEMA_NAME_CONDITION
|
||||
AND ('views:' || n.nspname || '.' || c.relname) =OBJECT_ID_CONDITION
|
||||
`;
|
||||
|
||||
Reference in New Issue
Block a user