1. 程式人生 > >小米開源的自研智慧SQL優化與改寫工具SOAR使用指南

小米開源的自研智慧SQL優化與改寫工具SOAR使用指南

本文簡述了SOAR的下載安裝和使用方法,並介紹了SOAR的基礎設定和應用的四個場景。

在10月20日的開源先鋒日(OSCAR)上,小米開源了自研的SOAR(SQL Optimizer And Rewriter)。這是一款智慧SQL優化和改寫工具,開發人員可以直接通過此工具快速的對自己的SQL進行質量檢查,生成評估報告,防止將問題SQL帶到線上從而導致服務質量下降。它不僅能夠儘可能地提高線上程式碼質量,還能避免一些由於人為疏漏而帶來的隱患。

下載安裝

SOAR使用Go語言編寫,天然具備作業系統跨平臺屬性,您可以在Github上的Release版本按照對應作業系統直接下載編譯好的二進位制檔案使用。如果您是資深定製使用者也可以

點選我下載程式碼,按下圖所示編譯安裝。

二進位制安裝

原始碼安裝

使用指南

快速上手

安裝完成之後無需進行任何配置,只需要執行下面這條命令,就可以立刻生成一份Markdown格式的SQL評審報告,根據報告中的建議對SQL進行修改。

使用配置

SOAR提供了豐富的配置引數,可以根據不同的使用場景指定不同的配置項來定製私有的評審建議。不過您也無須擔心這些配置會對使用帶來困擾,大部分配置選項是為有特殊需求使用者準備的,即使不做任何配置也能夠體驗到SOAR的基礎的功能。

SOAR的配置檔案為YAML[1]格式,在一般情況下只需要配置online-dsn, test-dsn, log-output等少數幾個引數,您就可以體驗到SOAR提供的絕大部分的功能了。

下面我將介紹一下SOAR中常用的一些基礎配置。

配置環境

由於很多的功能需要資料庫的元資料來進行輔助判斷,所以當不指定資料庫環境的時候,很多功能將會採取降級的策略,所以我們強烈建議您在配置檔案中指定相關資料庫環境。為了保護線上資料庫的安全,我們將資料庫環境區分為線上和測試兩種環境,但是這並不意味著您一定需要兩個資料庫環境,但至少建議您指定一個測試環境。

這裡需要注意的是,因為我們會在測試環境中做一些風險相對較高的操作,為了防止使用者由於配置疏忽導致線上資料受損,我們添加了allow-online-as-test引數來保證您確實是希望將線上環境做為測試環境來使用。所以當您指定的兩個整合環境相同時,請指定allow-online-as-test為true,否則SOAR將不會進行評審。

輸出格式

SOAR自身支援了非常豐富的輸出格式,除了預設的Markdown格式以外,SOAR還支援以 HTML或JSON的格式進行輸出。

SOAR自帶的一些工具也會以report-type的形式提供。比如SQL重寫,EXPLAIN分析,SQL 指紋,SQL美化等15種輸出格式,每一種report-type都對應著不同的功能。你可以通過如下命令檢視SOAR支援的輸出型別。

獲取幫助

除了上述提到的這些功能,SOAR還提供了很多其他的配置項,由於篇幅所限,具體詳情您可以到SOAR專案文件中檢視。使用上如果碰到疑問,可以到這裡[2]提交Issue,或在Gitter[3]中聯絡我們。

場景介紹

場景 線上環境 測試環境 應用型別
場景一 日常優化,完整的建議,推薦
場景二 新申請資源,環境初始化測試
場景三 盲測,試用,無EXPLAN和索引建議
場景四 用線上環境當測試環境,不推薦

場景一

這個場景是我們日常工作中最常見的場景,它主要應用於線上服務日常建立表或表結構表更。

SOAR對SQL進行分析時,會先從SQL語句中獲取基本資訊,然後將所有涉及到的庫表結構元資料從線上環境中獲取,並同步到測試環境中進行更進一步的分析。在這個場景下,SOAR能提供最全面的功能支援。不僅能夠輸出110多項SQL檢查,還能夠對涉及到的庫表進行索引分析,而且還可以輸出EXPLAIN、PROFILE等資訊來輔助DBA或開發者進行效能調優和問題定位。SQL改寫也會依賴元資料的支援,在此場景下的功能是支援的最全面的。

場景二

這個場景適用於首次申請資料庫資源的情況,此時還沒有已經存在的線上環境與之相對應。

在這個場景下,SQL檔案主要包含的是建庫建表語句,SOAR會根據DDL生成相應的測試環境,並從該環境中獲取元資料進行優化分析。

場景三

在這一場景下由於沒有配置線上環境和測試環境依賴,缺少很多分析時必要的元資料,且無法獲取EXPLAIN等資訊,在這種情況下SOAR將會進行功能降級,只給予部分不依賴資料庫環境才能給出的建議(絕大部分的啟發式建議和小部分SQL改寫)。

雖然在這個場景下服務的功能並不全面,但執行速度也是最快的,這種場景依然能提供110多種啟發式建議,特別適合於對SQL本身的檢測,比如作為一個本地化的SQL Linter IDE外掛。

場景四

這一場景其實與場景二是一樣的,在這一場景下只配置了線上環境,且開啟了允許線上環境作為測試環境。那麼在不指定測試環境的情況下SOAR將會把測試環境也指向線上環境。

SOAR在進行評審時,為了保證多個客戶端能夠同時在一個環境內進行評審,會在測試環境中生成一個臨時資料庫,評審正常結束後再將該臨時資料庫刪除。所以我們非常不建議將線上資料庫環境做為測試環境,防止在某些未知的極端條件下對資料庫產生嚴重影響。

參考

[1]https://en.wikipedia.org/wiki/YAML

[2]https://github.com/XiaoMi/soar/issues

[3]https://gitter.im/xiaomi-dba/soar

本文首發於公眾號“小米運維”,點選檢視原文