Browse Source

fix: Postgres rows count of large tables

query optimized to handle large tables row count

re #283

Signed-off-by: Pranav C Balan <pranavxc@gmail.com>
pull/293/head
Pranav C Balan 3 years ago
parent
commit
5c06d35ad2
  1. 9
      packages/nc-gui/components/project/spreadsheet/rowsXcDataTable.vue
  2. 16
      packages/nocodb/src/lib/dataMapper/lib/sql/BaseModelSql.ts

9
packages/nc-gui/components/project/spreadsheet/rowsXcDataTable.vue

@ -214,8 +214,9 @@
</template> </template>
</div> </div>
<template v-if="data">
<v-pagination <v-pagination
v-if="data && count !== Infinity" v-if="count !== Infinity"
style="max-width: 100%" style="max-width: 100%"
v-model="page" v-model="page"
:length="Math.ceil(count / size)" :length="Math.ceil(count / size)"
@ -223,7 +224,7 @@
@input="loadTableData" @input="loadTableData"
color="primary lighten-2" color="primary lighten-2"
></v-pagination> ></v-pagination>
<div class="mx-auto d-flex align-center mt-n1 " style="max-width:250px"> <div v-else class="mx-auto d-flex align-center mt-n1 " style="max-width:250px">
<span class="caption" style="white-space: nowrap"> Change page:</span> <span class="caption" style="white-space: nowrap"> Change page:</span>
<v-text-field <v-text-field
class="ml-1 caption" class="ml-1 caption"
@ -236,10 +237,12 @@
type="number" type="number"
> >
<template #append> <template #append>
<x-icon tooltip="Change page" small icon.class="mt-1" @click="loadTableData">mdi-keyboard-return</x-icon> <x-icon tooltip="Change page" small icon.class="mt-1" @click="loadTableData">mdi-keyboard-return
</x-icon>
</template> </template>
</v-text-field> </v-text-field>
</div> </div>
</template>
<!-- <div v-else class="d-flex justify-center py-4">--> <!-- <div v-else class="d-flex justify-center py-4">-->
<!-- <v-alert type="info" dense class="ma-1 flex-shrink-1">Table is empty</v-alert>--> <!-- <v-alert type="info" dense class="ma-1 flex-shrink-1">Table is empty</v-alert>-->
<!-- </div>--> <!-- </div>-->

16
packages/nocodb/src/lib/dataMapper/lib/sql/BaseModelSql.ts

@ -252,7 +252,7 @@ class BaseModelSql extends BaseModel {
const query = driver(this.tn).insert(insertObj); const query = driver(this.tn).insert(insertObj);
if (this.dbDriver.clientType() === 'pg' || this.dbDriver.clientType() === 'mssql') { if (this.isPg() || this.dbDriver.clientType() === 'mssql') {
query.returning(Object.entries(this.aliasToColumn).map(([val, key]) => `${key} as ${val}`)); query.returning(Object.entries(this.aliasToColumn).map(([val, key]) => `${key} as ${val}`));
response = await this._run(query); response = await this._run(query);
} }
@ -282,6 +282,10 @@ class BaseModelSql extends BaseModel {
} }
private isPg() {
return this.dbDriver.clientType() === 'pg';
}
/** /**
* Update table row data by primary key * Update table row data by primary key
* *
@ -800,6 +804,16 @@ class BaseModelSql extends BaseModel {
*/ */
async countByPk({where = '', conditionGraph = null}) { async countByPk({where = '', conditionGraph = null}) {
try { try {
if (this.isPg() && !conditionGraph && !where) {
return (await this._run(
this.dbDriver.raw(`SELECT c.reltuples::bigint AS count
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = ?
AND n.nspname = ?`, [this.tn,this.config?.searchPath?.[0] || 'public'])
))?.rows?.[0];
}
return await this._run(this.$db return await this._run(this.$db
.conditionGraph(conditionGraph) .conditionGraph(conditionGraph)
.count(`${this.tn}.${(this.pks[0] || this.columns[0]).cn} as count`) .count(`${this.tn}.${(this.pks[0] || this.columns[0]).cn} as count`)

Loading…
Cancel
Save