【问题标题】:Optimize the GUID column优化 GUID 列
【发布时间】:2019-09-10 00:28:17
【问题描述】:

对不起我的英语;在我们的 SQL Server 2014 项目中,我们有两个表在 Web 应用程序和 Android 设备之间同步(因此它们在所有移动设备上)。

在我们的数据库中,这两个表由 integer 类型的唯一标识符作为主键来标识,但我们还需要一个 GUID 单列来“跟踪”创建时的数据。

我们的表 A 有这些列:

A_ID int
A_guid nvarchar (50)

和DetailA表:

detailA_ID int
detailA_guid nvarchar (50)
A_guid nvarchar (50) (on mobile only)

GUID列在移动应用中使用,在SQL server上同步,“detail”数据会查找“A_guid”对应的SQL Server ID:

select A_ID 
from A 
where A_guid = detailA.A_guid

我们所有的数据都已通过 SQL Server 凭据在它们之间进行链接。当然,只要数据很少,一切都会正常工作。 “GUID”很快就会花一点时间。我们所有的 GUID 列都采用以下格式:

DEVICE_ID-YYYMMDD- [Function NEWID ()]

应用索引不是很有效。我想过改变格式以对应:

DEVICE_ID-YYYMMDD_HIS

但我不知道我们是否会加快速度。

【问题讨论】:

  • 速度是为了什么?
  • 你读过这篇文章吗? stackoverflow.com/questions/13803326/…
  • 如果要存储 GUID,为什么要使用 varchar(50)?您应该使用 uniqueidentifier。
  • GUID 已经是全局唯一的(根据名称);添加设备 ID 和日期不会为您带来任何好处。您最好将其拆分为单独的列(根据 Sean,UNIQUEIDENTIFIER 用于 GUID),然后您可以索引这些列。如果您需要该值的单个字符串表示,则可以使用计算列,但您实际上并不需要它。如果您有一种方法可以为每个设备实际生成一个不断增加的唯一值(例如精确到毫秒的时间戳),那么该值的索引会比 GUID 更好,因此您可能根本不需要它。

标签: sql sql-server performance tsql guid


【解决方案1】:

正如我的伙伴所说,如果您想使用 GUID,请使用uniqueidentifier,这是 SQL Server 中已知的数据类型。

如果 GUID 不足以满足您的要求,但您需要包含更多信息。我建议创建一个非正式表,将所有必需的信息保存在具有相应 GUID 的单独列中。这比在具有其他值的字符串中具体化 GUID 更好。

所以与其做:DEVICE_ID-YYYMMDD- [Function NEWID ()]

这样做会更好:INSERT INTO informationTable (DeviceId, CreatedDate, RecordGUID)

【讨论】:

    【解决方案2】:

    根据定义,由于 GUID(全局唯一标识符)是唯一的,因此您不需要在 guid 列中包含 DEVICE_ID。如果您需要该数据,请将其单独存储在自己的列中。正如 cmets 中所述,这将允许您使用 uniqueidentifier 数据类型,这将稍微提高性能。当然,在 guid 列上建一个索引,会比没有索引快很多!

    (我不确定_HIS 指的是什么,但添加额外的字符不会让事情变得更快。)

    【讨论】:

    • 感谢您的回答。 DEVICE_ID 用于了解创建数据的设备。在项目中,所有 GUID 都以相同的格式生成。我们认为使用 _HIS(小时、分钟、秒)的格式会更快,因为它只是数字(这样我们将不再使用 SQL Server NEWID 函数,而是使用自定义函数)。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 2012-11-25
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2011-12-20
    相关资源
    最近更新 更多