web-dev-qa-db-ja.com

SyBaseを使用してデータベースから別のデータベースにデータをインポートおよびエクスポートするのに時間がかかる

データベースを更新するために(Sybase Adaptive Server Anywhere 8)クライアントコンピューター上の1つのデータベースからすべてのデータを取得して使用しています

SELECT * FROM tabelName OUTPUT TO 'C:\path' FORMAT ASCII DELIMITED BY ';';

次に、これらのファイルを使用して、一時テーブルを作成し、不足しているものがないか確認して一時テーブルを削除することで、サーバーに接続されている別のデータベースを更新します。

INPUT INTO tempTable FROM 'C:\path' FORMAT ASCII DELIMITED BY ';';

INSERT INTO mainTable 
SELECT * 
FROM tempTable 
WHERE id NOT IN (SELECT id FROM mainTable);

DROP TABLE tempTable;

したがって、2つのテーブルがデータのエクスポートとインポートに非常に長い時間を費やしているので、これを行うためのより良い方法があるかどうか疑問に思っています(ただし、列とデータは大量にありますが、それでも大量のデータは約100です)列と最大100,000の行)。同様の量のデータを含む別のテーブルが非常に速く通過するため(列は少なくなりますが)、これは特に奇妙です。しばらく時間がかかっている2つのテーブルは、1秒あたり最大1000件のデータを読み取っていますが、他のテーブルははるかに高速です。

各クライアントのラップトップには、database.dbファイルがあります。一部のデータを取得して送信する必要がありますが、接続がありません。そのため、独自の.dbファイルを使用し、後でサーバー上のファイルを更新します。

テーブルはしばらく前に作成されたため、SQL定義を取得するのは困難な場合があり、それらを取得する方法はわかりません。宛先データベースはすべてのデータを保持するデータベースですが、ソースデータベースは接続されておらず、必要に応じてオフラインで使用できるデータベースです。

いくつかの推奨事項、ヒントをいただければ幸いです。

3
Tsort

15年以上前のSybase SQL Anywhere 8でこれを行うために必要な言語の具体的な詳細にあまり関与せずに、次のようなものをお勧めします。

  • メインデータベースに既にエクスポートされている行を一意に識別する列を含むラップトップデータベースにテーブルを作成します。
  • エクスポート関数は次のようなことをします:

    SELECT * 
    FROM tableName 
    WHERE tableName.KeyColumn NOT IN (
        SELECT KeyColumn 
        FROM PreviouslyExportedTable
        ) 
    OUTPUT TO 'C:\path' FORMAT ASCII DELIMITED BY ';';
    
  • 次に、エクスポーターはPreviouslyExportedTableにまだ存在しない行を挿入します。次にエクスポーターを実行すると、まだエクスポートされていない新しい行のみがエクスポートされます。挿入コードは次のようになります。

    INSERT INTO PreviouslyExportedTable
    SELECT KeyColumn
    FROM TableName
    WHERE KeyColumn NOT IN (
        SELECT KeyColumn 
        FROM PreviouslyExportedTable
        );
    

これにより、毎回エクスポートおよびインポートする必要のある行数が大幅に削減されます。 SQL Anywhere 8がWHERE NOT EXISTSの代わりにWHERE NOT IN句の使用をサポートしているかどうかは不明です。 NOT EXISTSバリアント可能性があります機能する場合、より高速になります。

5
Max Vernon