0

假设我有一个自定义文件格式,可以类似于 N 个表。让我们选择 3。我可以转换文件,编写自定义加载包装器来填充 3 个数据库表。

但是假设空间和资源限制,我不能将所有这些都存储在表空间中。

我可以使用 Oracle Preprocessor for External Tables 以三种不同的方式转换自定义文件吗?

我读过的使用示例为 gzip 文本文件提供了一个示例。但这是一对一的文件到表的关系,只有一次转换。

我有一个文件,其中包含 N 种可能的数据提取。

  • 我是否需要定义 N 个外部表,每个表都引用不同的程序?
  • 如果我将三个表映射到同一个文件,这将如何影响性能?(访问主要是或全部读取,很少或没有写入)。

另外,我的预处理器的标准输出必须是什么格式?必须是 CSV,还是有办法配置外部表驱动程序?

4

1 回答 1

0

“如果我将三个表映射到同一个文件,这将如何影响性能?(访问主要是或全部读取,很少或没有写入”

通过一个外部表定义或三个外部表定义访问同一文件的三个会话之间应该几乎没有区别。数据库不缓存外部表(可能是文件系统或磁盘),因此任何访问都是纯粹的物理读取。根据预处理程序的不同,那里可能存在某种程度的序列化(或者您可以使用预处理程序来强制进行序列化)。

在性能方面,您最好让单个会话扫描外部文件/表并将其加载到一个或多个数据库表中。其他会话从那里读取它并缓存在 SGA 中。此外,您可以为数据库表编制索引,这样您就不必全部阅读。

您可以使用多表插入从单个外部表定义中一次加载多个数据库表。

“我的预处理器的标准输出必须是什么格式?必须是CSV,还是有办法配置外部表驱动程序?”

它几乎遵循 SQL*Loader,两者都在Utilities 手册中。您可以使用固定格式或其他分隔符。

我是否需要定义 N 个外部表,每个表都引用不同的程序?

取决于数据的交错方式。忽略预处理器,您可以让不同的外部表从同一个文件中提取不同的列,或者使用LOAD WHEN子句来确定要包含或排除哪些记录。

于 2009-08-18T01:58:09.207 回答