Import

使用 SyBase 將數據從數據庫導入和導出到另一個需要很長時間

  • June 3, 2016

為了更新數據庫(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 是否支持 usingWHERE NOT EXISTS子句而不是WHERE NOT IN; 如果可行,該NOT EXISTS變體可能會更快。

引用自:https://dba.stackexchange.com/questions/140218