SQL Server 中 COMB GUID 处的时间戳为 8 个字节或时间戳为 6 个字节

2024-04-21

感谢精彩的文章,我们有 COMB GUID。根据目前的实施情况,有两种方法:

  1. 使用最后 6 个字节作为时间戳:GUID作为多个数据库下的快速主键 http://www.codeproject.com/Articles/388157/GUIDs-as-fast-primary-keys-under-multiple-database
  2. 通过使用 Windows 刻度,使用最后 8 个字节作为时间戳:EF4.1 中的 GUID COMB 策略 (CodeFirst) https://stackoverflow.com/questions/6098972/guid-comb-strategy-in-ef4-1-codefirst/6100778#6100778

我们都知道,对于 GUID 处的 6 字节时间戳,需要有更多的随机字节来减少 GUID 的冲突。然而,将创建更多具有相同时间戳的 GUID,并且这些 GUID 根本不连续。因此,8 字节时间戳将是首选。

所以这似乎是一个艰难的选择。根据上面的文章GUID作为多个数据库下的快速主键 http://www.codeproject.com/Articles/388157/GUIDs-as-fast-primary-keys-under-multiple-database, 它说:

在继续之前,请先了解一下此方法的简短脚注:使用 1 毫秒分辨率的时间戳意味着非常接近地生成的 GUID 可能具有相同的时间戳值,因此不会是连续的。对于某些应用程序来说,这可能是常见的情况,事实上,我尝试了一些替代方法,例如使用更高分辨率的计时器(例如 System.Diagnostics.Stopwatch),或者将时间戳与“计数器”结合起来以保证序列继续直到时间戳更新。然而,在测试过程中,我发现这根本没有明显的区别,即使在同一个一毫秒窗口内生成了数十甚至数百个 GUID。这也与 Jimmy Nilsson 在 COMB 测试中遇到的情况一致

只是想知道了解数据库内部的人是否可以分享一些关于上述观察的信息。是因为数据库服务器只是将数据存储在内存中,只有达到一定阈值才写入磁盘吗?因此,具有相同时间戳的非序列 GUID 的插入数据的重新排序通常会在内存中发生,因此性能损失最小。

Update:根据我们的测试,与随机 GUID 相比,COMB GUID 无法减少互联网上声称的表碎片。现在看来唯一的方法是使用 SQL Server 生成顺序 GUID。


你引用的文章是2002年的,很旧了。只需使用新闻序列ID http://technet.microsoft.com/en-us/library/ms189786.aspx(在 SQL Server 2005 及更高版本中可用)。这保证了您生成的每个新 id 都大于前一个,解决了索引碎片/页面拆分问题。

不过,我想提及的另一个方面是,当您只需要 4 个字节时,使用 16 个字节并不是一个好主意,该文章的作者对此进行了掩饰。假设您有一个表,其中包含 500,000 行,平均 150 字节(不包括聚集列),并且该表有 3 个非聚集索引(在每行中重复聚集列),每个索引依次包含平均 4 字节、25 字节和 50 字节的行不计算聚集列的字节数。

完美 100% 填充因子的存储要求如下(除 % 外,所有数字均以兆字节为单位):

Item  Clust  50     25     4      Total
----  -----  -----  -----  -----  ------
GUID  79.1   31.5   19.6    9.5   139.7
 int  73.4   25.7   13.8    3.8   116.7
%imp   7.2%  18.4%  29.6%  60.0%   16.5%

在只有一个的非聚集索引中int4字节列(常见场景),将聚集索引切换为int使其缩小 60%!这直接意味着表上的任何扫描的性能提高了 60%——而且这是保守的,因为行越小,页面分割发生的频率就会越低,碎片也会保持得更久。

即使在聚集索引本身中,性能仍然提高了 7.2%,这并不是什么都不是的。

如果你用过怎么办GUID贯穿整个数据库,其中的表具有与此类似的配置文件,其中切换到int会导致大小减少 16.5%,而数据库本身的大小为 1.397 TB?您的整个数据库将增大 230 GB(请参阅“总计”列,139.7 - 116.7)。这可以转化为现实世界中用于高可用性存储的真金白银。它将您的磁盘采购计划提前,这对您公司的利润有害。

