我使用Redshift SQL语法,并想知道如何将表中每个条目的字符串id转换为数字id (因为表之间的数字联接应该比字符串联接快得多,效率也更高)。
当前,ids看起来是这样的--一串同时包含数字和字母的字符串。
01r00001ABCDeAAF
01r00001IJKLmAAN
...
01r00001OPQRtAAN
我想要的是将其转换为一个纯粹的数字标识符,使用字符串id作为输入,并确保每个输出都是唯一的,并且只对应于单个输入而不发生冲突(可以跨表复制,以便能够进行准确的连接)。
我尝试在SQL中对列使用一些散列函数,比如校验和()和BINARY_CHECKSUM(),但我有点不清楚在这里哪一个最适用--我知道有些是区分大小写的,而另一些则不是,而有些则生成冲突,而另一些则不适用。
发布于 2019-08-12 12:00:17
首先,字符串和整数的引用基于一个完全不同的数据库。我不会从Server性能推广到其他数据库,特别是大规模并行的列数据库。还有很多信息是脱离上下文的,并被概括为错误的情况。
其次,您可以在中的表上进行测试。生成数据和进行测试应该比修改现有数据更快。你可能会发现没有必要改变任何东西。
在做出这样的更改之前,您需要了解“引擎盖下”发生了什么,特别是如果您认为是出于性能原因。
由于各种原因,字符串可能会很麻烦。首先,它们可以有不同的排序规则或字符集--隐藏的信息。这种差异将排除索引的使用-数据库中的一个主要问题,如Server。在Redshift中,不使用索引通常不是问题。
字符串也可以有可变长度。这使得索引的效率略有下降。与数字相比,它们还需要更多的开销,因为需要考虑这些排序规则和字符集。它们也需要按字符进行比较,而大多数硬件都有内置的数字比较。与移动数据的成本相比,这里的额外周期通常是最小的。
当您在Amazon中执行join
时,它要做的第一件事是配置数据,可能是通过散列值并将数据发送到并行环境中的相同节点。移动数据是昂贵的。哈希值,更不用说了。
在Redshift中,您应该更加关注数据是如何分布的。虽然我还没有对其进行测试,但是添加一个作为数字的新列可能会使查询成本更高,因为在一个列数据库中,引用的列数会影响性能。
https://stackoverflow.com/questions/57459782
复制相似问题