Aug. 16, 2014, 12:57 a.m.
今天使用TDDL5,做一个查询的时候,遇到了使用临时表的问题。
我当时使用了诸如
SELECT xxx
FROM table
WHERE xxxxxx
GROUP BY A
ORDER BY B
的语法,服务器报了一个SQL错误,告诉我不能创建临时表,除非指定。
于是突然想起了梦实多次答疑提到的这个问题。
其实,在分布式的场景下,一个group by的执行会被TDDL5的优化器转换成 order by 在各个分表中下发查询。
这是为什么呢?
这就不得不考虑到这个聚合如何在分布式场景下执行了。
每个分表查询的数据取出后需要做一个group by的话,通常分段有序是最高效的,这个看看复杂度就懂了。。
于是转换成了order by后,再group by,就相当于执行了 order by A , group by A 。 这时结果是对A有序的。
这时如果再要对B有序,就麻烦了。。我们的做法是,建立一个临时表再来order by。呵呵。这是需要消耗资源的。但也是可以做的,TDDL可以通过SQL的Hint来开启这个功能。
所以,一般情况下,group by 和 order by 不要指定一个以上的字段,如果数据量较小,聚合的操作也推荐在本地做,而不是用临时表的方式。