如何在数据库通信中有效地处理BLOB和数值数据?

时间:2008-10-20 20:11:44

标签: sql database language-agnostic optimization rdbms

SQL数据库似乎是大多数软件的基石。但是,它似乎针对文本数据进行了优化。事实上,当涉及数值数据,特别是整数的任何查询时,数字转换为文本然后在应用程序和数据库之间以两种方式转换为本机格式似乎效率低下。同样的低效率似乎也适用于BLOB数据。我的理解是,即使使用Linq to SQL之类的东西,这种双向转换也会在后台发生。

是否有通用的方法来绕过SQL的开销?某些数据库管理系统是否比其他数据库管理系统更有效地处理(即使用非标准扩展/ API)?

澄清。在下面的select语句中,IN之后的数字列表可以更容易地作为int的原始数组传递,但似乎无法实现该优化级别。

SELECT foo FROM bar WHERE baz IN (23, 34, 45, 9854004, ...)

2 个答案:

答案 0 :(得分:2)

不要以为。测量

格式转换不太可能是数据库工作的可衡量成本,除非您将数据库误用为算术引擎。

LOB的IO成本,特别是对于带有字符转换的CLO,可能会变得很重要;这里的补救措施,一旦你知道可能有效的最简单的东西实际上会产生明显的性能影响,那就是最小化你复制LOB数据的次数。使用任何SQL参数绑定样式允许您在其创建或使用点与数据库之间直接传输数据 - 通常这会将LOB绑定到流或I / O通道。

但是在你有办法测量影响之前不要这样做,并且测量显示这是你的瓶颈。

答案 1 :(得分:1)

数据库中的数字数据不会存储为文本。我想这取决于数据库,但它肯定不一定是,也不是。

BLOB的存储方式与您设置它们的方式完全相同 - 根据定义,数据库无法解释信息 - 我想如果发现它有用,它可以压缩。 BLOB不会翻译成文本。

以下是Oracle存储数字的方式:

http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#i16209

  

内部数字格式

     

Oracle数据库以可变长度格式存储数字数据。每个值都以科学计数法存储,1个字节用于存储指数,最多20个字节用于存储尾数。结果值限制为38位精度。 Oracle数据库不存储前导零和尾随零。例如,数字412以类似于4.12×102的格式存储,其中1个字节用于存储指数(2),2个字节用于存储尾数(4,1,2)的三个有效数字。负数包括其长度的符号。

MySQL信息:

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

查看表格 - TINYINT以1字节(范围-128 - 127)表示,如果以文本形式存储则无法实现。

编辑:澄清 - 我会说使用你的语言看起来像这样的API(伪代码)

stmt = conn.Prepare("SELECT * FROM TABLE where x in (?, ?, ?)");
stmt.SetInt(0, x);
stmt.SetInt(1, y);
stmt.SetInt(2, z);

我不相信基础协议使用文本来传输参数。