You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spanner Go客户端是否支持bulk inserts(批量插入)功能?

Spanner Go客户端bulk inserts功能说明

Spanner Go客户端完全支持bulk inserts功能,常见有三类实现方式,对应不同的使用场景:

1. 直接执行多行INSERT SQL语句

你提到的Statement类型并不限制仅支持单行插入,完全可以直接传入官方文档所示的多行INSERT语法执行,适合单次插入几十到上百行的轻量批量场景,示例代码如下:

stmt := spanner.Statement{
    SQL: `INSERT INTO Singers (SingerId, FirstName, LastName)
          VALUES(@id1, @fn1, @ln1), (@id2, @fn2, @ln2), (@id3, @fn3, @ln3)`,
    Params: map[string]interface{}{
        "id1": 1, "fn1": "Marc", "ln1": "Richards",
        "id2": 2, "fn2": "Catalina", "ln2": "Smith",
        "id3": 3, "fn3": "Alice", "ln3": "Trentor",
    },
}
// 在读写事务中执行即可
_, err := txn.Update(ctx, stmt)

注意不要单次传入过多行,避免SQL语句超出大小限制。

2. 使用Mutation批量写入(推荐)

Spanner原生的Mutation API天生支持批量操作,性能比多行SQL插入高30%以上,且不需要拼接SQL,无注入风险,适合单次插入几百到几千行的常规批量场景,示例代码如下:

var ms []*spanner.Mutation
// 构造待插入的数据集
singers := []struct{
    SingerId int64
    FirstName string
    LastName string
}{
    {1, "Marc", "Richards"},
    {2, "Catalina", "Smith"},
    {3, "Alice", "Trentor"},
}
for _, s := range singers {
    m, err := spanner.InsertStruct("Singers", s)
    if err != nil {
        // 处理构造错误
    }
    ms = append(ms, m)
}
// 提交批量Mutation,也可以在事务中调用txn.BufferWrite(ms)提交
_, err := client.Apply(ctx, ms)

3. 超大规模批量写入用BatchWrite

如果需要插入数万行及以上的海量数据(比如数据导入场景),可以使用client.BatchWrite()方法,它会自动拆分数据分片、并行提交,是所有批量写入方式中性能最高的。

注意:你之前尝试的BatchUpdate()方法是用于执行一批独立DML语句的接口,本身设计目标就不是批量插入,性能远低于上述两种方式,不建议在bulk insert场景使用。

内容的提问来源于stack exchange,提问作者RPayne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:15:05