如何为Oracle,Informix和&amp ;;生成2TB +大小的数据SYBASE

时间:2009-07-16 04:24:28

标签: database oracle sybase informix

我是Informix的新手,作为测试活动的一部分,我需要为Oracle,Informix& amp;创建2TB +大小的数据。 SYBASE。是否存在数据库中立的方式?

我正在寻找任何免费软件或开源工具;我可以为Oracle找到一些但几乎没有任何Informix&的Sybase。

6 个答案:

答案 0 :(得分:2)

  1. 你必须决定重复性 数据可以。
  2. 加载你的 任何表中的不同数据 需要的。
  3. 增加数据     以

    指数增长

    INSERT INTO my_table SELECT * FROM my_table;

  4. 如果您需要唯一的主键字段,请将相关插入中的序列替换为Oracle以及其他DB的等效项。

    如果您的硬件无法处理100G +数据加倍的负载,请以较小批量处理。使用WHERE rownum< 100000 ...对于Oracle以及其他DB的等价物。

答案 1 :(得分:2)

以这种方式跨多个数据库工作是一项非常重要的任务。坦率地说,2TB正处于这些产品可实现的最高端(除非您使用的是Sybase IQ - 您没有提及)。如果您正在使用此数据进行数据仓库或报告,那么您可能需要重新考虑产品选择。

{如果您解释为什么要加载2TB的测试数据,那么给您提供建议会更容易。另外,为什么这些数据库?适用于在Oracle中加载的“技巧”对于Sybase来说是不同的。无论如何,这是我的通用建议......}

首先,检查您的DDL并完全删除所有约束和自动递增值。当您进行任何类型的插入时,DB会花费大量的CPU和IO周期来检查这些值,因此请删除它们。如有必要,无论如何都会更快地重新应用它们。

其次,为最终表中要包含的每列生成1列表。例如,如果这是一个地址表,您可能有:

First_Name, Last_Name, Address_1, etc.

使用您在实际数据中预期的一小部分样本填充每个表,例如每个表10行。

现在为了魔术:你将所有这些1列表交叉加入到笛卡尔积中。这将为您的1列表的每个可能组合提供1行,从而将它们“膨胀”到您需要的大小。

示例查询:(语法可能因db而异)

SELECT *
  FROM      First_Name 
 CROSS JOIN Last_Name 
 CROSS JOIN Address_1 
       …
 CROSS JOIN Post_Code

您可以通过将行数相乘来计算生成的数据量。

    10 tables w/ 10 rows 
  = 10^10 
  = 10,000,000,000 
  = 10 billion rows

然后,您的多个行数按平均行大小计算,以获得总数据量,不包括数据库开销。

    (128 byte rows * 10 billion rows) / 1024^4 (Terabyte)
   = 1.164 Terabytes of sample data.

轻松的方式

从Quest下载Benchmark Factory的试用版。这将允许您将几个不同的基准数据集推送到您的数据库并运行它们。如果你想继续使用它不便宜。

答案 2 :(得分:1)

我已经使用一些简单的Python,Perl或Ruby脚本多次完成此类操作,以生成SQL语句或某些特定于数据库的工具可以导入的CSV样式文件。

虽然有两个太字节。您可能希望分批进行。

答案 3 :(得分:1)

您将面临许多问题。可能最大的是不同的DBMS都有不同的首选加载格式 - 因此任何单一数据格式都需要一些或多个DBMS的体操 - 除非你直接生成INSERT语句。

Informix更喜欢一种格式,可以松散地表征为“带有反斜杠的分隔字段,用作转义和(未转义)换行符,表示记录结束”。默认分隔符是管道符号“|”,但可以更改为适合。例如:

100|Some string|2008-09-12|23.145|wc -l \| sort -n|76:34:45.219

幸运的是,日期格式相当灵活。如果您需要可怕的详细信息,请从IIUG源代码存档下载SQLCMD的源代码(不是Microsoft usurper - 原始的),并阅读文件unload.format。在Informix中加载CSV数据并不是一件容易的事 - 虽然我有一个名为csv2unl的Perl脚本,可以在很大程度上自动将CSV转换为Informix UNLOAD格式(也应该在IIUG网站上提供)。

正如@ St3fan建议的那样,任何主要的脚本语言都可以用来生成数据。我使用的是Perl,但这主要是因为我很久以前就学会了Perl,因此我最熟悉它。

要考虑的另一个问题是您是为单个表(或一组不相关的表)还是为一组相关表生成数据。例如,为单个表生成数据相对容易;为共享一个公共字段的两个表生成数据要困难得多(例如,Orders表和OrderItems表)。

即便如此,2 TB也是一项中等程度的艰巨任务。即使每行为1 KB,您也需要生成大约20亿行数据。您需要以块的形式加载数据 - 而不是在单个事务中加载所有数据。您可能希望在加载后创建索引 - 但这会给您带来责任,以确保表中的数据有效(没有不适当的重复项)。如果您使用SERIAL列(Informix代表自动生成的值),您可能需要使用BIGSERIAL(或者SERIAL8 - 它取决于您使用的Informix的版本,但它应该是IDS 11.50,在这种情况下BIGSERIAL是更好的选择。)


@dotIN询问时间......加载多长时间?

让我们回顾一下基础知识......写入磁盘的写入率是多少? 100 MB / s持续?让我们用它作为起点。

在100 MB / s的写入数据时,它将采取:

2,000,000 MB / 100 MB/s = 20,000 s

大约6个小时。

我认为这是一个非常高的比率;此外,您必须将数据提供给DBMS(因此您必须以相应于100 MB / s的速率执行语句),此外您还必须担心活动的数据库日志记录,依此类推。如果负载可以有效地分布在多个磁盘上,您可能能够接近它。但是,很容易受I / O限制,特别是如果您的机器没有多个可单独寻址的磁盘驱动器(例如,单个多TB的RAID驱动器,具有单个I / O通道)。

如果通过单独的INSERT语句加载每一行,则必须每秒执行大量语句。这是另一个性能抑制剂。你没有确切地说明你是如何进行加载的,但是当处理大量数据时,你必须非常小心,并且需要技巧和经验才能从任何一个DBMS中获得最大的性能 - 更不用说所有这些了。请注意,当您不再需要加载而是提取信息时,加速数TB数据负载性能的配置并不一定能带来良好的性能。

并且提到了斑点;那些有特殊限制,需要在每个系统上仔细处理,并且通常使故事复杂化。 (例如,在IDS中,您需要一个单独的Smart BlobSpace用于智能blob - BLOB或CLOB类型 - 来自存储数据的DBSpace。如果您使用的是老式的BYTE或TEXT blob,您可能想要使用一个合适的BlobSpace - 与Smart BlobSpace不同 - 页面大小配置为适合您存储的数据。您可能不希望在表中存储BYTE或TEXT blob - 它可以工作,但它会破坏日志记录系统这就是为什么BlobSpaces首先作为选项提供的原因。)

答案 4 :(得分:-1)

对于任何允许数据库访问的编程语言,这都不是问题。

答案 5 :(得分:-1)

我有一个2TB +(nrows = 10M,rowsize = 2048)ascii测试文件(带管道分隔符),它具有唯一的:全名,地址,电话号码和各种其他数据类型,如DATE,SMALLINT,DECIMAL(9, 2)等用于测试/基准测试目的。

问题是。我怎么能得到它?