ビッグデヌタを効率的にむンポヌトする方法

時には、非垞に倧きなデヌタをデヌタベヌスにむンポヌトする必芁がありたすが、これは数十ギガバむトに達するこずもありたす。 レプリケヌションず高可甚性を䜿甚する重芁なサヌビスで、定期的なバックアップ、ホットバックアップを実行したす。 ほずんどの堎合、ナヌザヌは組み蟌みのDBMS機胜に䟝存し、倉曎せずに䜿甚し、むンポヌトプロセスが完了するたで埅機したす。たた、たったく埅機しないこずもありたす。



このブログでは、 CUBRID DBMSにデヌタをむンポヌトするさたざたな方法に぀いお説明し、どちらがより効果的で、なぜかを指定したす。 これらの掚奚事項の䞀郚は、他のデヌタベヌス管理システムにも適甚できたす。



したがっお、CUBRIDでは、次のツヌルを䜿甚しおデヌタをむンポヌトできたす。



最初に、小さなテストの結果を提瀺しお、党䜓像を芋お、䞊蚘の゜リュヌションのいく぀かが他の゜リュヌションよりも速く動䜜する理由を理解できるようにしたす。 次に、デヌタのむンポヌトプロセスを倧幅に高速化するのに圹立぀掚奚事項に぀いお説明したす。



テストに぀いお



各メ゜ッドに぀いお、少量のデヌタ100,000レコヌドをテストしお、各メ゜ッドがどの方向に移動するかを理解したす。 テストは、CUBRID 8.4.0がむンストヌルされたWindows 7 x86で実行されたす。 したがっお、次を䜿甚したす。



次の構成も存圚したす。



テストスクリプト



コマンドラむンでのCSQLの実行-Sおよび-Cモヌド


CSQLは、コマンドラむンでSQLク゚リを解釈および実行するためのツヌルです。 CUBRID Managerず比范しお、 CSQLははるかに簡単で高速です。 2぀のモヌドで動䜜したす。 1぀目はオフラむンモヌドで、2぀目はクラむアントサヌバヌモヌドです 。



これらのモヌドの詳现に぀いおは、 マニュアルをご芧ください。



テストのベヌスを䜜成したす。 cubrid createdb dbtest



実行しお、コマンドラむンでこれを行うこずができたす。



次に、CSQLを䜿甚しおこのデヌタベヌスに接続し、必芁なテヌブルを䜜成する必芁がありたす。



$> csql demodb



CUBRID SQL Interpreter



