2009-10-05 63 views
0

我有一個將40個以上相同結構的數據庫合併到一個統一數據庫的過程,唯一的區別是統一數據庫向每個表添加了一個project_id字段。獲取2個幾乎相同的表之間的記錄差異

爲了儘可能地提高效率,我試着只將源數據庫中的記錄複製/更新到統一數據庫,如果它已被添加/更改。我從統一數據庫中刪除過期的記錄,然後複製任何不存在的記錄。要刪除過時的/更改的記錄,我用類似這樣的查詢:

DELETE FROM <table> 
WHERE NOT EXISTS (SELECT <primary keys> 
        FROM <source> b 
        WHERE ((<b.fields = a.fields>) or 
          (b.fields is null and a.fields is null))) 
    AND PROJECT_ID = <project_id> 

這適用於大多數情況,但在源數據庫中的一個表有超過70萬的記錄,此查詢接管的小時完成。

如何使此查詢更有效?

+0

你有一個索引*字段*? – 2009-10-05 18:46:49

回答

2

使用時間戳或更好的審計表來識別自時間「X」以來更改的記錄,然後在上次同步開始時保存時間「X」。我們將它用於接口提要。

+0

這些東西是你添加到數據庫/表中的嗎? IE:爲每個表添加last_updated字段,併爲每個數據庫添加一個audit_table?不幸的是,我無法修改源數據庫的模式,因爲它們來自供應商產品。 – aasukisuki 2009-10-05 18:49:16

+0

你可以添加一個審計表嗎? – DVK 2009-10-05 18:59:07

+0

從技術上講,我可以爲每個表添加審計表或字段以用作時間戳,但供應商進程決不會向審計表添加任何內容,或者在更改時填充時間戳字段。 – aasukisuki 2009-10-05 19:24:49

0

你可能想嘗試LEFT JOIN與空濾器:

DELETE  <table> 
FROM  <table> t 
LEFT JOIN <source> b 
     ON (t.Field1 = b.Field1 OR (t.Field1 IS NULL AND b.Field1 IS NULL)) 
     AND(t.Field2 = b.Field2 OR (t.Field2 IS NULL AND b.Field2 IS NULL)) 
     --//... 
WHERE  t.PROJECT_ID = <project_id> 
     AND b.PrimaryKey IS NULL --// any of the PK fields will do, but I really hope you do not use composite PKs 

但如果你是比較所有非PK列,那麼您的查詢是要受到影響。

在這種情況下,最好在兩個數據庫中添加一個UpdatedAt TIMESTAMP字段(如DVK建議),您可以使用AFTER UPDATE觸發器更新,那麼同步過程會更快,因爲您創建了一個索引PKs和UpdatedAt列。

0

您可以重新排列WHERE語句;它有四個比較,把最有可能首先失敗的比較。

如果您可以稍微改變數據庫/應用程序,並且需要再次執行此操作,則說明「已更新」的位字段可能不是一個不好的附加項。

0

我通常會重寫像這樣的查詢以避免不... Not In對於性能來說太糟糕了,儘管Not Exists在這方面有所改進。

看看這篇文章,http://www.sql-server-pro.com/sql-where-clause-optimization.html

我的建議......

選擇你的p鍵列到工作/臨時表,添加一列(標誌)整數默認0不爲空,且指數pkey列。如果記錄存在於子查詢中,則標記標誌= 1(更快!)。 取代你的主查詢中的子選擇與存在的地方(選擇pkey from temptable where flag = 0)

這是什麼工作能夠創建一個'不存在'值的列表,可以包含性地使用從一個全包的集合。

這是我們的總套數。 {1,2,3,4,5}

下面是現有的一套 {1,3,4}

我們從這些兩套創建我們的工作表中(技術上是一個左外連接) (記錄:存在)

{1:1,2:0,3:1,4:1,5:0}

我們的 '不存在的記錄'

{2,5-}組(選擇*從哪裏標誌= 0)

我們的產品......和更快(索引!)

{1,2,3,4,5} {中} 2,5 = {2,5}

{1,2 ,3,4,5}不在{1,3,4} = {2,5}

這可以在沒有工作表的情況下完成,但是它的使用使得可視化更容易發生。

克里斯

相關問題