Redshift - 查询性能问题

时间:2016-03-16 06:04:04

标签: amazon-web-services amazon-redshift

SELECT
  a.id,
  b.url as codingurl 
FROM fact_A a 
INNER JOIN dim_B b
ON strpos(a.url,b.url)> 0
  • Fact_A中的记录数:2百万
  • 记录Dim_B中的计数:1500
  • 执行时间:10分钟
  • 节点数:2

有人可以帮助我理解为什么上面的查询需要更多时间来执行吗?

我们在Fact_A中声明了分配键,以便在两个节点中均匀地分配记录,并在Fact_A中的URL上创建Sort Key。

使用DISTRIBUTION ALL创建Dim_B表。

1 个答案:

答案 0 :(得分:0)

Redshift没有全文搜索索引或前缀索引,因此像这样的查询(在过滤器中使用strpos)将导致全表扫描,执行strpos 30亿次。 / p>

根据dim_B中的网址,您可以通过将前缀提取到单独的列中来优化此操作。例如,如果您总是比较http [s]:// hostname / part1 / part2 / part3形式的子路径,那么您可以在fact_A和dim_B中将“part1 / part2 / part3”作为单独的列提取出来,并使其成为dist和sort键。

您还可以依赖Redshift的并行性。如果您将群集从2个节点调整为20个节点,您应该会立即看到性能提升8-10倍,因为每个节点可以并行执行此类查询(大部分)。