【发布时间】:2008-08-20 09:44:02
【问题描述】:
我们将一些 Guid 存储在 MS SQL 数据库中。有一些遗留代码执行Guid.ToString(),然后将它们传递给varchar(64),还有一些更新的代码使用唯一标识符参数传递它们。当您使用 MS SQL Management Studio 查看结果时,它们看起来会有所不同。前三个块的字节顺序颠倒了,但最后一个块保持不变。为什么?
【问题讨论】:
标签: .net sql-server
我们将一些 Guid 存储在 MS SQL 数据库中。有一些遗留代码执行Guid.ToString(),然后将它们传递给varchar(64),还有一些更新的代码使用唯一标识符参数传递它们。当您使用 MS SQL Management Studio 查看结果时,它们看起来会有所不同。前三个块的字节顺序颠倒了,但最后一个块保持不变。为什么?
【问题讨论】:
标签: .net sql-server
Sql server 中的唯一标识符字段可以被索引,'backwards'也是如此。
可以从机器特定信息和“事件时间”信息生成指南。
.Net 中的默认 Guid 是随机的,但您可以通过外部调用从中获取顺序 Guid:
[DllImport( "rpcrt4.dll", SetLastError = true )]
static extern int UuidCreateSequential( out Guid guid );
这将根据您的 MAC 地址 (MSDN docs) 为您提供连续的 Guid。
如果您.ToString() 这些连续的 guid,那么您将看到字符串的第一部分发生变化,而其余部分保持不变。
这使得 Guid 之间的相等性检查更快(因为差异将在开始时)并改善截断的变化。
对于搜索列,SqlServer 以类似于电话簿或字典的方式构建索引。搜索以“Over*”开头的单词比查找以“*flow”结尾的单词要快得多。
这意味着对于 Sql server,任何顺序的 Guid 都需要首先存储重复值,因此它将它们存储在前面。
【讨论】: