資料庫系統最佳化

SQL語句的最佳化是將性能低下的SQL語句轉換成目的相同的性能優異的SQL語句。 人工智慧自動SQL最佳化就是使用人工智慧技術,自動對SQL語句進行重寫,從而找到性能最好的等效SQL語句。

性能的最佳化,考慮問題,應用程式最佳化,發展歷程,人工智慧,自動最佳化實例,開發水平,專家級語句,

性能的最佳化

一個資料庫系統的生命周期可以分成:設計、開發和成品三個階段。在設計階段進行資料庫性能最佳化的成本最低,收益最大。在成品階段進行資料庫性能最佳化的成本最高,收益最小。
資料庫的最佳化通常可以通過對網路、硬體、作業系統、資料庫參數和應用程式的最佳化來進行。最常見的最佳化手段就是對硬體的升級。根據統計,對網路、硬體、作業系統、資料庫參數進行最佳化所獲得的性能提升,全部加起來只占資料庫系統性能提升的40%左右,其餘的60%系統性能提升來自對應用程式的最佳化。許多最佳化專家認為,對應用程式的最佳化可以得到80%的系統性能的提升。

考慮問題

1. 假設你的資料庫不需要存儲特殊字元的能力,尤其是Unicode標準中規定的那些字元,你有沒有在系統中把nchar類型替換成char之類的各種適用的欄位類型?
2. 你是不是在用smalldatetime類型,而不是datetime?如果你不清楚這兩種類型有什麼區別,這是一個簡單介紹:smalldatetime類型可以存儲1900年1月1日至2079年6月6日的日期,而datetime類型把這一範圍擴展到了1753年1月1日至9999年12月31日。你需要這么大的範圍嗎?
3. 你是不是例行公事地使用bit類型來代替smallint類型?如果是這樣,你知道其中的代價嗎?這對你的程式可能並沒有影響,但smallint類型可以建立索引,bit類型不行。
4. SQL Server 2000在bit類型欄位中允許空值,而且是默認的。有人希望這樣,也有人不希望這樣。
5. 你如何處理欄位中的空值?默認方式是允許空值,但更好的辦法是禁止空值,允許零長度的字元串。
6. 你想過表中能容納的最多行數嗎?你比較過這個數值和數據頁的大小8060位元組嗎?
7. 你有沒有好好利用標準欄位?(去看看選單里的工具->選項->標準欄位)
8. 你的表中有沒有一個時間戳欄位?如果沒有的話,你知道什麼時候這種欄位會有用處嗎?
9. 你的表都有區塊索引嗎?你知道一個表什麼時候應該有區塊索引,什麼時候一文不值嗎?
10. 你在命名存儲過程時有沒有用sp_前綴?你有沒有意識到這樣做給性能帶來了什麼影響?

應用程式最佳化

應用程式的最佳化通常可分為兩個方面:原始碼和SQL語句。由於涉及到對程式邏輯的改變,原始碼的最佳化在時間成本和風險上代價很高,而對資料庫系統性能的提升收效有限。
為什麼要最佳化SQL語句
. SQL語句是對資料庫進行操作的惟一途徑,對資料庫系統的性能起著決定性的作用。
. SQL語句消耗了70%至90%的資料庫資源。
. SQL語句獨立於程式設計邏輯,對SQL語句進行最佳化不會影響程式邏輯。
. SQL語句有不同的寫法,在性能上的差異非常大。
. SQL語句易學,但難精通。
最佳化SQL語句的傳統方法是通過手工重寫來對SQL語句進行最佳化。DBA或資深程式設計師通過對SQL語句執行計畫的分析,依靠經驗,嘗試重寫SQL語句,然後對結果和性能進行比較,以試圖找到性能較佳的SQL語句。這種傳統上的作法無法找出SQL語句的所有可能寫法,且依賴於人的經驗,非常耗費時間。

發展歷程

第一代SQL最佳化工具是執行計畫分析工具。這類工具針對輸入的SQL語句,從資料庫提取執行計畫,並解釋執行計畫中關鍵字的含義。
第二代SQL最佳化工具只能提供增加索引的建議,它通過對輸入的SQL語句的執行計畫的分析,來產生是否要增加索引的建議。
第三代SQL最佳化工具不僅分析輸入SQL語句的執行計畫,還對輸入的SQL語句本身進行語法分析,經過分析產生寫法上的改進建議。

人工智慧

人工智慧自動SQL最佳化出現在90年代末。目前在商用資料庫領域,LECCO Technology Limited(靈高科研有限公司)擁有該技術,並提供使用該技術的自動最佳化產品LECCO SQL Expert,它支持Oracle、Sybase、MS SQL Server和IBM DB2資料庫平台。該產品針對資料庫套用的開發和維護階段提供的模組有:SQL語法最佳化器、PL/SQL集成化開發調試環境(IDE)、掃描器、資料庫監視器等。其核心模組SQL 語法最佳化器的工作原理為:①輸入一條源SQL語句;②“人工智慧反饋式搜尋引擎”對輸入的SQL語句,結合檢測到的資料庫結構和索引進行重寫,產生N條等效的SQL語句輸出;③產生的N條等效SQL語句再送入“人工智慧反饋式搜尋引擎”進行重寫,直至無法產生新的輸出或搜尋限額滿;④對輸出的SQL語句進行過濾,選出具有不同執行計畫的SQL語句;⑤對得到的SQL語句進行批量測試,找出性能最好的SQL語句。

