2009-01-27 33 views
0

我們有點混亂的數據庫情況。在實時環境中有效地將數據從一個SQL數據庫轉換爲另一個SQL數據庫

我們主要的後臺系統是用Visual福克斯臨用本地數據(是的,我知道!)

爲了有效地在我們的網站上的數據進行工作,我們選擇定期將數據導出到一個SQL數據庫。但是,這樣做的過程基本上每次清除表並重新插入。

這意味着我們有兩個SQL數據庫 - 一個是我們的FoxPro導出過程寫入的數據庫,另一個是我們的網站讀取的數據庫。

這個問題涉及到從一個SQL數據庫到另一個SQL數據庫的轉換(SqlFoxProData - > SqlWebData)。

對於特定的表(我們的主要應用程序表之一),因爲在此過程中發生各種數據轉換,所以它不是使用自連接的簡單UPDATE,INSERT和DELETE語句,但我們必須使用遊標而不是(我知道!)

多月這已工作正常,但現在我們已經開始在性能問題打在更新時發生(這可以在白天經常發生)

基本上當我們正在從SqlFoxProData.ImportantTable更新SqlWebData.ImportantTable,它會在實時網站上導致偶爾的連接超時/死鎖/其他問題。

我一直在努力優化查詢,緩存等等,但它來到了我正在尋找另一種策略來更新數據。已經想到

一種想法是具有ImportantTable兩份(A和B),一些概念,它的表是當前「活動」,更新所述非活性表,然後切換currenly actice表

ie網站從ImportantTableA讀取,而我們正在更新ImportantTableB,然後我們切換網站從ImportantTableB讀取。

問題是,這是可行的,一個好主意?我之前做過類似的事情,但我並不認爲這對優化/索引等是有好處的。

任何建議歡迎,我知道這是一個混亂的情況......而長期目標是讓我們指向SQL的FoxPro應用程序。

(我們使用的是SQL 2005,如果有幫助)

我要補充的是數據的一致性未在實例中特別重要的,看到的數據總是稍顯落伍

回答

2

有很多的方式去給這隻貓的皮膚。

我會先攻擊鎖定問題。我很少會使用CURSORS,我認爲提高性能和鎖定行爲可能會解決很多問題。

我希望我可以通過使用兩個單獨的臨時表來解決它。一個用於SQL中的FoxPro導出,一個用於並行轉換爲SQL中的最終格式。然後,使用sp_rename交換生產的最終產品,或者簡單地使用3 INSERT/UPDATE/DELETE交易將最終表中的所有更改應用於生產。無論哪種方式,都會有一些鎖定,但我們有多大的討論?

+0

謝謝,你似乎在根據我的想法提出建議。 我腦海裏唯一的問題是,如果這是一項小時工,我們是否會在進行第三階段時爲我們的網站造成問題。 我想我會看看插入/更新/刪除方法... – 2009-01-27 15:15:54

1

你應該的能夠維護一個數據庫的網站,只是從其他的SQL數據庫表複製到該表。

這是假定您不更新網站本身的任何數據。

+0

我們從網站更新數據,但一旦新數據被傳輸,這些更新就不需要維護......這很複雜! – 2009-01-27 13:59:13

+0

你如何複製表格? – 2009-01-27 14:28:15

0

您是否可以選擇使更新更加原子化,而不是所述的「清除和重新插入」?我認爲Visual Fox Pro支持觸發器,對吧?對於你的關鍵表,你可以在更新/插入/刪除中添加一個觸發器來捕獲更改記錄的ID,然後移動(或刪除)這些記錄?

或者,如何將所有更改寫入脫機數據庫,並讓SQL Server複製處理同步?

[對不起,這將是一個評論,如果我有足夠的聲譽!]

+0

複製的分數是多少? SQL是否會在性能方面處理這一問題,而不會爲實時數據庫帶來問題? – 2009-01-27 13:59:49

+0

我沒有足夠的重載經驗,所以你需要在你的場景中進行試驗(但我認爲這絕對值得)。由於您使用的是SQL Server,因此您還有其他選項(例如,在兩臺服務器之間進行負載平衡)。 – Geoff 2009-01-27 14:40:47

0

根據您對上述Ernie的迴應,您詢問了您如何複製數據庫。這裏是Microsoft's how-to about replication in SQL2005.

但是,如果你問複製和如何做到這一點,這表明你對SQL服務器的經驗有點輕。這就是說,把事情弄糟,並且儘管我都是根據經驗學習,如果這是關鍵任務數據,那麼最好僱用DBA或者至少測試一下#$ @#$在你實際實現它之前,這個比例是%。

1

「對於特定的表(我們的主要應用程序表之一),因爲在此過程中發生各種數據轉換,所以它不是使用自連接的簡單UPDATE,INSERT和DELETE語句,但我們不得不使用遊標,而不是(我知道!)「

我想不出一種情況,我會永遠需要使用遊標執行插入,更新或刪除。如果可以爲光標寫入選擇,則可以將其轉換爲插入,更新或刪除。您可以在這些語句中加入其他表格並使用案例分析進行條件處理。花時間以基於集合的方式做到這一點可能會解決您的問題。

有一件事你可能會考慮如果你有大量的數據移動。我們偶爾創建一個我們想要的數據視圖,然後有兩個表 - 一個活動數據和一個數據將被載入。當數據被加載時,作爲你的進程的一部分運行一個簡單的命令來切換視圖使用的表格到你剛剛加載到的表格。這樣用戶最多隻能停下來幾秒鐘。在加載時,您不會在嘗試訪問數據的位置創建鎖定問題。

你也可以看看使用SSIS來移動數據。

相關問題