我有一个倾斜的数据集,其中大多数行属于我的最佳候选分发键的最大10个值。我的数据是由两个大表组成的,它们只共享两个键--我最好的候选密钥,加上另一个,但其中一个在80%的情况下是空的,所以我将其作为一个选项进行了折扣。
传统观点认为,如果数据有偏差,我应该使用循环分布。查看表上的联接所产生的解释计划,我看到我的候选列是洗牌的键。这使我怀疑是否应该将分发版从循环更改为散列分发,从而节省每次执行时移动数据所需的时间。
我的逻辑正确吗?在使用分布式sql时,我觉得这违背了传统的观点。我不希望在不需要此连接的地方进行任何查询,因此这可能是其他人看到好处的地方。
发布于 2018-05-18 11:42:37
由于数据的性质,循环总是需要数据移动,但它不一定会对您的性能造成灾难性影响。将其用于倾斜数据的原因是,当您按散列分发时,会为每个值生成唯一的散列,并相应地在60个分发版中分布行。在您的示例中,大多数数据将以一个(或少数几个)分布(S)结束,因此您没有利用可供您使用的计算。假设您只有机会利用您可以使用的20%的计算资源,而其余的资源则处于空闲状态。
好的哈希列的要求是:它们不应该是可更新的,而不是NULLable,应该有大量不同的值,甚至是分布。
您有从其他人创建连接密钥的选项吗?这可以帮助创建一个更均匀的发行版,并且只要在两个表之间的联接中使用它,就会很有用。
只是其他一些建议,为您的关键查询设计,使用SQL中的其他一些功能,如正确的DWU、资源类、非聚集索引、自动统计。请注意,SQL的第二代现在是可用的。
HTH
https://dba.stackexchange.com/questions/207167
复制相似问题