從優化達夢執行計劃輸出,談產品交互
原創近期,開始嘗試做些國產數據庫的評測工作,特別是與SQL相關的,也輸出幾篇文章。在這一過程中,對國產數據庫使用感覺還是存在不小優化空間。這里以達夢數據庫的執行計劃輸出為例,談談自己對產品交互優化的一些看法。
1. 達夢數據庫計劃輸出及優化
(1)達夢執行計劃現狀
作為DBA最常用的功能,了解SQL語句的執行計劃很重要。達夢數據庫可通過多種方式來查看,常用的就是Explain命令。坦白講,第一次看到達夢數據庫的執行計劃,是讓我感到比較郁悶的,因為它與其他數據庫的執行計劃還是存在很大差別。如下圖,就是一條簡單的執行計劃示例。
當看到這一輸出結果,在不參考文檔的情況下,有很多是不太理解的。
- 沒有標題欄,每部分內容不知含義,如方括號中一串數字
- 有操作符部分,但只看名稱部分勉強能猜出來,有的完全猜不出
- 操作符后面應該是每種操作符的參數,操作符不同參數而已,各參數還有輸入值等
- 整體縮進式結構,應該跟其他數據庫類似,可反應操作符執行順序
達夢也有其他圖形化工具,情況會好一些。如在達夢最近推出的SQLark百靈中,通過分欄顯示清晰了很多,當然還是存在不知含義等問題。
于是,只能借助達夢文檔,來回查看操作符含義、參數含義等等。如下圖是達夢官方提供的執行計劃操作文檔,寫的還是挺清楚的。當然,往復切換查看文檔和執行計劃的過程還是令人不悅,是不是能有更好的一些方法呢...
(2)達夢執行計劃優化
有了上面這些問題,自己還是想動手嘗試改變下。近幾年動手少了,趕鴨子上架拿 Python 試著改造下。這里面突出有幾個問題想要優化下:一是輸出格式的問題,可能多年受Oracle、MySQL的影響,還是覺得表格形式的比較習慣;二是對操作符不熟悉,因此最好能一屏顯示執行計劃及對應操作符的含義,方便上下對照來看;三是執行計劃還會受到如統計信息、內核參數等影響,有可能都顯示出來。好了,有了需求可以動手了...
首先,第一個問題就是搞環境,開始以為很簡單的事。用Docker起了個達夢實例,然后在本地裝Python連達夢庫。之前用cx_Oracle、MySQLdb、PyMySQL連接Oracle、MySQL都是很簡單,但參照達夢官方文檔使用Python連接,遇到了一堆的問題;前后試了一小時,放棄...選擇用比較挫的方式,直接程序中調用達夢DiSQL命令行工具方式。然后,就是如何將達夢的知識庫(執行計劃操作符含義)與程序產生互動。達夢的官方文檔不錯,寫了個簡單的爬蟲將信息導出,存儲在程序中作為元信息使用;剩下就是做些字符串處理,規格化一下。第三,就是字符終端輸出,這個有點基礎調用現成包就可以。于是有了下面這個小原型。
調用后輸出結果如下:
頭部是一些數據庫、用戶、語句信息,中間部分是表格化的執行計劃和遇到的操作符及參數含義說明,后面是語句中使用到的表及索引的統計信息情況,整體感覺舒服了很多。換一個復雜點的例子。
2. 產品交互優化的幾點看法
通過上面優化的小例子,其實也反應出在產品交互上、功能設計上值得關注的幾點。
(1)選擇用戶“最熟悉”方式
了解、熟悉一款產品代價是挺高的,作為基礎軟件的數據庫更是如此。如何讓用戶快速了解、上手你的產品是很關鍵的。曾跟某國產數據庫廠商聊天,對方談到自己是可以全方位對標某國際大廠數據庫的,那么讓用戶快速了解你就很簡單了。我的建議就是列一個表格,將兩個數據庫從設計、開發、運維等多角度分列出來,然后再細分子項逐一對比。用戶可以從中很快速地了解你的產品能做什么、能做到什么程度。上面是從大的方面來看,那小的方面也是如此。如本文談到的執行計劃輸出,就可以以一種人們更為熟悉的方式來交互。例如 Oracle 的執行計劃輸出,就給我們立了一個很好的標桿,特別是其內部包含的豐富信息,可以極大方便 DBA 的日常工作。當一名 Oracle DBA 轉型時,就感到很舒適,之前的很多積累還可以復用。
(2)知道用戶“最需要”什么
作為一名產品經理,了解用戶最需要什么是基礎;但就是這個最基礎的問題,往往沒有得到足夠的關注。有時產品的很多功能是產品經理意淫出來的,而用戶最樸素的基礎想法并沒有得到關注。這就需要產品經理真正是站在客戶的角度、站在用戶一線,才能觀察體會出來。最直接的方式就是當一天的“客戶”,使用自己的產品干干一線工作,然后就能理解用戶的吐槽了。近些年我也會參與到不少廠商的評測工作,經常會發現交互性的問題,對方感到很詫異時,我只能苦笑道“沒當過DBA吧”。舉個小例子,你了解一款數據庫的備份功能,你會考慮哪些問題:物理備份、邏輯備份怎么做?如何做增量備份?如何查看備份集?如何查看備份進度?失敗了怎么辦,等等不一而足。這些都是來自一線工作中會遇到的。上例中,我最需要的就是快速理解操作符含義,通過幫助形式就可以方便理解。
(3)引導用戶“需關注”什么
除了用戶需要什么之外,作為對產品更為了解的一方,產品還應有意識地提供更多更有價值的內容,方便用戶對這個功能的理解和使用。用戶初次接觸產品,很難對產品有全面的了解,知道往往都是片面的一些點,如果通過功能構建將功能關聯起來,讓用戶有意識地去關注,往往會取的不錯的效果。這相當于把一個一個的知識點,連接成一張網,讓用戶有了更為全面的理解。如上面例子中,顯示執行計劃是用戶的初衷,但其本質的需求是理解為什么SQL走了這樣的執行計劃,那么可能影響、改變執行計劃的因素都應該是用戶需要了解的。例如:統計信息是不是完整的?數據是不是有傾斜?使用綁定變量了嗎?等等,這些問題都是需要用戶關注的。