首页 > 解决方案 > 通过 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)

标签: sql-insertinformixtemp-tables

解决方案


您使用的是哪个版本的 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。您不太可能使用足够旧的版本来解决这个问题,但是随着时间的推移规则已经发生了变化。


推荐阅读