Azure弹性比例为什么不支持字符串数据类型作为分片键?

问题描述:

从微软Azure文档:Azure弹性比例为什么不支持字符串数据类型作为分片键?

Elastic Scale support the following .Net framework types as sharding keys:

  • integer
  • long
  • guid
  • byte[]
  • datetime
  • timespan
  • datetimeoffset

为什么不串支持?

+0

可能是因为所有这些类型都是字节的屈指可数,而字符串可能是数百万字节。 – AakashM

+0

我们正在努力寻找可帮助我们回答此问题的Microsoft工程师。感谢您的耐心等待。 –

正如上面的海报所暗示的,无约束的字符串是索引数据库内容的低效方法(碎片映射存储在SQL数据库中)。在底层,弹性数据库客户端库(EDCL)将所有支持的类型标准化为byte [],并将其用于数据库中的分片映射中。如果将其转换为其中一种受支持的类型,则可以将字符串有效地用作键。

您可以在使用场地名称作为关键字的WingtipSaaS sample application中看到此操作。我们选择将名称转换为整数键(为了演示和探索目的,它更容易跟踪代码中的整数值),但可能已停止在字节[]处。转换是使用名称的UTF8编码的MD5散列完成的。下面的PowerShell代码来自Get-TenantKey函数,由几个管理脚本使用。您可以在客户端应用程序中找到C#等价物。示例在这里:(https://github.com/Microsoft/WingtipSaaS)。以下功能位于... \ Learning Modules \ 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 Framework类型,可以作为分片键 你怎么能免费使用文本作为分片键(我不是说你不能,但说它与使用INT例子不同,在一般情况下它可能会复杂得多)?

支持使用Elastic Sc​​ale的字符串,但不能用作分片的唯一键。例如,由于相同的原因,字符串可以映射到NVARCHAR(MAX),因此它不支持作为主键。如果你尝试创建它,你将得到错误:

Column... is of a type that is invalid for use as a key column in an index.

用于其中的值存储“决定”分片键(在共享数据库)。例如,您可以配置范围分片映射,并选择1到100之间的所有值将存储在数据库A中,所有100到200的值将存储在数据库B中,依此类推。免费的字符串不适合这种性质。

理论上讲,你可以说你想要在字符串上使用范围,但在大数据系统中它没有任何意义,而Elastic Sc​​ale是基于Azure SQL数据库的大数据系统的解决方案。

我希望这个澄清的问题:-)