Import
使用 SyBase 將數據從數據庫導入和導出到另一個需要很長時間
為了更新數據庫(Sybase Adaptive Server Anywhere 8),我從客戶端電腦上的一個數據庫中獲取所有數據並使用
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;
所以我想知道是否有更好的方法來做到這一點,因為兩個表需要很長時間來導出和導入數據(儘管它們確實有大量的列和數據,但仍然有大量的數據,我的意思是 ~100列和價值約 100,000 行)。這特別奇怪,因為另一個具有相似數據量的表很快就過去了(儘管它的列確實更少)。需要一段時間的兩個表每秒讀取數據約 1000 個,而其他表則要快得多。
每個客戶的筆記型電腦上都有 database.db 文件。他們獲得了一些數據並需要送出但沒有連接,因此他們使用自己的 .db 文件並稍後在伺服器上更新該文件。
獲取 SQL 定義可能很困難,因為表是不久前製作的,我不知道如何獲取它們。目標數據庫是保存所有數據的數據庫,而源數據庫是未連接的數據庫,如果需要可以離線使用。
一些建議,提示將不勝感激。
在沒有過多涉及在 Sybase SQL Anywhere 8 中執行此操作所需的語言的具體細節(現已超過 15 年)的情況下,我建議如下內容:
- 在筆記型電腦數據庫上創建一個表,其中包含一個唯一標識已導出到主數據庫的行的列。
- 導出功能將執行以下操作:
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 是否支持 using
WHERE NOT EXISTS
子句而不是WHERE NOT IN
; 如果可行,該NOT EXISTS
變體可能會更快。