永远不要使用超过必要的数据类型。这就像无缘无故地给你的车增加重量:你will付出代价(如果不是速度,那就是燃油经济性)。

UPDATE

现在我知道您正在客户端代码中创建 GUID,我可以更清楚地看到问题的本质。如果你are能够将 GUID 的创建推迟到行插入时间,这是实现这一目标的一种方法。

首先,为您的系统设置默认值CustomerID column:

ALTER TABLE dbo.Customer ADD CONSTRAINT DF_Customer_CustomerID
   DEFAULT (newsequentialid()) FOR Customer;

现在您不必指定要插入的值CustomerID in any INSERT,您的查询可能如下所示:

DECLARE @Name varchar(100) = 'Acme Spy Devices';
INSERT dbo.Customer (Name)
OUTPUT inserted.CustomerID -- a GUID
VALUES (@Name);

在这个非常简单的示例中,您已将一个新行插入到Customer表,并向客户端返回一个包含刚刚创建的值的行集,所有这些都在一个查询中完成。

如果你想显式插入VALUES (newsequentialid(), @Name)那也行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 中 COMB GUID 处的时间戳为 8 个字节或时间戳为 6 个字节 的相关文章

  • 插入并发问题-多线程环境

    我有一个问题 即使用完全相同的参数在完全相同的时间调用相同的存储过程 存储过程的目的是获取记录 如果存在 或创建并获取记录 如果不存在 问题是两个线程都在检查记录是否存在并报告错误 然后都插入新记录 在数据库中创建重复记录 我尝试将操作保留
  • 如何更新 SQL Server 中 ntext 列中的 XML 字符串?

    有一个包含 2 列的 SQL 表 ID int 和值 ntext 值行中包含各种 xml 字符串 ID Value 1
  • PHP 数据库显示在具有不同锚标记的相同字段中

    我四处寻找 看看这是否可行 但却空手而归 首先 这是我的代码 div style display none div ul li li li li li li ul
  • ORDER BY id 或 date_created 显示最新结果?

    我有一个表 实际上有几个 我想首先从中获取最新条目的结果 这是我的ORDER BY条款选项 date created INT 从不改变值 id 当然是INT AUTO INCRMENT 两列应同等地代表记录插入的顺序 我自然会使用date
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • 仅当所有记录都匹配时 SQL 连接

    我有3张桌子 CP carthead idOrder CP cartrows idOrder idCartRow CP shipping idCartRow idShipping dateShipped 每个 idOrder 可以有多个 i
  • 使用DBFlow,如何加密已经存在的数据库?

    我正在使用 DBFlow 来处理项目中的数据库 并且我想对现有数据库进行加密 我知道我可能必须删除现有的未加密数据库并创建另一个加密数据库 我也知道我可以将 SQLCipher 与 DBFlow 一起使用 如上所述文档 https gith
  • 术语 SSTable 和 LSM Tree 之间有什么区别

    这两个术语可以互换使用吗 我读过有关 SSTable 工作原理的文章 通常文章都会开始提到 LSM Tree 然而 它们似乎是同一件事 我什么时候应该使用一个术语而不是另一个术语 对于凡人来说 SSTables 和 LSM Trees 的最
  • 使用python shelve跨平台

    我希望得到关于 Python 中的书架 数据库的一些建议 问题 我在 Mac 上创建了一个数据库 我想在 Windows 7 上使用该数据库 我使用 Python 3 2 MacOS 10 7 和 win 7 当我在 Mac 上打开并保存我
  • 如何将数据库查询的行转换为 XML 文件?

    我正在开发一个 Delphi 应用程序 该应用程序需要从一段工作中获取行并将其转换为单个 XML 文件 以便上传到第三方 Web 服务 有没有可用的组件或库可以做到这一点 如果不是 那么构建 DB2XML 转换器的最佳代码方法是什么 我注意
  • SQL Server:触发器如何读取插入、更新、删除的值

    我在一张表中有触发器并且想阅读UserId插入 更新或删除行时的值 怎么做 下面的代码不起作用 我收到错误UPDATED ALTER TRIGGER dbo UpdateUserCreditsLeft ON dbo Order AFTER
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 存储过程总是返回0

    我试图从存储过程获取返回值 但它总是返回 0 c code cmd new SqlCommand cmd CommandType CommandType StoredProcedure cmd CommandText AbsentEntry
  • 在SQL中,如何通过查找与某一列相等的所有行来更新表的每一行,然后将另一列设置为彼此相等

    所以基本上这就是伪代码 但我不知道如何在 SQL 中执行此操作 请帮忙 for each row in table1 loop through each row in table 2 if table1 s row column 1 tab
  • 使用 ActiveAndroid 库存储 HashMap

    我有一堂课 Table name Control public class Control extends Model Column private String name Column private Map
  • 如何查询集成服务目录

    问题 识别连接到 SQL Server 上特定数据库表的所有 SSIS 包 详细信息 服务器上部署了近 100 个包 大多数包的大小都很大 因此很难以高精度手动检查它们 有没有一种快速且自动化的方法来做到这一点 使用 SQL Server
  • iOS 解析如何通过 URL 下载文件

    我正在将 parse 用于我的聊天应用程序 当我上传文件时 我保留该 url 并将该 url 发送给其他用户 然后其他用户可以通过该 URL 下载文件 这是我上传文件的代码 void uploadBlob NSData blob fileN
  • 有没有办法在插入查询中执行另一个查询?

    好的 这是我的查询 我刚刚添加了 ACCOUNTID 和 accountID 部分 这显然不起作用 INSERT INTO Leads LEADID CREATEUSER CREATEDATE FIRSTNAME MODIFYDATE AC
  • 如何在 SQL Server 中创建文件格式

    我正在尝试在 SQL Server 2017 中试验外部文件 但在第一步中遇到了困难 数据是管道分隔的 我试图遵循文档中的语法 这需要一个FILE FORMAT 以下是 Microsoft 的语法 CREATE EXTERNAL TABLE
  • 如何使用 django-pyodbc (ubuntu 16.04) 配置数据库设置 Django-MSSQL?

    我是 Django 新手 目前正在尝试使用另一个数据库来保存我的模型 即MS SQL 我的数据库部署在docker容器中 903876e64b67 microsoft mssql server linux bin sh c opt mssq

