【问题标题】:Storing Array of Floats as a BLOB in Oracle在 Oracle 中将浮点数组存储为 BLOB
【发布时间】:2010-11-06 19:27:17
【问题描述】:

我正在设计一个新的实验室数据库。对于某些测试,我有几个波形,同时采集了大约 10,000 个数据点。在应用程序(用 C 语言编写)中,波形存储为浮点数组。

我相信我想将每个波形存储为 BLOB。

问题:

BLOB 中的数据能否以 Oracle 仅使用 SQL 或 PL/SQL 处理数据本身的方式进行结构化?

  • 确定最大值、最小值、平均值等
  • 当值首次超过 500 时检索索引
  • 检索第 400 个号码
  • 创建作为第一个 BLOB 的派生的 BLOB

注意:此消息是Storing Waveforms in Oracle 的子问题。

【问题讨论】:

    标签: database oracle database-design blob


    【解决方案1】:
    • 确定最大值、最小值、平均值等
    • 当值优先时检索索引 超过 500
    • 检索第 400 个号码

    关系数据模型是为这种分析而设计的——如果您正确地对数据建模,Oracle 的 SQL 完全可以做到这一点。我建议您专注于将浮点数数组转换为数字表 - 我怀疑您会发现在 SQL 中执行此类查询的速度可以弥补所花费的时间。

    另一种方法是尝试编写无论如何都会在运行时有效地执行此转换的 SQL - 每次运行 SQL 时;这可能效率会低得多。

    【讨论】:

      【解决方案2】:

      您可能还希望考虑 VARRAY 类型。您确实必须使用整个数组(不检索子集、部分更新等),但您可以定义最大长度,Oracle 将只存储您使用的内容。您可以声明几乎任何数据类型的 VARRAY,包括 BINARY_FLOAT 或 NUMBER。 BINARY_FLOAT 将最小化您的存储,但会遇到一些小的精度问题(尽管在金融应用程序中很重要)。它采用 IEEE 754 格式。

      由于您打算使用 PL/SQL 操作数据,我可能会放弃 BLOB 设计。 VARRAY 使用起来会更方便。 BLOB 可以非常方便地存储原始 C 浮点数组,以供以后在另一个 C 程序中使用。

      请参阅PL/SQL Users Guide and Reference 了解如何使用它们。

      【讨论】:

      • ... 所以 BLOB 有点像 C 中指向已分配内存的 void 指针。 ... 而 VARRAY 更像是 C 中的类型化数组,除了您只能在之后访问单个元素您从数据库条目中检索整个 VARRAY。这些说法正确吗?
      • 没错。 BLOB 只是二进制数据,可以解释。可以是图像、浮点数数组、Word 文档等。如果您使用它们,请准备好滚动您自己的转换例程(例如,Java 函数/过程)。就个人而言,我认为 VARRAY 更适合您描述的情况。
      【解决方案3】:

      我认为您可能可以创建将 blob 作为参数并返回有关它的信息的 PL/SQL 函数。

      如果字段可以使用XMLType,那么你肯定可以在PL/SQL中解析并编写你想要的函数。

      http://www.filibeto.org/sun/lib/nonsun/oracle/11.1.0.6.0/B28359_01/appdev.111/b28369/xdb10pls.htm

      当然,XML 会慢很多,但如果不能解析二进制数据,那是一种替代方案。

      【讨论】:

      猜你喜欢
      • 2012-01-14
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      相关资源
      最近更新 更多