sql-insert - 通过 ODBC 传递给 Informix 的脚本大小
问题描述
我试图确定通过 ODBC 传递给 Informix 的脚本的大小是否有任何限制。
我的 Informix 脚本大小将达到几兆字节(INSERT
一个表大约有 3.5K 行TEMP
),并且格式为...
INSERT INTO table (field_1, field_2) VALUES (value_1, value_2)
INSERT INTO table (field_1, field_2) VALUES (value_1, value_2)
...
INSERT INTO table (field_1, field_2) VALUES (value_1, value_2)
...后跟一个部分以返回SELECT
基于现有表的列表...
SELECT
t1.field_1,
t1.field_2,
...
t1.field_n,
t2.field_2
FROM
table_1 AS t1
INNER JOIN
temp_table_2 AS t2
ON t1.field_1 = t2.field_1
脚本的大小或内存表的大小是否有任何限制?我估计(希望?)3.5K 行(我们只查看一两列)不会导致问题,或者以不利的方式影响服务器(很容易有足够的内存)。请注意,我唯一的通信方法是通过 ODBC,这是一个专有数据库 - 我无法在服务器上创建实际的数据表。
我要问的原因是,以前,我生成了一个相当大的脚本,但是,我没有将 3.5k 的 ID 放在一个TEMP
表中(带有相关数据),而是使用了一个IN
条件来仅查找 ID (一旦找到记录,就可以进行处理)。但是,我无法确定是脚本编辑器(它是数据库的某种接口)出现问题、限制IN
条件还是脚本本身的大小导致了问题,但基本上脚本不会跑。在此之后,我们创建了一个脚本,将其保存到一个文件夹并尝试执行它,结果相似(但不一样)(抱歉 - 我没有来自任何一个进程的错误消息 - 这是不久前完成的) .
在这方面的任何面向 Informix 的技巧都将不胜感激!:o)
解决方案
您使用的是哪个版本的 Informix?假设它是 12.10 或 14.10,那么对一组语句的大小没有具体限制,但是像你提出的一个怪物是对数据库服务器的残酷和不寻常的惩罚(它肯定是在滥用你的服务器)。
它也可能是中等风险的;您必须确保正确引用用户提供的任何数据以避免Little Bobby Tables的问题。
您应该准备一个带有两个占位符值的 INSERT 语句:
INSERT INTO table(field_1, field_2) VALUES(?,?)
然后,您应该重复执行此操作,提供不同的值。这将比让服务器解析 3,500 条类似语句更有效。在 ESQL/C 中,您可以声明一个 INSERT 游标,该游标将缓冲值集,从而减少到服务器的往返行程——这也是非常有价值的。我不确定这是否是 ODBC 中的一个选项;可能不是。
至少,您应该尝试使用准备好的语句。向服务器发送 3,500 x 60+ 字节 = 210 KiB 是可行的。但是,如果您使用准备好的语句并每次使用新参数重复执行它,您将向服务器发送更少的数据量(但会有更多的往返 - 这可能是一个因素)。并且您避免了将值转换为字符串的安全风险。(由于您没有说明值的类型,因此不确定是否存在风险。如果它们是数字或日期和时间之类的东西,它们的风险非常低。如果它们是字符串,则风险是相当大的——不是不可克服的,但也不是可以忽略不计的。)
旧版本的 Informix 对一组语句的大小有较小的限制 — 64 KiB,在此之前为 32 KiB。您不太可能使用足够旧的版本来解决这个问题,但是随着时间的推移规则已经发生了变化。
推荐阅读
- typescript - 从一个 Cloud Firestore 文档中获取一个字段以指定在另一个 Cloud Function 中侦听更改(或写入)的位置
- c# - 我如何在 Unity for android 中操纵立方体
- visual-studio - 使用 Azure DevOps 从多项目 .NET 解决方案部署单个项目时 CICD 管道构建出错
- javascript - 对 SpringBoot 控制器的 AJAX 调用导致 CORS 错误
- php - 文件存储在我的 Laravel 项目中不起作用
- google-sheets - 谷歌表格查询语句
- c# - HttpClient 静态与新
- java - Dialog里面的RecyclerView被截断底部
- ios - 在 iOS swift 中将 localizable.string 文件转换为 JSON
- c# - 创建数据服务以在 c# api 和前端(角度)之间进行通信