我收集了一些原始数据并将其存储在Google电子表格中,并且还有一个现有的Google Cloud SQL实例。我正在尝试使用appscript从gsheet中提取数据,然后推送到gcloud SQL。
不幸的是,我发现完成"批量插入"花费了太多时间。这是我的方法和结果(在这个例子中,我没有展示从gsheet中提取数据的方法,因为它快速且无关紧要):
应用脚本:
var connection = [My Connection];
connection.setAutoCommit(false);
var stmt = connection.prepareStatement('INSERT INTO [testTable]'
+ '(emp_no,title,from_date,to_date) values (?, ?, ?, ?)');
for (var i = 1; i <= 50; i++) { //tuples counter i
stmt.setString(1, 1);
stmt.setString(2, "Worker" + i);
stmt.setString(3, "2018-03-11");
stmt.setString(4, "2019-05-04");
stmt.addBatch();
}
stmt.executeBatch();
connection.commit();
简单的代码,这是我的结果(来自"执行转换"):
当元组计数器i
小于 50 时:
[19-08-12 13:57:46:470 NZST] JdbcPreparedStatement.executeBatch() [9.978 秒]
当元组计数器小于 500 时i
:
[19-08-12 14:10:23:575 NZST] JdbcPreparedStatement.executeBatch() [96.578 秒]
我想做的是拉动和推动 5000 个元组。在这种情况下,如何减少执行时间?
Google Apps Script的JDBC连接器速度是出了名的慢。
您可能不得不完全放弃使用它,而是利用其他东西。
如果您了解 Node.js那么您可能需要考虑使用云函数作为中介服务来推送和拉取数据。
我遇到了同样的问题,并决定使用脚本属性来创建 250 行的批次,并每天多次运行脚本。它并不漂亮,但它省去了设置替代环境的麻烦。
像这样:
//get count variable to get what row number to start with
const scriptProperties = PropertiesService.getScriptProperties();
const countStart = parseInt(scriptProperties.getProperty('Count'));
const countEnd = (countStart + 250) < lastRow ? (countStart + 250) : lastRow;
//if all rows are already processed then don't do anything
if (countStart != lastRow) {
const conn = Jdbc.getCloudSqlConnection('xxxx', 'xxxx', 'xxxx');
conn.setAutoCommit(false);
const stmt = //statement here
//loop through data to create batches here
}