如何優雅地寫SQL?
在進行數據寫操作的時候(尤其是查詢),往往條件是不確定的,需要根據不同的情況「拼接」出一個完整的SQL。但是覺得這樣寫很亂,如何才能更優雅?
你也可以選擇使用stored procedure
所以就有了各種ORM
使用PreparedStatement的Batch功能肯定很優雅
Update大量的數據時, 先Prepare一個INSERT語句再多次的執行, 會導致很多次的網路連接. 要減少JDBC的調用次數改善性能, 你可以使用PreparedStatement的AddBatch()方法一次性發送多個查詢給資料庫. 例如, 讓我們來比較一下下面的例子.
例 1: 多次執行Prepared Statement
PreparedStatement ps = conn.prepareStatement(
"INSERT into employees values (?, ?, ?)");
for (n = 0; n &< 100; n++) { ps.setString(name[n]); ps.setLong(id[n]); ps.setInt(salary[n]); ps.executeUpdate(); }
例 2: 使用Batch
PreparedStatement ps = conn.prepareStatement(
"INSERT into employees values (?, ?, ?)");
for (n = 0; n &< 100; n++) { ps.setString(name[n]); ps.setLong(id[n]); ps.setInt(salary[n]); ps.addBatch(); } ps.executeBatch();
在例 1中, PreparedStatement被用來多次執行INSERT語句. 在這裡, 執行了100次INSERT操作, 共有101次網路往返. 其中,1次往返是預儲statement, 另外100次往返執行每個迭代. 在例2中, 當在100次INSERT操作中使用addBatch()方法時, 只有兩次網路往返. 1次往返是預儲statement, 另一次是執行batch命令. 雖然Batch命令會用到更多的資料庫的CPU周期, 但是通過減少網路往返,性能得到提高. 記住, JDBC的性能最大的增進是減少JDBC驅動與資料庫之間的網路通訊1. prepared statement2. stored procedure3. ORM
樓主的問題是優雅的寫SQL,而不是寫優雅的SQL,所以我的建議就是:
生活中有哪些優雅的小動作? - 生活
著名大牛上個世紀的封面文章never use select * .
只要公司有足夠的資料庫開發,DAO全交給存儲過程也不是不可能,也可以把查詢封裝成視圖
不抖機靈不扯皮,只針對oracle作答。
1. 做10053 trace 2. 在trace file中查找關鍵字final3. 某一個final(基本上是最後一個)後面跟著的sql就是你想要的,很優雅的sql4. 如果不夠優雅,對3找出的sql做10053 trace,並重複上述步驟怎麼沒人提到 iBatis/MyBatis?簡直就是專門為你這種需要而設計出來的。
曾經一個人說,用where 1=1,後面拼條件。
JOOQ 或者queryDsl
select * from 存儲過程 join 新鮮美妙的特性 where 極致到變態的縮進和
優雅?
你應該考慮換掉db,which根本跟scale就是本質上衝突的東西
jooq
我是一個實施,每天面對的就是這些J2EE的產品拼出來的垃圾sql。這種sql非常差,差到要命,一個最次的數據工程師都不會寫出這種爛sql來。一般開發都不會寫sql,不會優化sql,所以寫出來的東西非常慢非常怪。最近我們給自己產品的sql進行了優化,跑批時間從一小時降到56秒,你就說有多差吧。想優雅地寫sql先得讓自己不挨實施的罵。存儲過程?動態sql
存儲過程是最佳選擇。
調試,修改方便,利於閱讀。
功能比拼接SQL更強大。
AND (@p IS NULL OR COLUMNA = @p)只需要翹起小指.......
分而治之
推薦orm,比如laravel的orm就很優雅
推薦閱讀:
※為什麼公司不準使用SQL語句查詢的「*」?
※sql語句面試問題?
※如何自學SQL?
※SQL 查詢按照家庭住址進行分組時,組內平均年齡小於50歲的組中成員的姓名和年齡?
※索引列只要參與了計算, 查詢就會不走索引, 為什麼 MySQL 不對這種情況進行優化?