为什么Azure Elastic Sc​​ale不支持字符串数据类型作为分片键?

时间:2017-09-20 07:46:32

标签: .net azure azure-sql-database

来自Microsoft Azure文档:

  

Elastic Sc​​ale支持以下.Net框架类型作为分片   键:

     
      
  • 整数
  •   
  •   
  • GUID
  •   
  • 字节[]
  •   
  • 日期时间
  •   
  • 的入库时间
  •   
  • DATETIMEOFFSET
  •   

为什么不支持字符串?

2 个答案:

答案 0 :(得分:2)

如上面的海报所示,无约束字符串是索引数据库中内容的低效方法(分片映射存储在SQL数据库中)。在引擎盖下,弹性数据库客户端库(EDCL)将所有支持的类型规范化为byte [],并在数据库的分片映射中使用它。如果将字符串转换为支持的类型之一,则可以有效地将字符串用作键。

您可以在WingtipSaaS sample application中看到这一点,它使用场地名称作为关键字。我们选择将名称转换为整数键(为了演示和探索目的,更容易在代码中跟踪整数值),但可能已经在byte []处停止了。使用名称的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)

答案 1 :(得分:1)

美好的一天,

这些.Net框架类型可用作分片键 你如何使用自由文本作为分片键(我不是说你不能说它与使用INT不一样,并且在一般情况下可能会复杂得多)?

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

  

Column ...的类型无法用作索引中的键列。

用于"决定"的分片键存储值的位置(在哪个共享数据库中)。例如,您可以配置范围分片映射,并选择1到100之间的所有值都将存储在数据库A中,所有100到200之间的值将存储在数据库B中,依此类推。自由弦不适合这种性质。

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

我希望这澄清问题: - )