遞迴sql的功率到達MySQL和MariaDB

jasno發表於2017-10-23

遞迴式sql是當今許多現代資料庫中最吸引人、最強大、最危險的特性之一,它使用了第一99標準中首次引入的共同表示式(CTE)。中的的第一個實現開始出現在2006-7中,在MySQL 8.0和MariaDB版本10.2.2中出現。


公共表表示式(帶遞迴子句…子句)

遞迴式sql是通過使用共同或CTE實現的,它是一個臨時命名的resultset,它是從一個簡單的查詢派生出來的,並在選擇、插入、更新或刪除語句的執行範圍內定義。CTE通常用於簡化和(或)將程式碼轉換為可讀性更強的部分,從而提高了sql程式碼的可讀性。中的的一個“特性”是能夠遞迴引用命名的resultset,從而遞迴地引用。


通過遞迴的sql查詢,您可以實現您不可能想象到的在這種型別的sql和它執行的速度上是可能的事情。您可以解決許多型別的業務問題,甚至重寫一些複雜的sql/應用程式邏輯,直到對資料庫進行簡單的recursiveSQL呼叫。

遞迴CTE的一些有用的用法示例是,您可以使用它來查詢資料中的空白,建立組織結構圖並建立測試資料。

我最喜歡的使用遞迴式sql查詢的方法是,根據資料的複雜性和可用的資料庫/系統資源,生成大量的測試資料。使用遞迴CTE,我們可以在非常短的時間內產生數百、數千或數百萬條記錄,然後只限於可用的資料庫記憶體和其他資料庫/系統資源。與我所見和經歷的其他測試資料過程相比,遞迴查詢產生的測試資料更快。
此外,已經證明遞迴查詢比其他需要幾天的查詢在數分鐘內執行的查詢要好。


遞迴這個詞說的都是。您有一個查詢,該查詢會反覆呼叫自己的某個起始點,即極其重要a.a終點(A)安全出口就像我說的那樣。如果你沒有一個安全的退出,或者你的遞迴公式超出它,你就陷入了深深的麻煩。您的查詢將進入無限環導致非常高的cpu和非常高的日誌利用率,這將導致記憶體和/或儲存耗盡。如果你的查詢失控,你必須快速思考並停止它。如果您不能這樣做,那麼立即通知您的DBA,這樣他/她就可以通過殺死runnaway執行緒來阻止資料庫系統的阻塞。


相關文章