随机推荐

  • Apple 听写 - 在应用程序中使用

    有什么方法可以在本机 Apple 应用程序中利用 Apple 的听写语音转文本功能吗 你的问题有点模糊 最好先知道你尝试使用或做什么 或者你想要实现什么目标 更常见的是关键字识别 API 但可以用于此目的的语音识别 API 是张开耳朵 ht
  • iOS Storyboard:ViewController 外部和场景顶部的视图(第一响应者和退出框之间)

    我很难理解为什么你可以把UIViews之外的UIViewController在故事板上 以及它的用例可能是什么 例如 在故事板上我可以添加UIToolbar UIAcitivtyIndicator and UIProgressView那是在
  • 如何在类模板中使用文件范围的命名空间声明?

    C 10 介绍文件范围的命名空间 https learn microsoft com en us dotnet csharp language reference proposals csharp 10 0 file scoped name
  • 安卓蓝牙无法连接

    我遇到这个问题已经有一段时间了 但一直无法解决 我有一个 Android 应用程序 它将所有配对的设备放在列表视图中 当您单击列表项之一时 它将发起连接到该蓝牙设备的请求 我可以毫无问题地获取设备列表及其地址 问题是 一旦我尝试连接 我就会
  • 如何在 AWS 上设置无密码 ssh

    如何在 AWS 集群上的节点之间设置无密码 ssh 以下设置无密码身份验证的步骤已针对 Centos 和 Ubuntu 进行了彻底测试 假设 您已经可以访问您的 EC2 机器 可能正在使用 pem 密钥 或者您拥有具有 root 权限的 u
  • Windows 7 为软件开发人员带来哪些好处? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试将我的开发计算机升级到 W
  • 如何重置 JSESSIONID

    当用户进行身份验证时重置会话 cookie 被认为是一种良好的安全实践 如何用 Java 做到这一点 到目前为止我的尝试是成功的 但我想知道是否有更好的方法 public static HttpSession resetSessionId
  • 车把模板的文件扩展名

    我更改了车把模板的扩展名 并在调用 handlebarjs 编译函数的函数中引用了相同的扩展名 它工作得很好 没有任何问题 但我很好奇是否还有其他人尝试过 如果您认为这可能会因任何原因导致问题 请告诉我 出于某种原因 我觉得扩展名 hand
  • Java 中搜索和排序算法的高效实现

    有没有人有关于常见搜索和排序算法的一组 Java 代码实现的良好参考 剥猫皮的方法有很多种 很容易在网上找到各种算法的 Java 代码 但是 Java 中是否有实现这些不同算法的最有效方法的列表 例如有http www algorithmi
  • 将 float 和 double 值与 delta 进行比较?

    据我了解 必须仔细比较浮点类型的值 以避免固有浮点错误的问题 这可以通过将值与错误阈值进行比较来改进 例如 以下解决方案比简单的解决方案更有用x y test static float CompareRelativeError float
  • 如何通过 jQuery Ajax 发布数据在 PHP 中编码 JSON?

    我有一个 HTML 表单 并在点击提交按钮时将数据发送到 php 文件 ajax url text php type POST data amount amount firstName firstName lastName lastName
  • 单击添加类和删除时切换类

    如果我单击项目 我需要添加类名 如果单击同一项目 则需要删除 ngFor 循环的类
  • Angular Material:如何在注销时关闭所有垫对话框和甜蜜警报

    我想在 Angular 注销时关闭所有对话框 mat dialog 引导模式和甜蜜警报 这是 AngularJS 版本 1 5 中的实现方式 function logout hide mdDialog modal angular eleme
  • 如何将客户端证书与 ftp_ssl_connect 一起使用

    我正在寻找通过 SSL 连接使用 FTP 服务器的最佳方法 通常 推送文件以及获取服务器上的文件列表 该项目的一项要求是我必须使用客户端 X 509 证书作为身份验证过程的一部分 我可以使用 php 函数 ftp ssl connect 来
  • 将我的 apk 推送到 /system/app

    如何推送我的应用程序包 到Android模拟器 system app 文件夹 我已经尝试过使用 adb 推送 myApk apk system app 它给了我这个 failed to copy No space left on devic
  • 如何使用 JSF/MyFaces 创建基于用户角色的条件?

    我必须使用哪些选项才能从 JSP 页面读取当前用户的角色 我知道visibleOnUserRole myRole Tomahawk 组件上的属性 但我需要角色来处理比简单可见性更复杂的事情 The 外部上下文 http docs oracl
  • 在 Python 中插入缺失值

    所有 我希望你能够提供帮助 因为这是我知道我几乎从这里和网上的各种帖子中破解的任务之一 但还没有完全发挥作用 本质上 我在数据库中有以下数据 通过 psql read sql sql cnxn 返回到 Pandas 对象 StartTime
  • 如何在同一服务器上运行 TeamCity 的多个实例?

    我在 Windows 上尝试在同一服务器上运行多个 当前是两个 TeamCity 实例 我选择不安装 Windows 服务 而是通过以下方式运行服务器runAll bat启动命令 当我运行安装程序时 我为每个安装程序选择了不同的端口 名称和
  • 如何在 Javascript 中输入时自动将所有内容变为小写

    当用户在 Javascript 的文本字段中键入文本框的所有字符时 如何将文本框的所有字符变为小写
  • SQL Server 中 COMB GUID 处的时间戳为 8 个字节或时间戳为 6 个字节

    感谢精彩的文章 我们有 COMB GUID 根据目前的实施情况 有两种方法 使用最后 6 个字节作为时间戳 GUID作为多个数据库下的快速主键 http www codeproject com Articles 388157 GUIDs a