Массовое обновление до Postgres с проблемой производительности узла js - PullRequest
0 голосов
/ 21 сентября 2018

Я столкнулся с проблемой производительности при попытке выполнить массовое обновление в PostgresDB.Обновление около 23000 записей занимает более 180 секунд.ПФБ код.Я использую библиотеку pg-обещания.Что я могу сделать, чтобы улучшить производительность?

const pgp = require('pg-promise')();

const postgresDBConfig = {
    host: Config.postgresDBHost,
    port: Config.postgresDBPort,
    database: Constants.postgresDBName,
    user: Config.postgresDBUser,
    password: 'pswd'
};

export async function getTransactionDetails(): Promise<any> {

    return new Promise<any>(async function (resolve, reject) {
        try {
            let db = pgp(postgresDBConfig);
            db.connect();
            let query = "SELECT * FROM table_name";
            db.any(query)
                .then(data => {
                    console.log("Executed successfully::");
                    resolve(data);
                })
                .catch(error => {
                    console.log('ERROR:', error);
                })

        } catch (error) {
            log.error("Error::" + error);
            throw error;
        }
    });
}

export async function updateStatus(result: any, status: string) {
    try {

        let db = pgp(postgresDBConfig);
        //db.connect();
        let updateData = [];
        _.forEach(result, function (row) {
            let updateInfo = {};
            updateInfo["sessionid"] = row.sessionid;
            updateInfo["status"] = status;
            updateData.push(updateInfo);
        });
        console.log("updateData::" + updateData.length);
        const tableName = new pgp.helpers.TableName('table_name', 'schema_name');
        let columnset = new pgp.helpers.ColumnSet(['?sessionid', 'status'], { table: tableName });
        let update = pgp.helpers.update(updateData, columnset);
        db.none(update).then(() => {
            console.log("Updated successfully");
        })
            .catch(error => {
                console.log("Error updating the status" + error);
            });
    }

    catch (error) {
        log.error("Error in function updateStatus::" + error);
        throw error;
    }
}

1 Ответ

0 голосов
/ 22 сентября 2018

Код обнаруживает проблемы повсюду

  • Вы должны инициализировать объект базы данных только один раз
  • Вы не должны использовать db.connect() вообще,который вы также неправильно используете для асинхронного кода
  • Вы снова неправильно используете асинхронный блок, пропуская await, поэтому он не выполняется правильно.
  • Вы не добавляете ни одного логического предложения UPDATE,поэтому он обновляет все заново, безоговорочно, что может привести к задержке беспорядка, в котором вы находитесь.

Вот улучшенный пример, хотя может потребоваться дополнительная работа с вашей стороны...

const pgp = require('pg-promise')();

const postgresDBConfig = {
    host: Config.postgresDBHost,
    port: Config.postgresDBPort,
    database: Constants.postgresDBName,
    user: Config.postgresDBUser,
    password: 'pswd'
};

const db = pgp(postgresDBConfig);

const tableName = new pgp.helpers.TableName('table_name', 'schema_name');
const columnSet = new pgp.helpers.ColumnSet(['?sessionid', 'status'], {table: tableName});

export async function getTransactionDetails(): Promise<any> {
    try {
        const res = await db.any('SELECT * FROM table_name');
        console.log('Executed successfully::');
        return res;
    } catch (error) {
        console.log('ERROR:', error);
        throw error;
    }
}

export async function updateStatus(result: any, status: string) {
    try {
        let updateData = [];
        _.forEach(result, row => {
            let updateInfo = {};
            updateInfo["sessionid"] = row.sessionid;
            updateInfo["status"] = status;
            updateData.push(updateInfo);
        });
        console.log('updateData::', updateData.length);
        const update = pgp.helpers.update(updateData, columnSet) +
            ' WHERE v.sessionid = t.sessionid';
        await db.none(update);
        console.log('Updated successfully');
    }
    catch (error) {
        console.log('Error in function updateStatus:', error);
        throw error;
    }
}
...