【问题标题】:SQL Server GUID (from Active Directory) vs IntSQL Server GUID(来自 Active Directory)与 Int
【发布时间】:2009-07-03 21:01:28
【问题描述】:

我们从旧的订购系统迁移了大量数据。该系统将用户创建的每个订单的首字母缩写存储在我们的“订单”表中。现在我们有了一个查看活动目录的视图,我想用活动目录 objectguid(或引用 guid 的东西)更新这些缩写。这将允许我们更改活动目录中的用户首字母缩写,而不必担心更新“订单”表记录。

我了解到,在使用 guid 与 int 时,索引性能不佳。可能解决这个问题的一种方法是有一个将 guid 映射到 int 的表,然后将 int 值存储在我们的订单表中。这是个好主意吗?有什么想法吗?

【问题讨论】:

  • 拥有一个映射表比将 guid 作为表中的字段而不是集群键更好?
  • 我的想法是映射表将有大约 100 行,可以快速查找 int,如果使用索引 int 而不是索引唯一标识符有性能优势,那将是值得的,因为我们的订单表有超过 400 万行。如果我的思维方式完全不符合要求,请告诉我:)

标签: sql-server active-directory guid int


【解决方案1】:

我假设 USER 实体已经存在于您的数据库设计中,但如果不存在,那么我相信您的解决方案将需要它。

所以假设存在 USER 实体,正如您所描述的,您可以将 UserID(int) 放在 ORDERS 表中,从而关联所有相关的 USER 详细信息到 ORDER,而不仅仅是首字母(注意:首字母不应存储在 ORDER 表中,而应存储在 USERUSER_DETAILS 表,尽管不是本次讨论的重点)。

然后您可以将 GUID 列添加到 USER 表中。我认为不需要单独的查找表。

有意义吗?

【讨论】:

  • 我同意通常会有一个员工表。旧系统中有一个,它的设计非常糟糕,所以我们现在并没有真正使用它。我希望只使用我们的活动目录视图作为员工表并引用它的 objectGUID...但我想如果由于某种原因活动目录中的 objectGUID 发生了变化,这将是一个大问题
  • 不要将我们的“客户”表与“员工”混淆。我们确实有一个客户表,这不是问题。
  • 听起来你的思路是正确的。您基本上想设计一个数据模型,支持从 Active Directory 定义中独立管理数据库用户的需要,这样您就可以独立更新每个源而不影响另一个源。
【解决方案2】:

GUID 上的索引性能通常与 16 字节字段上的其他索引没有什么不同。当您将 GUID 用作 SQL Server 表上的 集群键 时,GUID 对性能的致命影响。

SQL Server 表聚集键,并按该键进行物理排序。由于 GUID 本质上是完全随机的,这会很快导致大量索引碎片,因此需要 a) 不断的馈送、维护和重组,但是 b) 即使您每晚都进行重组,仍然会受到影响。所以说真的,最好的做法是避免为您的集群键使用 GUID(甚至是新的“顺序”GUID)。

如需更多背景信息和一些关于 GUID 生成非常差的集群键的优秀文章,请参阅“索引女王”Kimberly Tripp 的博客:

她的洞察力是最有价值的——阅读它,内化它,跟随它!你不会后悔的。

马克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多