Type `;help' for help messages.



csql> CREATE TABLE test1(a int, b TIMESTAMP, c int AUTO_INCREMENT)

csql> ;ru



Current transaction has been committed.



1 command(s) successfully processed.

csql> ;ex








すべおを準備したので、 dbtest.sqlファむルにあるすべおのデヌタをむンポヌトしたす。



INSERT INTO test1 VALUES (0 , SYS_TIMESTAMP, NULL);

INSERT INTO test2 VALUES (1 , SYS_TIMESTAMP, NULL);











INSERT INTO test1 VALUES (99998 , SYS_TIMESTAMP, NULL);

INSERT INTO test1 VALUES (99999 , SYS_TIMESTAMP, NULL);









CSQLをオフラむンで起動し、ファむルからすべおのデヌタを読み取るには、次のコマンドを入力したす。



$> csql -u dba -p 1111 –S -i dbtest1.sql dbtest







クラむアントサヌバヌモヌドでCSQLを起動し、ファむルからすべおのデヌタを読み取るには、次のコマンドを入力したす。



$> csql -u dba -p 1111 –C -i dbtest1.sql dbtest







PHPぞのむンポヌト


このために、デヌタベヌスずそのスキヌマに関する同じ情報を䜿甚したす。 次に、次のスクリプトを実行しお100,000゚ントリを入力したす。



  $ host_ip = "localhost";
 $ host_port = 33000;
 $ db_name = "dbtest";
 $ userId = "dba";
 $ password = "1111";

 $ cubrid_con = @cubrid_connect$ host_ip、$ host_port、$ db_name、$ userId、$ password;

 if$ cubrid_con
 {
     $ sql = "insert into"。  $ db_name。  "a、b倀、SYS_TIMESTAMP";
     $ reg = cubrid_prepare$ cubrid_con、$ sql、CUBRID_INCLUDE_OID;
    
     //ルヌプに100,000レコヌドを挿入したす。
     for$ i = 0; $ i <100000; ++ $ i
     {   
         $ res = cubrid_bind$ reg、1、$ i;
         $ res = cubrid_execute$ reg;

         // 5,000回に1回コミットしたすコミットサむクル。
         if$ i + 15000 == 0
         {   
             cubrid_commit$ cubrid_con;
             echo $ i、 "
 ";
         }
     }
 } 




CUBRID Managerぞのデヌタのむンポヌト


ここでは、CSQLテストで䜜成したのず同じファむルからデヌタをむンポヌトしたす。 デヌタのむンポヌト機胜䞋のスクリヌンショットを参照を䜿甚しお、すべおのデヌタをむンポヌトしたす。



CUBRID Managerぞのデヌタのむンポヌト



詊隓結果



次のテスト結果は秒単䜍で衚瀺されたす。

50,000゚ントリ 100,000゚ントリ 300,000゚ントリ
csql-s 5 10 29日
csql-c 111 224 599
Php 68 136 413
CM 17 33 96


    CUBRID



結論ず掚奚事項



CSQLをオフラむンで䜿甚する


䞊蚘のグラフでわかるように、CSQLオフラむンは、CUBRIDにデヌタをむンポヌトする最も速い方法です。 これは、サヌバヌプロセスをバむパスしおデヌタベヌスファむルを盎接操䜜するためです。 このモヌドでは、CSQLはサヌバヌずしお動䜜し、サヌバヌに接続されたクラむアントずしおは動䜜したせん。 したがっお、このツヌルはデヌタを最速でむンポヌトしたす。



ただし、オフラむンモヌドでCSQLを䜿甚できない堎合がありたす。このモヌドでは、耇数のナヌザヌが接続を蚱可されおいないためです。 これは、その時点でデヌタベヌスで動䜜する唯䞀のアプリケヌションがCSQLであるこずを意味したす。 そしおこれは、デヌタベヌスを切断する必芁があるこずを意味したす。 デヌタベヌスが実行されおいる堎合、別のナヌザヌホストが䜿甚しおいるこずを意味したす。 この堎合、スタンドアロンモヌドでCSQLを䜿甚しおデヌタベヌスに接続しようずするず、次の゚ラヌが発生したす。



$> csql -S demodb



ERROR: Unable to mount disk volume "C:CUBRIDdatabasesdemodbdemodb_lgat".

The database "C:CUBRIDDATABA~1demodbdemodb", to which the disk volume belongs,

is in use by user USER-PC$ on process 3096 of host user-PC since Thu Sep 22 11:04:01 2011.








このような堎合、デヌタベヌスを完党に無効にしお他のナヌザヌがデヌタベヌスに接続されおいないこずを確認するか、デヌタをむンポヌトする他の方法を䜿甚する必芁がありたす。 コマンドラむンでデヌタベヌスを無効にするには、 cubrid server stop dbtest1



たす。



デヌタをむンポヌトした埌、任意の制玄を䜜成したす


これは、倧量のデヌタをむンポヌトする予定の開発者にずっお最も重芁な掚奚事項の1぀です。



すべおのデヌタのむンポヌトが完了するたで 、むンデックスを䜜成しないでください 。 これは、 INDEX



通垞のむンデックス、 UNIQUE



䞀意のむンデックス、 REVERSE INDEX



逆のむンデックス、 REVERSE UNIQUE



逆の䞀意のむンデックス、さらにはPRIMARY KEY



䞻キヌが自動的に通垞のむンデックスを䜜成したすなどのむンデックスに適甚されたす。



そうしないず、むンポヌトプロセス䞭の各デヌタ゚ントリ INSERT



に必須のむンデックスが必芁になり、合蚈むンポヌト時間が長くなりたす。 したがっお、次の指瀺に埓っおください。

  1. テヌブルを䜜成したす。
  2. 必芁なすべおの列を远加し、それらのデヌタ型を瀺したすが 、制限、 䞻キヌさえも指定しないでください 。
  3. すべおのデヌタをむンポヌトしたす。
  4. そしお、必芁なすべおのむンデックスず䞻キヌを䜜成したす。


むンポヌト䞭にログをオフにする


CUBRIDには2皮類のロギングがありたす。



クラむアント偎のログ


クラむアント偎のロギングは、 CUBRID Brokerの SQL_LOG



パラメヌタヌを参照したす。 デフォルト倀はSQL_LOG = ON



です。



クラむアント偎でロギングが有効になっおいる堎合、CASCUBRID Application Serverによっお凊理される各SQLステヌトメントはDBMSログに保存されたす。 したがっお、これにより合蚈むンポヌト時間が長くなりたす。 したがっお、むンポヌトプロセス党䜓のログが必芁ない堎合たずえば、高可甚性モヌドで、むンポヌトが完了するたでしばらくログを無効にしたす。



ロギングをオフにする方法はいく぀かありたす。 以䞋に、CUBRID Managerずコマンドラむンでこれを行う方法を瀺したす。



CMの䟋



ロギングを無効にするには SQL_LOG = OFF



、ブロヌカヌを右クリックしお[ プロパティ ]を遞択したす 。



 Broker



モヌダルりィンドりで、 SQL_LOG



パラメヌタの倀をOFFずしお指定したす。 次に、[ OK ]をクリックしお倉曎を保存したす。







最終的に倉曎を適甚するには、ブロヌカヌを再起動する必芁がありたす。 たた、ブロヌカヌを右クリックし、ブロヌカヌを遞択しお無効にし、 ブロヌカヌをオンにしおブロヌカヌを開始したす。 これでむンポヌトを開始できたす。



コマンドラむンの䟋



テキスト゚ディタヌで、CUBRIDをむンストヌルしたconfディレクトリにあるブロヌカヌの構成ファむルであるcubrid_broker.confを開きたす。 このファむルでは、 SQL_LOG



を含むすべおのブロヌカヌパラメヌタヌの倀を倉曎できたす。 以䞋のコヌドスニペットを参照しおください。



[broker]

...

SQL_LOG =OFF

...








次に、 cubrid broker restart



コマンドを䜿甚しお、コマンドラむンでcubrid broker restart



たす。



サヌバヌ偎のログ


サヌバヌ偎のログ蚘録は、CUBRIDサヌバヌ自䜓のmedia_failure_supportパラメヌタヌを参照したす。これは、ストレヌゞデバむスに障害が発生した堎合にアヌカむブログを保存する必芁性を刀断したす。 このパラメヌタヌの倀がyes デフォルト倀の堎合、アクティブログがいっぱいになり、トランザクションがただアクティブであるずきに、すべおのアクティブログがアヌカむブログにコピヌされたす。 media_failure_support = noの堎合、アクティブログがいっぱいになった埌に䜜成されたすべおのアヌカむブログは自動的に削陀されたす。 このパラメヌタヌの倀がnoに倉曎された堎合、アヌカむブログはすぐに削陀されるこずを眮き換える必芁がありたす。



したがっお、 media_failure_support = noの倀を蚭定するず、デヌタをむンポヌトする合蚈時間を短瞮できたす。 このパラメヌタヌを倉曎するには、ホストを右クリックしお、そのプロパティを遞択したす。



   CUBRID



モヌダルりィンドりで、パラメヌタmedia_failure_support



倀をnoに指定したす。 次に、[ OK ]をクリックしお倉曎を保存したす。



 CUBRID



すべおの倉曎を適甚するには、サヌバヌを再起動したす。



スレッドずトランザクションコミットの数を指定する


CUBRID Managerず連携しおデヌタをむンポヌトする堎合は、スレッドの数ず1回のコミットでのトランザクションの数を必ず指定しおください。



スレッドにより、CMは耇数の同時接続を䜿甚しおINSERT芁求を実行できたす。 スレッドの数を決定するには、 スレッド数でそれらの数を指定したす 。 ただし、倚すぎるず良いこずにはならないこずも芚えおおく必芁がありたす。 それはすべおあなたのアむロンの胜力に䟝存したす。 通垞、5〜10スレッドを掚奚したす。



   CUBRID Manager



たた、むンポヌト時間は、1回のコミット コミットサむクル のトランザクション数に䟝存したす。 この倀は、入力されたデヌタをキャプチャする頻床を決定したす。 トランザクションを頻繁にコミットするず、パフォヌマンスが䜎䞋したす。 ただし、䞀方で、たれなコミットでは倧量のRAMが必芁になる堎合がありたす。 したがっお、再び、それは鉄の構成に䟝存したす。



data_buffer_sizeを䜿甚


data_buffer_sizeは、CUBRIDサヌバヌ党䜓の動䜜を最適化する重芁なパラメヌタヌの1぀です。 サヌバヌのCUBRIDキャッシュに保存する必芁があるデヌタのペヌゞのサむズを決定したす。 data_buffer_sizeの倀が高いほど、より倚くのデヌタペヌゞをサヌバヌバッファヌに栌玍できるため、I / O操䜜の数を倧幅に削枛できたす。これは䞀般にパフォヌマンスを意味したす。



ただし、このパラメヌタヌの倀が倧きすぎるず、十分なメモリがないためにオペレヌティングシステムずサヌバヌ間でバッファプヌルをスワップでき、スワップディスクが䜜成されない堎合は、デヌタベヌスサヌバヌではなく、デヌタベヌス自䜓に泚意単に十分なメモリがないため、起動したせん。 そのため、鉄の物理的ポテンシャルに基づいお、 data_buffer_sizeパラメヌタヌの倀をシステムメモリのサむズの玄2/3に調敎するこずをお勧めしたす。 デフォルトでは、 data_buffer_size = 512M メガバむト。



insert_execution_modeを䜿甚したす


insert_execution_modeは、クラむアント偎ではなくサヌバヌ偎でINSERT芁求を実行できる非垞に䟿利なパラメヌタヌです。 これは、クラむアント偎で䜿甚可胜なメモリが非垞に少ない堎合、たたは定期的なバックアップ甚のデヌタを入力する前にダヌティリヌドが必芁な堎合に䟿利です。



このパラメヌタヌは7぀の倀を取るこずができたす詳现に぀いおは、 デヌタベヌスサヌバヌパラメヌタヌを参照しおください。 デフォルト倀はinsert_execution_mode = 1です 。これは、フォヌムのすべおのINSERT INTO ... SELECT ...ク゚リがサヌバヌ偎で起動されるこずを意味したす。 デヌタのむンポヌト時にこのク゚リ構造を䜿甚しないため、倀を2に倉曎する必芁がありたす。これにより、サヌバヌ偎でINSERT INTO ... VALUES ...の圢匏ですべおのク゚リを実行できたす䞋図を参照。



 insert_execution_mode  CUBRID



したがっお、党䜓的なむンポヌト時間を短瞮し、CUBRIDサヌバヌのパフォヌマンスを向䞊させるには、次のヒントに埓っおください。



私は䜕かを芋逃したしたか あなたの経隓ずデヌタをむンポヌトする頻床に぀いおのコメントを曞いおください。



All Articles