不同与相同的数据表用于相同查询时产生不同的计划

确保表与相同的数据生成相同的物理计划引发的SQL。

写的deepak.bhutada

去年发表在:2022年10月14日

问题

假设你有两个三角洲表test_table_1test_table_2。两个表有相同的模式,同样的数据量,相同的分区,并包含相同数量的文件。你在做一个连接转换与另一个δ表,test_table_join一百万条记录。

当您运行下面的连接查询使用test_table_1test_table_2,不同的物理计划生成,即使两个表是相同的。

查询1:

A % sql SELECT COUNT(*)从TEST_TABLE_1内连接TEST_TABLE_JOIN B A.ID = B.ID

查询2:

A % sql SELECT COUNT(*)从TEST_TABLE_2内连接TEST_TABLE_JOIN B A.ID = B.ID

不同的物理计划生成相同的表时就会导致延迟相比其他查询。

导致

Apache火花产生的实际规划转换基于表统计信息。如果不遵循最佳实践为三角洲表的话,表统计信息可能是不同的,否则即使表相同。如果表统计信息是不同的,火花可能比生成一个不同的计划做了如果两个表有相同的统计数据。

解决方案

如果你注意到不同的物理计划正在生成相同的三角洲表有两种不同的解决方案可以缓解这个问题。您选择的解决方案取决于特定的砖你运行在集群运行时版本。

砖运行时7.3 LTS

使用增量表路径而不是查询的表名。该直接读取的数据路径没有检查表统计信息。

从δa % sql SELECT COUNT (*)。“路径”内连接TEST_TABLE_JOIN B A.ID = B.ID

砖运行时9.1 LTS及以上

运行分析表(AWS|Azure|GCP)和计算统计命令放在桌子上。这个计算表统计信息并将它们存储在元数据。

% sql表test_table_1计算统计分析;


实现解决方案后,重新运行查询和使用diff检查器比较产生的物理两个三角洲表的计划。

现在的计划是相同的。


这篇文章有用吗?