ビッグデータを読み込んでいますか?速度を上げるには、事前ソートとバルクロード
ビッグデータをロードする際の速度を上げることは、ETL、reorg、および非常に大規模なデータベース(VLDB)インデックスでの課題です。オペレーションを設定します。ビッグデータをより高速にロードする1つの方法は、ビッグデータを事前に並べ替えることです。これにより、データベースを並べ替える必要がなくなります。 IBMやその他のメインフレームデータベースプロバイダーは、何十年にもわたってそのアドバイスを提供してきましたが、Unixや、Oracle、DB2、Sybase、SQLServerなどの他の「オープンシステム」で使用されているリレーショナルデータベースにも当てはまります。
この領域のベンチマークは、ボリュームに応じて未分類の負荷よりも改善されていることを示していますが、IRIのような分類ベンダーは、負荷のパフォーマンスが2倍から10倍向上したと主張しています。 TUSCコンサルティングレポート「OracleでのOLTPロードレートとオンラインデータベースブロックサイズの再構築に対するベンチマークインデックスの影響」では、100,000行の単一インデックス挿入テストだけで、事前に並べ替えられたデータのロードが58%速く、必要なスペースが49%少ないことが示されました。
- 並べ替えられた順序での読み込みでは、持続行数/秒の読み込み率が42%低くなりました
- インデックスへの並べ替えられていない挿入により、より多くの内部データベース作業(ブロック管理とスペース再編成)が強制されます
- ロードソートされたインデックスでは、クラスタリング係数はリーフブロックの数に近くなります
- ロードされるデータの順序は、ロードのパフォーマンスにとって重要です。
数年後、彼の「エキスパートOracleデータベース11g管理」ガイドの第13章で、Sam R. Alapati(Miro Consulting)は、Oracleを一括ロードする(挿入ではなく)最速の方法として、ダイレクトパスロードと組み合わせた事前ソートを推奨しました。
「ダイレクトパスの読み込み オプションは、SQLINSERTステートメントを使用してデータをテーブルに配置しません。むしろ、Oracleデータブロックをフォーマットし、データベースファイルに直接書き込みます。この直接書き込みプロセスにより、テーブルをロードするためのSQLステートメントの実行に伴うオーバーヘッドの多くが排除されます。ダイレクトパスロード方式はデータベースリソースを競合しないため、従来のデータロードよりもはるかに高速にデータをロードします。より大きなデータロードの場合、ダイレクトパスロード方法が最適です。従来のロードでは利用可能な時間よりも時間がかかる可能性があるという単純な理由から、データをテーブルにロードする唯一の実行可能な方法である可能性があります。」
今日のVLDBの管理者にとって、これがCoSortの出番です。理由は次のとおりです。
「読み込み時間が短いという明らかな利点に加えて、直接読み込みはインデックスの再構築とテーブルデータの事前並べ替えにも役立ちます。」
CoSortは従来、「direct =true」とこのオプションを指定するロードへのインポートとなるフラットファイルの外部プレソートで使用されます:
「SORTEDINDEXES:SORTED_INDEXESパラメーターは、データが指定されたインデックスでソートされていることをSQL * Loaderに通知します。これにより、ロードパフォーマンスが向上します。」
同様に、Microsoft SQL Serverのドキュメントでは、「一括インポートを最適化する方法」の1つとしてファイルの事前並べ替えが指定されています。
デフォルトでは、一括インポート操作はデータファイルが順序付けされていないことを前提としています。テーブルにクラスター化されたインデックスがある場合、 bcp ユーティリティ、BULK INSERTステートメント、およびOPENROWSET(BULK…)関数(Transact-SQL)を使用すると、一括インポート操作中にデータファイル内のデータを並べ替える方法を指定できます。データファイル内のデータをテーブルと同じ順序で並べ替えることはオプションです。 ただし、データファイルにテーブルと同じ順序を指定すると、一括インポート操作のパフォーマンスを向上させることができます。
CoSortSortCLスクリプトの/KEYフィールドは、通常、テーブル内で最長のインデックス(主)キーですが、そうである必要はありません。 TUSCによると、同様の列の場合:
- 短いインデックスよりも長いインデックスの方が望ましい
- 先頭の列がインデックスのロードコストを押し上げる
次の点にも注意してください:
- Verticaおよびその他のRDBMSプライマーごとに、列を並べ替えられた順序で維持すると、クエリのパフォーマンスが最適化されます。 DECのデータベースのメンテナンスとパフォーマンスに関するRdb/VMSガイドの古いアドバイスでさえも当てはまります:
「データベースにロードする前に、テーブルに保存する予定のレコードを主キーの値で事前に並べ替えます。レコードがロードされると、追加のレコードがデータベースに格納されるまで、レコードは互いに物理的に隣接するか、クラスター化されます。この配置を維持すると、値の範囲に基づいて行を選択したり、1つのテーブルの多くの行を同じテーブルの行と結合したりするクエリに役立ちます。」
- テーブルでデータを事前に並べ替えることで、ビューの時間を節約することもできます。 KevinLoneyによる「OracleDatabase10g:The Complete Reference」によると:
「ビューでデータを並べ替えると、アプリケーション開発が簡素化される可能性があります。たとえば、コードが一連のレコードをステップスルーする場合、それらのレコードを事前に並べ替えると、処理とエラーチェックが簡単になる可能性があります。アプリケーション開発では、データが常に順序付けられた方法で返されることがわかります。」
- ミスターAlapatiは、直接パスの読み込みの制限についてDBAに警告します。
「注:直接読み込みでは、SQL関数を使用できません。大量のデータの読み込みと変換が必要な場合ロード中のデータに問題があります。 従来のデータロードでは、SQL関数を使用してデータを変換できますが、この方法は直接ロードに比べて非常に低速です。したがって、大規模なデータロードの場合は、外部テーブルやテーブル関数など、新しいロード/変換手法の1つを使用することを検討することをお勧めします。」
ただし、CoSortのSortCLプログラムは、事前並べ替え中に読み込みデータを変換できます。;つまり、同じタイプのSQL関数を同じジョブスクリプトとI / Oパスで組み合わせます。これには、結合、集計、相互計算、ルックアップ、選択/フィルター、サブストリングおよびインストリング関数、および多数の再フォーマットとカスタムレポートターゲットが含まれます。 —同じ事前ソート操作で。
- IRI Workbench(Eclipse GUI)の新しいオフライン再編成ユーティリティは、IRI FACT(Fast Extract)を使用してOCIを介してテーブルデータをすばやくアンロードし、CoSortを使用して主キーを事前に並べ替え、SQL*Loaderを直接書き込んで実行しますこれらの各ステップを最適化して組み合わせるためのパスロード。