SQL Server GUID(来自Active Directory)与Int

时间:2009-07-03 21:01:28

标签: sql-server active-directory guid int

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

我已经读过使用guids vs int时索引性能低迷。可能解决此问题的一种方法是使用一个表格将guid映射到int,然后将int值存储在orders表中。这是个好主意吗?有什么想法吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

有意义吗?

答案 1 :(得分:4)

GUID上的索引性能通常与16字节字段上的其他索引没有区别。 GUID对性能至关重要的是当您在SQL Server表上将它们用作群集密钥时。

SQL Server表 是群集密钥,并按该密钥进行物理排序。由于GUID本质上是完全随机的,因此很快就会导致大规模的索引碎片化,因此需要a)持续的饲料和关注以及重组,但b)即使你每晚重新组织仍然会受到影响。实际上,最好的做法是避免群集密钥的GUID(甚至是新的“顺序”GUID)。

有关GUID制作非常糟糕的群集密钥的更多背景信息和一些优秀的报道,请参阅“索引女王”的博客,Kimberly Tripp:

她的洞察力最有价值 - 阅读,内化,遵循它!你不会后悔的。

马克