【问题标题】:SQL Azure SPLIT ON UNIQUEIDENTIFIER GUIDSQL Azure SPLIT ON UNIQUEIDENTIFIER GUID
【发布时间】:2012-06-08 18:57:05
【问题描述】:

假设有一个应用程序生成随机 GUID,这些 GUID 对应于几个表中的规范化记录数。这些 GUID 为“tenant_id”的记录需要在 SQL Azure 中拆分为多个联合成员。发出 SPLIT AT 命令时,使用什么排序机制在特定点(tenant_id)拆分成员?它类似于 ORDER BY GUID_FIELD ASC/DESC 结果集吗?由于 GUID 是随机生成的,那么创建具有未来拆分的范围的最佳方法是什么?

谢谢

【问题讨论】:

    标签: sql asp.net-membership azure-sql-database


    【解决方案1】:

    GUID 范围根据它们在 SQL Server 中的排序顺序进行拆分 - 与用于 ORDER BY 和索引的排序顺序相同。有关更多详细信息,请参阅此博客文章:http://sqlblog.com/blogs/alberto_ferrari/archive/2007/08/31/how-are-guids-sorted-by-sql-server.aspx

    如果您随机生成 GUID 并且需要拆分,您应该使用 GUID 的排序定义在您要拆分的成员中的一组 GUID 中间的某个位置选择一个点(假设您要在中间)。

    如果您想更好地控制租户的去向,您可以生成自己的“自定义”GUID,但是您当然会失去 GUID 所具有的全局唯一性属性,除非您确保生成“自定义”的全局唯一性" GUID。

    -- 汉斯·奥拉夫

    【讨论】:

    • 你是对的。但是考虑一下联邦分裂后会发生什么。您可以插入越来越多的数据。 GUID 是自动生成的。你没有控制权。因此,仍然存在大部分新数据将被插入到单个联合中的风险。如果在中间分裂联邦,风险可以降低,但不能消除。我并不是说 GUID 不能用作联合密钥。只需指出潜在风险即可。
    • Microsoft 会员资格提供商正在使用 GUID 作为 userId,我不想修改会员资格表以使用基于非 GUID 的数据类型,除非有一种廉价的方法来引入在不同服务器上生成新 ID 的机制(应用服务器)是独一无二的。
    • @MingXu-MSFT,在使用 GUID 时平衡数据并在中间拆分是一个统计问题。您将不得不考虑值范围非常大,并且生成的值是完全随机的。如果您只生成 3 个值,那么确实有可能所有 3 个值最终都在一个联邦中,但如果您生成 1000 个值,从统计上讲,它们将以大致平衡的方式分布。
    【解决方案2】:

    本质上,split at 将一个联邦一分为二。它依赖于分发密钥(您在 federated on 子句中传递的密钥)。例如,假设您按年龄联合。最初您有两个联邦:年龄从 0 到 40,年龄从 41 到 80。现在您将第一个联邦分为两部分:0 到 20 和 21 到 40。SQL Azure 将自动组织数据以确保每个联邦满足范围要求。所以是的,这有点像 order by。

    通常不会在 GUID 上使用联合。相反,它用于您拥有更多控制权的某些键。使用 GUID 很好,但您有可能使联合不平衡。一个联邦可能包含大量数据,而另一个只有少量数据。

    【讨论】:

    • 使用 GUID 作为联合密钥没有任何问题。您可以拆分以确保每个联合成员的大小/负载平衡。
    • 问题的主要部分是关于 GUID 的排序。如果我在 some_guid E(belongs) 某个联合成员处拆分,那么我需要知道有多少 AU 将分配给新成员 1 和成员 2。或者,换句话说,找到中点 GUID 的最佳方法是什么范围?使用什么 GUID 排序机制?
    • 您不必担心 SQL Azure 如何在内部对 GUID 进行排序。要查找现有数据的中点,可以按 GUID 对所有数据进行排序(使用 orderby)。统计数据,找到中间项的 GUID。
    猜你喜欢
    • 2017-08-28
    • 2013-07-18
    • 2020-01-29
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多