我正在筛选一个名为mycolumn的字符串列。我能想到以下3种过滤方法,哪种会达到更好的性能?
-- method #1
where
( mycolumn = 'FixedStringA.FixedStringB.VariableStringA.FixedString'
OR mycolumn = 'FixedStringA.FixedStringB.VariableStringB.FixedString'
OR mycolumn = 'FixedStringA.FixedStringB.VariableStringC.FixedString'
OR mycolumn = 'FixedStringA.FixedStringB.VariableStringD.FixedString' );
-- method #2
where mycolumn like '%//.FixedString';
-- method #3
where split(mycolumn,'//.')[3] = 'FixedString';
请知道fixedstringa和fixedstringb就像常量,它们的值将保持不变,这就是为什么称它们为固定字符串。mycolumn不是您信息的分区键。
1条答案
按热度按时间sz81bmfz1#
在方法3中,应该是
\\.
不是//.
看看这个答案:regexp中的dot同样在方法2中,它可能应该是
like '%.FixedString'
你也可以像这样使用:您不会注意到配置单元中的差异,因为它无论如何都是完全扫描,并且是并行运行的。
我更喜欢
RLIKE '\\.FixedString$'
因为它很短而且像regexp一样强大。拆分和生成数组(方法3)将对内存和垃圾收集器造成更大的压力,您将创建和释放更多的对象。
方法一也不错,但看起来不那么优雅。如果您有orc文件中的内部索引,方法1会更好,您需要自己检查它。