为什么Azure弹性刻度不支持字符串数据类型作为碎片键



来自Microsoft Azure文档:

弹性秤支持以下.NET框架类型作为碎片 钥匙:

  • 整数
  • GUID
  • 字节[]
  • datetime
  • timespan
  • dateTimeOffset

为什么不支持字符串?

正如上面的海报所暗示的那样,无约束的字符串是在数据库中索引内容的效率低下的方法(Shard Map存储在SQL数据库中)。在引擎盖下,弹性数据库客户端库(EDCL)将所有受支持类型的类型归一化为字节[],并在数据库中的shard地图中使用。如果将字符串转换为受支持的类型之一,则可以有效地将字符串用作键。

您可以在Wingtipsaas示例应用程序中看到此操作,该应用程序使用场地的名称作为钥匙。我们选择将名称转换为整数键(以进行演示和探索目的,在代码中跟踪整数值更容易),但可以在字节上停止[]。转换是使用名称编码的UTF8编码的MD5哈希进行的。下面的PowerShell代码来自几个管理脚本使用的Get-TenantKey函数。您可以在客户端应用中找到C#等效物。样本在这里:( https://github.com/microsoft/wingtipsaas)。以下功能在... 学习模块 common cataloganddatabasemanagement.psm模块中。

$normalizedTenantName = $TenantName.Replace(' ', '').ToLower()

# Produce utf8 encoding of tenant name 
$utf8 = New-Object System.Text.UTF8Encoding
$tenantNameBytes = $utf8.GetBytes($normalizedTenantName)

# Produce the md5 hash which reduces the size
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$tenantHashBytes = $md5.ComputeHash($tenantNameBytes)
# Convert to integer for use as the key in the catalog 
$tenantKey = [bitconverter]::ToInt32($tenantHashBytes,0)

美好的一天,

这些是.NET框架类型,可以用作 sharding键您如何使用自由文本作为碎片键(我并不是说您不能说它与使用int不一样,并且在一般情况下可能更复杂)?

)?

一个字符串被支持用于弹性刻度,但不能用作碎片的唯一钥匙。例如,由于相同的原因,可以将字符串映射到NVARCHAR(MAX)中,而该字符串不受支持。如果您尝试创建它,您将获得错误:

列...是一种无效的类型,可用作索引中的密钥列。

用于存储该值的"决策"的碎片键(其中共享数据库)。例如,您可以配置范围shard映射,并选择数据库A中的所有值将存储在数据库A中,所有值将存储在100到200中的所有值都将存储在数据库B中,等等。免费字符串不符合这种性质。

从理论上讲,您可以说要在字符串上使用范围,但是在大数据系统中它没有意义,而弹性量表是基于Azure SQL数据库的大数据系统的解决方案。

我希望这阐明了这个问题: - )

最新更新