sharding-jdbc源碼學習筆記(三)-----sql改寫

要解決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條。sql

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內存

相關文章
相關標籤/搜索