資料庫sql的效能,初步總結了一下:
1、熟悉業務系統
對業務系統的熟悉程度對整個資料庫系統的效能有很大影響,乙個對業務不熟悉的設計人員,儘管有豐富的資料庫知識,也很難設計出效能最佳的資料庫應用系統。
2、規範化與非規範化
資料庫被規範化後,減少了資料冗餘,資料量變小,資料行變窄。這樣db2的每一頁可以包括更多行,那麼每一區里的資料量更多,從而加速表的掃瞄,改進了單個表的查詢效能。但是,當查詢涉及多個表的時候,需要用很多連線操作把資訊從各個表中組合在一起,導致更高的cpu和i/o花銷。那麼,有很多時候需要在規範化和非規範化之間保持平衡,用適當的冗餘資訊來減少系統開銷,用空間代價來換取時間代價。有訂單資訊表orderdetail,它裡面記錄了投遞員資訊,收款員資訊,物品資訊,**策略,客戶資訊…..這些資訊分別在投遞員資訊表、收款員資訊表、物品資訊表、**策略表、客戶資訊表中存放。如果按照規範化的要求,orderdetail查詢時就必須要與這麼多個表進行連線或者巢狀查詢。如果orderdetail表中的資料量是在百萬級的,那麼一次查詢所需要的時間可能會達到好幾個小時。事實上,只要在設計時保證資料的邏輯有效性,很多資訊都可以直接冗餘在orderdetail表中,這些冗餘的資料能夠極大的提高查詢的效率,從而減少cpu和i/o操作。
3、資料條帶化
如果乙個表的記錄條數超過一定的規模,那麼最基本的查詢操作也會受到影響,需要將該錶根據日期水平劃分,把最近、最經常用的資料和歷史的、不經常用的資料劃分開來,或是根據地理位置、部門等等進行劃分。還有一種劃分方式――垂直劃分,即把乙個屬性列很多的表分割成好幾個小表,比如把經常用到的屬性放在乙個表裡,不經常用到的屬性放在另乙個表裡,這樣可以加快表的掃瞄,提高效率。
4、選擇資料型別
對每一屬性選擇什麼樣的資料型別很大程度上依據表的要求,但是在不違背表要求的前提下,選擇適當的資料型別可以提高系統效能。比如有text列存放一本書的資訊,用blob而不是character(1024),blob存放的是指標或者檔案參照變數,真正的文字資訊可以放在資料庫之外,從而減少資料庫儲存空間,使得程式執行的速度提高。db2提供了udt(user defined datatypes)功能,使用者可以根據自己的需要定義自己的資料型別。
5、選擇索引
索引是資料庫中重要的資料結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用ibm最先提出的isam索引結構。使用索引可以快速、直接、有序的訪問資料。索引的建立雖然加快了查詢,另一方面卻將低了資料更新的速度,因為新資料不僅要增加到表中,也要增加到索引中。另外,索引還需要額外的磁碟空間和維護開銷。因此,要合理使用索引:
◆在經常進行連線,但是沒有指定為外來鍵的屬性列上建立索引。
◆在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引。按索引來排序或分組,可以提高效率。
◆在條件表示式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。
◆如果待排序的列有多個,可以在這些列上建立復合索引(compound index),即索引由多個字段復合而成。
查詢優化
現在的資料庫產品在系統查詢優化方面已經做得越來越好,但由於使用者提交的sql語句是系統優化的基礎,很難設想乙個原本糟糕的查詢計畫經過系統的優化之後會變得高效,因此使用者所寫語句的優劣至關重要。下面重點說明改善使用者查詢計畫的解決方案。
1、排序
在很多時候,應當簡化或避免對大型表進行重複的排序。當能夠利用索引自動以適當的次序產生輸出時,可以避免排序的步驟,當以下的情況發生時,排序就不能省略:
◆索引中不包括乙個或幾個待排序的列;
◆group by或order by子句中列的次序與索引的次序不一樣;
◆排序的列來自不同的表。
為了避免不必要的排序,就要正確地增建索引,合理地合併資料庫表,儘管有時可能影響表的規範化,但相對於效率的提高是值得的。如果排序不可避免,那麼應當試圖簡化它,如縮小排序列的範圍等。
2、主鍵
主鍵用整型會極大的提高查詢效率,而字元型的比較開銷要比整型的比較開銷大很多,用字元型資料作主鍵會使資料插入、更新與查詢的效率降低。資料量小的時候這點降低可能不會被注意,可是當資料量大的時候,小的改進也能夠提高系統的響應速度。
3、巢狀查詢
在sql語言中,乙個查詢塊可以作為另乙個查詢塊中謂詞的乙個運算元。因此,sql查詢可以層層巢狀。例如在乙個大型分布式資料庫系統中,有訂單表order、訂單資訊表orderdetail,如果需要兩表關聯查詢:
select createuserfrom order
where orderno in
( select orderno
from orderdetail
where price=0.5)
在這個查詢中,找出報紙單價為0.5元的收訂員名單。下層查詢返回一組值給上層查詢,然後由上層查詢塊再根據下層塊提供的值繼續查詢。在這種巢狀查詢中,對上層查詢的每乙個值orderno,下層查詢都要對錶orderdetail進行全部掃瞄,執行效率顯然不會高。在該查詢中,有2層巢狀,如果每層都查詢1000行,那麼這個查詢就要查詢100萬行資料。在系統開銷中,對錶order的掃瞄佔82%,對錶orderdetail的搜尋佔16%。如果我們用連線來代替,即:
select createuserfrom order,orderdetail
where order.orderno=orderdetail.orderno and praice=0.5
那麼對錶order的掃瞄佔74%,對錶orderdetail的搜尋佔14%。
而且,乙個列的標籤同時在主查詢和where子句中的查詢中出現,那麼很可能當主查詢中的列值改變之後,子查詢必須重新查詢一次。查詢巢狀層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。
4、萬用字元
在sql語句中,like關鍵字支援萬用字元匹配,但這種匹配特別耗費時間。例如:select * from order where createuser like 『m_ _ _』 。即使在createuser欄位上建立了索引,在這種情況下也還是採用順序掃瞄的方式,order表中有1000條記錄,就需要比較1000次。如果把語句改為select * from order where createuser >』m』 and createuser <』n』,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。
5、distinct
使用distinct是為了保證在結果集中不出現重複值,但是distinct會產生一張工作表,並進行排序來刪除重覆記錄,這會大大增加查詢和i/o的操作次數。因此應當避免使用distinct關鍵字。
6、負邏輯
負邏輯如!=、<>、not in等,都會導致db2用表掃瞄來完成查詢。當表較大時,會嚴重影響系統效能,可以用別的操作來代替。
7、臨時表
使用臨時表時資料庫會在磁碟中建立相應的資料結構,因為記憶體的訪問速度遠遠大於外部儲存器的訪問速度,在複雜查詢中使用臨時表時,中間結果會被匯入到臨時表中,這種磁碟操作會大大降低查詢效率。另外,在分布式系統中,臨時表的使用還會帶來多個查詢程序之間的同步問題。所以,在進行複雜查詢時最好不要使用臨時表。
8、儲存過程
db2中的stored procedure builder可以產生儲存過程,執行並測試儲存過程。儲存過程可以包含巨大而複雜的查詢或sql操作,經過編譯後儲存在db2資料庫中。使用者在多次使用同樣的sql操作時,可以先把這些sql操作做成儲存過程,在需要用到的地方直接引用其名字進行呼叫。儲存過程在第一次執行時建立優化的查詢方案,db2將查詢方案儲存在快取記憶體裡,以後呼叫執行時可以直接從快取記憶體執行,省去了優化和編譯的階段,節省了執行時間,從而提高效率和系統利用率。
最優的查詢方案按照某些標準選擇往往不可行,要根據實際的要求和具體情況,通過比較進行選擇。db2提供的query patroller可以對不同的查詢方案的查詢代價進行比較,通過追蹤查詢語句,返回查詢不同階段的系統開銷,從而作出最佳選擇。db2提供的performance monitor也對整個資料庫系統的效能進行監控,包括i/o時間、查詢次數、排序時間、同步讀寫時間等等。
資料庫系統的併發控制也能影響系統效能。多個使用者的同時操作可能導致資料的不一致性,db2為了防止同時修改造成資料丟失和訪問未被提交的資料,以及資料的保護讀,採用lock機制來實現控制。
db2中可以對錶空間、表、表列和索引加鎖。鎖的粒度越大,鎖越簡單,開銷小,併發度低;粒度小,鎖機制複雜,開銷大,併發度高。大型系統在併發處理中如果遇到所要分配的資源處於鎖定狀態,系統會把程序掛起等待。如果乙個很耗時的查詢操作工作於乙個經常使用的表上,此時使用表一級鎖,意味著整個系統都要等待你的查詢結束以後才能夠繼續執行。所以在複雜查詢中,盡量避免使用表一級鎖。如果有這一類的需要該怎麼辦呢?可以利用檢視來解決這一類問題。檢視避免了對錶的直接操作,同時有能夠保證資料庫的高效運轉。
Android開發效能優化
1 盡量不適用靜態引用,以避免記憶體溢位 2 對進行壓縮 3 listview的優化 4 自定義view中減少measure layout draw 中的耗時操作即它們執行次數 5 不在ui執行緒總做耗時操作,網路請求 資料庫操作 複雜計算等放在子執行緒 6 webview退出時手動銷毀 方法未知 ...
web開發效能優化
1 查詢出的資料量過大 可以採用多次查詢,其他的方法降低資料量 盡量採取分頁查詢資料 2 鎖或者死鎖 這也是查詢慢最常見的問題,是程式設計的缺陷 3 返回了不必要的行和列 用or的字句可以分解成多個查詢,並且通過union鏈結多個查詢。它們的速度只與是否使用索引有關,如果查詢需要用到聯合索引,用un...
遊戲開發效能優化經驗總結
優化概論 說起遊戲的優化,在遊戲開發中經常分為這幾步 首先要確定遊戲中經常會出現哪些問題 profile 然後確定在哪些方向進行效能優化 analyze 最後再盡可能將問題逐個解決 solve 遊戲開發中一定是先做工具,進行profile,再進行優化,所以,說優化就不得不再扯一下profile 常見...