PostgreSQL的最佳特性(公用表表示式/WITH語句),你用了嗎?

sunbiaobiao發表於2014-02-17

SQL語句通常不是很容易理解,特別是你閱讀別人已經寫好的語句。因此,很多人指出我們應該遵循在其他語言中遵循的原則,像加上註釋和功能模組化。我最新注意到一個很多人都沒有使用的Postgres關鍵特性,也就是 @timonk在AWS Re:Invent 大會關於資料倉儲服務Redshift主題演講時指出的一個特性。這個特性實際上使得SQL兼具了可讀性和模組性。在以前,我回頭閱讀自己的幾個月前的SQL語句,通常很難理解,而現在我可以做到這一點。

這個特性就是CTEs,也就是公用表表示式,你有可能稱做它為WITH 語句。和資料庫中檢視一樣,它的主要好處就是,它允許你在當前事務中建立臨時表。你可以大量使用它,因為它允許你思路清晰的構建模組,別人很容易就理解你在做什麼。

讓我們舉個簡單的例子

通過這樣定義臨時表users_tasks,我就可以在後面加上對users_tasks基本查詢語句,像:

有趣的是你可以將它們連在一起。當我知道分配給每個使用者的任務量時,也許我想知道在一個指定的任務上,誰因為對這個任務負責超過了50%而因此造成瓶頸。為了簡化,我們可以使用多種方式,先計算每個任務的總量,然後是每人針對每個任務的負責總量。

現在我們將組合一下然後發現超過50%的使用者

最終目標,我想獲得超負荷工作這的使用者和任務的逗號分隔列表。我們只要簡單地對overloaded_users和 users_tasks的初始列表進行join操作。放在一起可能有點長,但是可讀性強。作為額外幫助,我又在每一層加了註釋。

CTEs通常不如經過精簡優化過的SQL語句效能高。大多數差距小於一倍差距。對我而言,這種為了可讀性作出的折中是毋庸置疑的。Postgres優化器以後肯定會針對這點變的更好。

多說一句,是的我可以用大約10-15行簡短的SQL語句做同樣的事情,但是你也許不能很快的理解它。當你碰到需要保證SQL做正確的事情時,可讀性的優勢就出來了。SQL語句總是有個結果,你對此毫無疑問。確保你SQL語句容易推理是保證正確性的關鍵。

相關文章