我有以下问题:
SELECT
ducc.*, dl.LOCATIONID, dl.LOCATIONNAME
FROM [table1] ducc
LEFT OUTER JOIN EACH [table2] dl
ON ducc.LOCATIONID = dl.LOCATIONID
WHERE ABS(ducc.LOCATIONID % 30) = 0它给了我“混乱失败的错误:一次洗牌不能超过3.00T。这个查询中的一个洗牌分区超过了7.68G。解决这个错误的策略可以在go/dremelfaq上使用。”
我假设它不能正确地排序和洗牌,因为我从table2获得了两列,因为置换的复杂性很高。
有这方面的工作吗?
发布于 2014-04-23 18:59:29
谢谢乔丹的洞察力
我想案件2是问题的原因。
“连接键的分布非常不平衡。也就是说,如果一个LOCATIONID占table1中行的很大一部分。有时这可能是预期的。有时是因为默认值。例如,如果table1有很多不知道LOCATIONID的行,那么按照约定,使用0就意味着许多数据会被散列到相同的位置。”
表1.LOCATIONID中的大多数值为NULL。所以,尽管我有所有的表2.是唯一的,但它失败了。
一旦我加入了包含table1和table2中99%不同值的列,它就像一种魅力。
发布于 2014-04-23 15:29:18
有几种可能性:
注意,对于这些问题,您正在进行的分区(ABS(ducc.LOCATIONID % 30 = 0) )并不一定有帮助,因为满足这些要求的值都将被散列到相同的位置。
你有几件事可以尝试:
https://stackoverflow.com/questions/23232062
复制相似问题