2016-09-16 84 views
0

人們,因爲這個問題涉及到IDENTITY列和合並複製,如果我可能會要求你不要回答「改用GUID」。我非常清楚兩者的優點和侷限性,並且自SQL Server 2000以來一直使用SQL複製與CE。偶爾我會感到驚訝。這是這種情況。SQL Server CE @threshold和標識範圍真的發生了什麼?

這是問題的一個複雜的描述,所以請多多包涵。

下面是從這裏https://msdn.microsoft.com/en-us/library/ms152543.aspx的提取物是什麼我一直對於標識範圍和閾值的理解。 「

」運行SQL Server Compact或SQL Server早期版本的訂戶僅分配主要範圍;新範圍的分配由@threshold參數控制此外,重新發布訂戶僅具有@ identity_range參數;它必須使用此範圍進行本地更改,並使用與重新發布訂閱服務器同步的訂閱服務器上的更改,例如,您可以爲@pub_identity_range指定10000,爲@identity_range指定500000,爲@threshold指定80%。訂閱者(10000的80%),發佈者被分配一個新的範圍,當一個新的範圍被分配時,表中的身份範圍值會有一個間隔,指定一個更高的閾值會導致更小的間隔,但系統是少容錯:如果Merg由於某種原因,代理商無法運行,訂戶可能更容易耗盡身份。「

如果我們假設這是真的,那麼我們就會開始解決問題。

要使用我們的應用程序幫助用戶,我們一直在使用下面的查詢的變化,讓客戶知道他們可能會用完的身份,如果他們繼續下去,並啓動同步得到一個新的範圍。

SELECT 
    AUTOINC_MAX, AUTOINC_NEXT, AUTOINC_MAX-AUTOINC_NEXT 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = N'Asset' 

AUTOINC_MAX | AUTOINC_NEXT | AUTOINC_MAX-AUTOINC_NEXT 
------------+--------------+------------------------- 
3081898  | 3080899 |  999 

通過評估AUTOINC_MAX - AUTOINC_NEXT(= 999),當我們在標識

在代碼中,我們正在尋找AUTOINC_MAX - AUTOINC_MIN這就給分配的範圍越來越低,我們可以看到。使用80%的默認閾值和剩餘的範圍,我們可以建議客戶同步,如果他們看起來像用完了。

然而,這哪裏是什麼,我認爲是真正在實踐中失敗。參考上面的Microsoft詳細信息,此句突出顯示「分配新範圍時,表中的標識範圍值會有差距。」

我認爲這意味着以下

如果我們的用戶有0-1000 ID的標識範圍,並使用標識多達801在下次同步的用戶將被分配的1001-2000的下一個範圍(我們假設一個用戶進行說明)。作爲同步的結果,使用的下一個ID將是1001,與802-1000之間留有間隙。

首先請讓我知道如果我的理解是錯誤的。

其次,雖然,這不是我們在實踐中所看到的。

在實踐中我們所看到的,根據上面的例子中,後同步和後續插入,是正在使用的ID的平衡,直到我們完全消耗原來的範圍。 THEN在擴大AUTOINC-MIN範圍時,-MAX和-NEXT全部更新到新的範圍。沒有發生額外的同步。

下面是一個例子。

在目標表中使用的最後一個ID是3080899

爲了模擬使用下面的查詢被用來

INSERT INTO Asset (lInstID, lTypeID, sUsrName, lUsrID, dCreated, dAudit, sStatus) 
    SELECT 
     lInstID, lTypeID, sUsrName, lusrID, dCreated, dAudit, sStatus 
    FROM 
     Asset 
    WHERE 
     lAssetID = 3080899 

插入使用的下一個ID值之後是3080900(如預期例如AUTOINC_NEXT = 3080899, + 1 = 3080900)

我們重複此插入,直到我們達到分配的標識範圍的80%。

SELECT 
    AUTOINC_MAX, AUTOINC_NEXT, AUTOINC_MAX-AUTOINC_NEXT 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = N'Asset' 

