人們,因爲這個問題涉及到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_start
從sysmergearticles
服務器表next_range_end
但沒有文件可以發現,暴露在.SDF
這些值。
如果有人知道這裏發生了什麼,我會非常感激。
作爲一個需要注意的問題,如果您完全消耗這個「下一個範圍」而沒有同步,數據庫會按照預期返回錯誤。
後同步錯誤顯示(加上來自先前範圍200中的1000從「下一個範圍」)由訂戶上傳的1200個的新記錄
AUTOINC_MAX | AUTOINC_NEXT | AUTOINC_MAX-AUTOINC_NEXT
------------+--------------+-------------------------
3083898 | 3082898 | 999
親切的問候
安德魯