2012-06-04 53 views
1

假設有一個應用程序生成與幾個表中的規範化記錄數相對應的隨機GUID。這些GUID爲「tenant_id」的記錄需要在SQL Azure中拆分爲多個聯合成員。當發出SPLIT AT命令時,使用什麼排序機制來分割特定點上的成員(tenant_id)?它是否類似於ORDER BY GUID_FIELD ASC/DESC結果集?由於GUID是隨機生成的,創建未來分割範圍的最佳方法是什麼?SQL Azure SPLIT ON UNIQUEIDENTIFIER GUID

謝謝

回答

0

GUID範圍根據它們在SQL Server中的排序順序進行分割 - 與用於ORDER BY和索引的GUID範圍相同。有關詳細信息,請參閱此博客文章:http://sqlblog.com/blogs/alberto_ferrari/archive/2007/08/31/how-are-guids-sorted-by-sql-server.aspx

如果您隨機生成GUID並且需要拆分,則應該使用GUID的排序定義在GUID集中的某個位置選擇一個點你正在分裂的成員(假設你想在中間分裂)。

如果您想更多地瞭解租戶到哪裏去,您可以生成自己的「自定義」GUID,但是當然,您將失去GUID具有的全球唯一性屬性,除非確保全球獨一無二的「自定義「GUID。

- Hans Olav

+0

你是對的。但考慮一下聯盟分裂後會發生什麼。您可以插入越來越多的數據。 GUID是自動生成的。你無法控制。所以這些新數據中的大部分仍然會被插入到單個聯合中。如果您將聯邦分成中間部分,則風險可以降低,但不會消除。我不是說GUID不能用作聯合密鑰。只要指出潛在的風險。 –

+0

Microsoft成員資格提供程序正在爲userId使用GUID,我不想修改成員資格表以使用基於非guid的數據類型,除非有一種廉價的方法來引入在獨特的不同服務器(App Server)上生成新ID的機制。 – dotnetengineer

+0

@ MingXu-MSFT,在使用GUID和中間分割時保持數據平衡是一個統計問題。您將不得不考慮值範圍很大,生成的值完全是隨機的。如果你只產生3個值,那麼確實有一點可能性,即所有3個值都可能在一個聯邦中結束,但如果你產生了1000個值,統計上他們將以大致平衡的方式分配。 –

0

實質上,拆分將單個聯合拆分爲兩個。它依賴於分配鍵(您在聯邦子句中傳遞的鍵)。例如,想象你在年齡上聯合。原生你有兩個聯盟:年齡從0到40,年齡從41到80.現在你將第一個聯合分爲兩部分:0到20和21到40. SQL Azure會自動組織數據以確保每個聯合符合範圍要求。所以,是的,它有點像順序。

通常,聯合身份驗證不在GUID上使用。相反,它用在了一些你有更多控制權的鑰匙上。使用GUID是好的,但是你有冒失衡聯盟的風險。一個聯邦可能包含大量數據,而另一個聯邦可能包含大量數據。

+0

將GUID用作聯合密鑰沒有任何問題。您可以進行拆分,以確保每個聯合成員的平衡大小/負載。 –

+0

問題的主要部分是關於GUID的排序問題。如果我在some_guid中分裂了某個聯盟成員,那麼我需要知道有多少個AU將會轉到新成員1和成員2中。或者,換句話說,找到一箇中點GUID的最佳方法是什麼範圍?使用什麼GUID排序機制? – dotnetengineer

+0

您不必擔心SQL Azure如何在內部對GUID進行排序。要查找現有數據的中點,可以按GUID對所有數據進行排序(使用orderby)。計數數據,並找到中間項目的GUID。 –

相關問題