AUTOINC_MAX | AUTOINC_NEXT | AUTOINC_MAX-AUTOINC_NEXT 
------------+--------------+------------------------- 
3081898  | 3081699 |   199 

我們同步。我們注意到800訂戶更改。我們查詢,這是我們看到的。預同步沒有變化。

AUTOINC_MAX | AUTOINC_NEXT | AUTOINC_MAX-AUTOINC_NEXT 
------------+--------------+------------------------- 
3081898  | 3081699 |   199 

我們繼續插入,直到有剩餘

AUTOINC_MAX | AUTOINC_NEXT | AUTOINC_MAX-AUTOINC_NEXT 
------------+--------------+------------------------- 
3081898  | 3081898 |   0 

還有一個插入零的ID,結果這

AUTOINC_MAX | AUTOINC_NEXT | AUTOINC_MAX-AUTOINC_NEXT 
------------+--------------+------------------------- 
3082898  | 3081899 |   999 

這是完全出乎意料的,違反當一個新的範圍被分配,表中的標識範圍值將會有差距。事實上,IDENTITY RANGE是連續的。這是有點可取的,因爲我們不會浪費ID。

我找不到存儲下一個分配範圍的.SDF

我假定這是next_range_startsysmergearticles服務器表next_range_end但沒有文件可以發現,暴露在.SDF這些值。

如果有人知道這裏發生了什麼,我會非常感激。

作爲一個需要注意的問題,如果您完全消耗這個「下一個範圍」而沒有同步,數據庫會按照預期返回錯誤。

後同步錯誤顯示(加上來自先前範​​圍200中的1000從「下一個範圍」)由訂戶上傳的1200個的新記錄

AUTOINC_MAX | AUTOINC_NEXT | AUTOINC_MAX-AUTOINC_NEXT 
------------+--------------+------------------------- 
3083898  | 3082898 |   999 

親切的問候

安德魯

回答

0

對於那些有興趣的人,我從微軟的一個人那裏得到了這個答案

安德魯嗨,

根據測試,我認爲這應該是一個文檔錯誤。同步應使用運行SQL Server 2005或更高版本的相同方法訂閱者。即,

訂戶將收到兩個身份範圍。次要範圍是 大小與主要範圍相等;當主要範圍爲 用盡時,將使用輔助範圍,合併代理將新範圍分配給訂戶。新範圍將成爲第二個 範圍,並且該過程將繼續,因爲訂戶使用身份標識 值。

因此,讓我們假設您將用戶識別範圍設置爲10.然後 發佈商從1到11開始主要範圍,11到21開始爲 次要範圍。而用戶從主要 範圍從21到31開始,次要範圍從31到41。如果在消耗所有用戶範圍之前沒有同步 ,那麼您將點擊 該錯誤,這表示您可以在您遇到 錯誤消息之前插入您設置爲用戶數據庫的用戶範圍的雙號數記錄 。

對於發佈者來說,如果你消耗所有的範圍但不是在一個批次中, 插入觸發器將幫助你重新分配一個新的範圍。例如,在同步前 ,如果發佈者端達到21,並且下一個插入端 將從42開始,因爲22到41屬於訂閱者。

的機制是多個用戶是相同的,如果你還在 初級範圍內的用戶,新的範圍將不進行分配。如果 你已經在二級範圍,新範圍將被分配 ,讓您的次級範圍新主和新的範圍給 新的次級範圍。

由於CE用戶無法將 作爲發佈者進行操作,因此您可以跳過重新發布方案。

最好的問候,

彼得https://social.msdn.microsoft.com/profile/sql%20team%20-%20msft/?ws=usercard-mini

這證實正是我們在測試中所看到的。所以要清楚的是,SQL CE 3.1+在第一次同步時確實會收到主要和次要範圍。在擴展第一個範圍後,輔助變爲主要,下一個同步應用新的輔助範圍。

只需要查詢來確定SQL CE中的輔助範圍是什麼...