Использование узла js для запуска создания или обновления большого количества записей в SQL Server - PullRequest
0 голосов
/ 06 марта 2019

Пытаясь запустить большой скрипт, около 700 000 записей синхронизируются из одного источника в базу данных Azure.

В настоящее время я использую Sequelize для достижения этой цели.При запуске этого сценария требуется около 1 минуты для синхронизации 400 записей, что слишком медленно.

Я надеялся использовать функцию bulkCreate, но использование метода updateOnDuplicate несовместимо с mssql https://sequelize.readthedocs.io/en/latest/api/model/#bulkcreaterecords-options-promisearrayinstance

Как я до сих пор этого добиваюсь:

Модель

employees: this.sequelize.define(
      'employee',
      {
        _id: {
          type: Sequelize.STRING(24),
          primaryKey: true,
        },
        title: Sequelize.STRING,
        initials: Sequelize.STRING,
        surname: Sequelize.STRING,
        forename: Sequelize.STRING,
        middle_names: Sequelize.STRING,
        legal_surname: Sequelize.STRING,
        legal_forename: Sequelize.STRING,
        gender: Sequelize.STRING(10),
        date_of_birth_date: Sequelize.DATE
      {
        timestamps: true,
        createdAt: 'created_at',
        updatedAt: 'updated_at',
        indexes: [],
      }
    ),

Код синхронизации:

 async saveSQLResults(model: string, data: any) {
    for(const item of data) {
      const dbItem: any = await this.SQLSchemas[model]
        .findOne({ where: { _id: item._id }  });
      if(dbItem) {
        await dbItem.update(item);
      } else {
        await this.SQLSchemas[model].create(item);
      }
    }
  }

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете делать что-то параллельно, чтобы ускорить процесс.В настоящее время ваш for(const item of data) цикл последовательно выполняет поиск + обновление / создание.Даже если «медленная» база данных, параллельное выполнение большего объема будет быстрее.

Вы можете попробовать Promise.all[], чтобы взорвать их всех параллельно.Или попробуйте библиотеку Bluebird , чтобы запустить несколько параллельно (но только до лимита {concurrency: 3}).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...