
# 应用场景
#### 场景描述
当一次操作中将多条记录写入数据库时，相比逐条插入，批量插入可以减少数据库与应用程序之间的交互次数，降低网络延迟和系统资源消耗，从而显著提高数据写入效率。
本章通过实现批量插入介绍如何使用ODBC驱动连接数据库、使用事务、批量插入和获取结果集列信息等操作。
#### 触发条件
ODBC配置开启UseServerSidePrepare和UseBatchProtocol参数（两个参数均默认开启），应用代码中配置批量绑定参数并初始化批量数据，最终进行批量插入操作。
#### 业务影响
- 降低网络交互成本。 将多条INSERT合并为一次批量操作，可显著降低客户端与数据库之间的网络往返次数，进而实现提升整体吞吐量，以及减轻网络拥塞对性能的影响。
  
- 提高数据处理效率 逐条插入方式需要数据库对每条SQL都进行语法解析和执行计划生成，批量插入只需一次解析和一次执行计划，避免了多次重复工作，节省了CPU周期和内存分配时间。
  
- 降低系统资源使用开销 逐条插入方式通常会触发一次事务提交或至少一次事务日志写入，而批量插入可在一次事务内插入多条记录，显著减少提交次数，降低事务日志压力和事务管理开销。减少网络包处理、事务管理、日志写入和行格式转换的总次数，有助于减轻数据库服务器的CPU负载和内存临时空间占用，从而将更多资源留给核心查询与计算操作。
  
- 评估内存的使用 构建批量插入的SQL语句时，如果数据量过大，会导致内存占用显著增加。尤其是当使用字符串拼接方式构建SQL语句时，内存消耗可能会急剧上升。过大的批量处理可能导致超出数据库或驱动的最大SQL长度限制，或者触发其他参数限制，从而引发错误或性能问题。
  
批量插入和逐条插入的对比：
| 方式   | 优点                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 缺点                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|:---|
| 逐条插入 | - 代码简单、直观，易于实现。  - 单条失败时可精确处理，不影响其他记录。  - 对数据库和驱动兼容性要求低。   | - 网络交互次数多，每次插入都要连接/解析/提交，性能低。  - 大量记录时容易成为瓶颈。  - 如果不使用事务，无法保证多条插入的一致性。   |
| 批量插入 | - 大幅减少网络往返和 SQL 解析次数，插入吞吐量显著提高。  - 可以在一个事务中一次性提交多行，保证原子性。                                                                                                                                                                                                                                                                                     | - 代码复杂度高，需要手动拼接占位符和参数。  - 单语句错误会回滚所有数据，错误恢复复杂。  - 占位符数量受限，批次大小需控制。      |
   
#### 适用版本
仅支持GaussDB V500R002C10及以上版本。
