【问题标题】:Bulk update to Postgres with node js performance issue使用节点 js 性能问题批量更新 Postgres
【发布时间】:2019-02-26 01:07:51
【问题描述】:

我在尝试在 PostgresDB 中进行批量更新时遇到了性能问题。更新大约 23000 条记录需要 180 多秒。 PFB 代码。我正在使用 pg-promise 库。我可以做些什么来提高性能吗?

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;
    }
}

【问题讨论】:

标签: node.js pg pg-promise node-postgres


【解决方案1】:

代码到处都是问题

  • You should initialize the database object only once
  • 你根本不应该使用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;
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多