私は Informix を初めて使用し、テスト活動の一環として、Oracle、Informix、および Sybase 用に 2TB 以上のサイズのデータを作成する必要があります。これを行うデータベース中立の方法はありますか?
フリーウェアやオープンソースのツールも探しています。Oracle の場合はいくつか見つかりますが、Informix と Sybase の場合はほとんどありません。
このように複数のデータベースで作業することは、簡単な作業ではありません。率直に言って、2TBは、これらの製品で達成可能なことの最上位にあります(Sybase IQを使用している場合を除きます-言及していません)。このデータからデータウェアハウジングまたはレポートを作成している場合は、製品の選択を再検討することをお勧めします。
{ 2TBのテストデータをロードする理由を説明すると、アドバイスを提供しやすくなります。また、なぜこれらのデータベースなのか?Oracleでのロードに機能する「トリック」は、Sybaseでは異なります。とにかくここに私の一般的なアドバイスがあります…}
まず、DDLを確認し、すべての制約と自動インクリメント値を完全に削除します。DBは、あらゆる種類の挿入を行うときにこれらの値をチェックするために多くのCPUおよびIOサイクルを費やすため、それらを取り除きます。必要に応じて、後でそれらを再適用する方が速くなります。
次に、最終テーブルに含める列ごとに1列のテーブルを生成します。たとえば、これがアドレステーブルの場合、次のようになります。
First_Name, Last_Name, Address_1, etc.
この各テーブルに、実際のデータで期待する値の小さなサンプル、たとえばテーブルごとに10行を入力します。
さて、魔法のように、これらの1列のテーブルすべてをデカルト積に相互結合します。これにより、1列のテーブルの可能な組み合わせごとに1行が提供されるため、必要なサイズに「膨らませる」ことができます。
クエリの例:(構文はデータベースごとに異なる場合があります)
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
次に、複数の行を平均行サイズでカウントして、dbオーバーヘッドを除く合計データボリュームを取得します。
(128 byte rows * 10 billion rows) / 1024^4 (Terabyte)
= 1.164 Terabytes of sample data.
QuestからBenchmarkFactoryの試用版をダウンロードします。これにより、いくつかの異なるベンチマークデータセットをデータベースにプッシュして実行できるようになります。使い続けたいのなら安くはありません。
そのデータを指数関数的に増やします
INSERT INTO my_table SELECT * FROM my_table;
一意の主キー フィールドが必要な場合は、それらを Oracle の関連する挿入のシーケンスに置き換え、他の DB に相当するものは何でも置き換えます。
ハードウェアが 2 倍の 100G 以上のデータの負荷を処理できない場合は、小さなバッチで処理してください。Oracle には WHERE rownum < 100000... を使用し、他の DB には同等のものを使用します。
私は単純な Python、Perl、または Ruby スクリプトを使用して、SQL ステートメントまたはデータベース固有のツールがインポートできる CSV スタイル ファイルを生成するために、この種のことを何度も行ってきました。
ただし、2 テラバイトは大きいです。バッチで実行したい場合があります。
あなたが直面する問題はたくさんあります。おそらく最大の問題は、異なる DBMS はすべて異なる優先ロード フォーマットを持っているということです。そのため、INSERT ステートメントを直接生成しない限り、単一のデータ フォーマットは 1 つまたは複数の DBMS に対してある程度の工夫が必要になります。
Informix では、「エスケープとして使用されるバックスラッシュと、レコードの終わりを示す (エスケープされていない) 改行で区切られたフィールド」として大まかに特徴付けることができる形式を好みます。デフォルトの区切り文字はパイプ記号 ' |
' ですが、これは適宜変更できます。例えば:
100|Some string|2008-09-12|23.145|wc -l \| sort -n|76:34:45.219
幸いなことに、日付形式はかなり柔軟です。恐ろしい詳細が必要な場合は、 IIUGソース コード アーカイブから SQLCMD のソース コード (Microsoft の奪取者ではなく、オリジナルのもの) をダウンロードし、ファイルを読んでくださいunload.format
。CSV データのロードは、Informix では簡単なことではありませんが、csv2unl
CSV から Informix UNLOAD 形式への変換を大幅に自動化する Perl スクリプトを呼び出しています (IIUG Web サイトでも入手できるはずです)。
@St3fan が示唆したように、主要なスクリプト言語のいずれかを使用してデータを生成できます。私は Perl を使用しますが、それは主に、私がずっと前に Perl を学んだので、Perl に最も慣れているからです。
考慮すべきもう 1 つの問題は、単一のテーブル (または関連のないテーブルのセット) のデータを生成するのか、関連するテーブルのセットのデータを生成するのかということです。たとえば、1 つのテーブルのデータを生成するのは比較的簡単です。共通のフィールドを共有する 2 つのテーブル (Orders テーブルと OrderItems テーブルなど) のデータを生成するのは非常に困難です。
それでも、2 TB はやや困難な作業です。各行が 1 KB であっても、約 20 億行のデータを生成する必要があります。単一のトランザクションですべてではなく、チャンクでデータをロードする必要があります。おそらく、ロード後にインデックスを作成する必要がありますが、その場合、テーブル内のデータが有効であること (不適切な重複がないこと) を確認する責任が生じます。SERIAL 列 (Informix では自動生成された値を表す) を使用している場合は、おそらく BIGSERIAL (またはおそらく SERIAL8 - 使用している Informix のバージョンによって異なりますが、IDS 11.50 である必要があります) を使用する必要があります。 BIGSERIAL の方が適しています)。
@dotIN はタイミングについて尋ねます...ロードするのにどれくらいかかりますか?
いくつかの基本事項を確認してみましょう...ディスクへの適切な書き込み速度とは? 100MB/秒持続?出発点として使用しましょう。
データの書き込み速度が 100 MB/秒の場合、次のようになります。
2,000,000 MB / 100 MB/s = 20,000 s
これは約6時間です。
これは非常に高い率だと思います。さらに、データを DBMS に取得する必要があり (したがって、ステートメントを 100 MB/秒に相当する速度で実行する必要があります)、アクティビティのデータベース ロギングなどについて心配する必要があります。負荷を複数のディスクに効果的に分散できれば、それに近づくことができるかもしれません。ただし、マシンに複数の個別にアドレス指定可能なディスク ドライブ (たとえば、単一の I/O チャネルを備えた単一のマルチテラバイト RAID ドライブ) がない場合は特に、I/O バウンドは非常に簡単です。
各行が個別の INSERT ステートメントを介してロードされる場合、1 秒間に膨大な数のステートメントを実行する必要があります。それは別のパフォーマンス阻害要因です。ロードをどのように行っているかを正確に述べていませんが、膨大な量を処理する場合は細心の注意を払う必要があり、DBMS のいずれかから最高のパフォーマンスを引き出すにはスキルと経験が必要です。 . また、テラバイト単位のデータの読み込みパフォーマンスを高速化する構成は、読み込みではなく情報を抽出しようとしている場合、必ずしも優れたパフォーマンスにつながるとは限らないことに注意してください。
そして、ブロブについての言及があります。これらには特別な制約があり、各システムで慎重に処理する必要があり、一般的に話が複雑になります。(たとえば、IDS では、スマート BLOB (BLOB または CLOB タイプ) 用に、データを格納する DBSpace とは別の Smart BlobSpace が必要になります。旧式の BYTE または TEXT BLOB を使用している場合は、おそらく使用したいでしょう。適切な BlobSpace - スマート BlobSpace とは異なり - 格納するデータに合わせてページ サイズが構成されている. おそらく BYTE または TEXT BLOB を TABLE に格納したくないでしょう - それは機能しますが、ロギング システムに打撃を与えます. 、これがそもそも BlobSpaces がオプションとして利用できる理由です)。
フルネーム、住所、電話番号、DATE、SMALLINT、DECIMAL (9,2) などのさまざまなデータ型を含む 2TB 以上 (nrows=10M、rowsize=2048) の ascii テスト ファイル (パイプ区切り記号付き) があります。テスト/ベンチマーク目的など。
問題は. どのように私はあなたにそれを得ることができますか?
これは、データベース アクセスを許可するプログラミング言語では問題になりません。