自動最佳化實例

假設我們從原始碼中抽取出這條SQL語句(也可以通過內帶的掃描器或監視器獲得SQL語句):
SELECT COUNT(*)
FROM EMPLOYEE
swheresEXISTS (SELECT 'X'
FROM DEPARTMENT
swheresEMP_DEPT=DPT_ID
AND DPT_NAME LIKE 'AC%')
AND EMP_ID IN (SELECT SAL_EMP_ID
FROM EMP_SAL_HIST B
swheresSAL_SALARY > 70000)
按下“最佳化”按鈕後,經過10幾秒,SQL Expert就完成了最佳化的過程,並在這10幾秒的時間裡重寫產生了2267 條等價的SQL語句,其中136條SQL語句有不同的執行計畫。
接下來,我們可以對自動重寫產生的136條SQL語句進行批運行測試,以選出性能最佳的等效SQL語句。按下“批運行” 按鈕,在“終止條件” 頁選擇“最佳運行時間SQL語句”,按“確定”。
經過幾分鐘的測試運行後,我們可以發現SQL124的運行時間和反應時間最短。運行速度約有22.75倍的提升(源SQL語句運行時間為2.73秒,SQL124運行時間為0.12秒)。現在我們就可以把SQL124放入原始碼中,結束一條SQL語句的最佳化工作了。

開發水平

LECCO SQL Expert不僅能夠找到最佳的SQL語句,它所提供的“邊做邊學式訓練”還能夠教開發人員和資料庫管理員如何寫出性能最好的SQL語句。LECCO SQL Expert的“SQL比較器”可以標明源SQL和待選SQL間的不同之處。
以上面最佳化的結果為例,為了查看源SQL語句和SQL124在寫法上有什麼不同,我們可以按下“比較器” 按鈕,對SQL124和源SQL語句進行比較。“SQL 比較器”將SQL124相對於源SQL語句的不同之處以藍顏色表示了出來。如果選擇“雙向比較”複選框,“SQL 比較器”可以將兩條SQL語句的不同之處以藍色表示。當然,我們也可以從源語句和重寫後的SQL 語句中任選兩條進行比較。
從比較的結果可以看到,重寫後的SQL124把第一個Exists改寫成了In;在欄位DPT_ID上進行了合併空字元串的操作,以誘導資料庫先執行子查詢中的
(SELECT DPT_ID||''
FROM DEPARTMENT
WHERE DPT_NAME LIKE 'AC%')
子查詢完成後,再與EMPLOYEE表進行嵌套循環連線(Nested Loop Join)。
如果覺得對寫法的改變難以理解,還可以點中“執行計畫”複選框,通過比較兩條SQL語句的執行計畫的不同,來了解其中的差異。在查看執行計畫過程中,如果有什麼不明白的地方,可以點中“SQL信息按鈕”,再點擊執行計畫看不明白的地方,LECCO SQL Expert的上下文敏感幫助系統將提供執行計畫該處的解釋。
在“SQL比較器”中,選中“統計信息”複選框後,可得到詳細的兩條SQL語句運行時的統計信息比較,這對於學習不同的SQL寫法對資料庫資源的消耗很有幫助。
LECCO SQL Expert最佳化模組的特點
LECCO SQL Expert最佳化模組的特點主要表現為:自動最佳化SQL語句;以獨家的人工智慧知識庫“反饋式搜尋引擎”來重寫性能優異的SQL語句;找出所有等效的SQL語句及可能的執行計畫;保證產生相同的結果;先進的SQL語法分析器能處理最複雜的SQL語句;可以重寫SELECT、SELECT INTO、UPDATE、INSERT和DELETE語句;通過測試運行,為應用程式和資料庫自動找到性能最好的SQL語句;提供微秒級的計時,能夠最佳化Web應用程式和有大量用戶的線上事務處理中運行時間很短的SQL語句;為開發人員提供“邊做邊學式訓練”,迅速提高開發人員的SQL編程技能;提供上下文敏感的執行計畫幫助系統和SQL運行狀態幫助;不是猜測或建議,而是獨一無二的SQL重寫解決方案。

專家級語句

LECCO SQL Expert的出現,使SQL的最佳化變得極其簡單,只要能夠寫出SQL語句,它就能幫用戶找到最好性能的寫法。LECCO SQL Expert不僅能在很短的時間內找到所有可能的最佳化方案,而且能夠通過實際測試,確定最有效的最佳化方案。同以往的資料庫最佳化手段相比較,LECCO SQL Expert將資料庫最佳化技術帶到了一個嶄新的技術高度,依賴人的經驗、耗費大量時間、受人的思維束縛的資料庫最佳化手段已經被高效、省時且準確的自動最佳化軟體所取代了。通過內建的“LECCO小助手”的幫助,即使是SQL的開發新手,也能快速且簡單地寫出專家級的SQL語句。

相關詞條

熱門詞條

聯絡我們