データベースを更新するために(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定義を取得するのは困難な場合があり、それらを取得する方法はわかりません。宛先データベースはすべてのデータを保持するデータベースですが、ソースデータベースは接続されておらず、必要に応じてオフラインで使用できるデータベースです。
いくつかの推奨事項、ヒントをいただければ幸いです。
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
バリアント可能性があります機能する場合、より高速になります。