代码之家  ›  专栏  ›  技术社区  ›  postfuturist

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

  •  1
  • postfuturist  · 技术社区  · 16 年前

    sql数据库似乎是大多数软件的基石。然而,它似乎是针对文本数据进行优化的。事实上,在执行任何涉及数字数据(具体来说是整数)的查询时,在应用程序和数据库之间,将数字转换为文本,然后返回到本机格式似乎效率低下。这种低效率似乎也适用于blob数据。我的理解是,即使使用类似linq到sql的东西,这种双向转换也会在后台发生。

    使用sql有没有一般的方法来绕过这个开销?是否有某些数据库管理系统比其他系统更有效地处理这个问题(例如,使用非标准扩展/api)?

    澄清。在下面的select语句中,in之后的数字列表可以更容易地作为int的原始数组传递,但是似乎没有办法达到这种优化级别。

    SELECT foo FROM bar WHERE baz IN (23, 34, 45, 9854004, ...)
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Roger Durham    16 年前

    别想。措施。

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

    lob的io开销,特别是对于具有字符转换的clob,可能会变得非常大;这里的补救方法是,一旦您知道最简单的方法实际上可能会对性能产生显著的影响,就可以将复制lob数据的次数降到最低。使用任何SQL参数绑定样式都可以直接在其创建或使用点与数据库之间传输数据—通常这是将LOB绑定到流或I/O通道。

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

        2
  •  1
  •   Lou Franco    16 年前

    数据库中的数字数据不存储为文本。我想这取决于数据库,但它当然不必也不必。

    blob正是按照您设置它们的方式存储的——根据定义,数据库无法解释信息——我想如果发现有用的话,它可能会压缩。blob不会转换为文本。

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

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

    内部数字格式

    Oracle数据库以可变长度格式存储数字数据。每个值以科学记数法存储,1字节用于存储指数,最多20字节用于存储尾数。结果值的精度限制在38位。Oracle数据库不存储前导零和尾随零。例如,数字412以类似于4.12x 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);
    

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