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中声明了分配键,以便在两个节点中均匀地分配记录,并在Fact_A中的URL上创建Sort Key。
使用DISTRIBUTION ALL
创建Dim_B表。
答案 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倍,因为每个节点可以并行执行此类查询(大部分)。