sharding-jdbc源码学习笔记(三)-----sql改写


声明:本文转载自https://my.oschina.net/u/3522232/blog/1555884,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

要解决sql改写或者优化,路由知道后,sql要进行改写或者优化后才能执行。
比如以下场景:
1,查询一个简单的分页,第2条数据开始,第4条数据结束.
不分库下sql:SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=4) t WHERE t.rownum_>2
水平分库下需要改写为:SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=4) t WHERE t.rownum_>0
多库下需要从每个分库下,查出第0条开始,查4条出来进行排序,共8条,然后取排序后的第2到4条。

2,分表情况下,没有指定分表路由字段情况下,所有表都要查询一遍,这时候需要改写表名。
不分库下sql:SELECT * FROM table x
在分2个表时需要改写为SELECT * FROM table_0 x; SELECT * FROM table_1 x两条,并行执行两次sql查询,结果归并。

3,查询带有order by的时候,需要把记录都查询出来,在内存中进行排序。
这个时候需要select列中包括order by字段,如果是不分库情况下,是不用包括的。
不分库下sql:SELECT balance, account_id FROM table x order by create_time
水平分库下需要改写为 SELECT balance, account_id, create_time FROM table x order by create_time

4,查询带有group by的时候,需要把记录都查询出来,在内存中进行排序和分组。
这个时候需要select列中包括group by字段,如果是不分库情况下,是不用包括的。同时这个group by字段要排序,需要把相同的值,做分组统计。
不分库下sql:select SUM(T.UNCASH_AMOUNT) from ACCOUNT t WHERE T.CUSTID LIKE '201304240%' GROUP BY T.CUSTID
水平分库下需要改写为 select SUM(T.UNCASH_AMOUNT),T.CUSTID from ACCOUNT t WHERE T.CUSTID LIKE '201304240%' GROUP BY T.CUSTID ORDER BY T.CUSTID 

5,查询带有avg函数的时候。
这个时候需要把avg(uncashamount)改写为sum(uncashamount)/count(uncashamount)。
原始sql:SELECT avg(uncashamount), account_id FROM table x group by account_id
需要改写为 SELECT sum(uncashamount),count(uncashamount), account_id FROM table x group by account_id

本文发表于2017年10月25日 12:34
(c)注:本文转载自https://my.oschina.net/u/3522232/blog/1555884,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2158 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1