数据库调优(4)
6.事務處理調優
數據庫的日常運行過程中可能面臨多個用戶同時對數據庫的并發操作帶來的數據不一 致的問題,如:丟失更新、臟讀和不可重復讀等。并發控制的主要方法是封鎖,鎖就是在一段時間內禁止用戶做某些操作以避免產生數據不一致。
數據庫應用程序將其工作分成若干個事務進行處理。當一個事務執行時,它訪問數據庫 并執行一些本地計算。開發人員可以假設每一個事務都會被隔離地執行—沒有任何并發動 作。因為隔離的概念提供了透明性,這種對事務處理方式的保證有時被稱為原子性保證。但 是,如果把應用程序中的事務序列作為一個整體來看,則并沒有上面所說的那種保證。在一 個應用程序執行的兩個事務之間,可能會執行另外一個應用程序的事務,而且第二個應用程 序的執行可能修改了第一個應用程序中的兩個事務(或其中的一個)需要訪問的數據項。因 此,事務的長度對保證正確性有著重要影響。
盡管將事務切分成較小粒度可以提高執行效率,但會因此破壞執行的正確性。這種性能 和正確性之間的矛盾充斥并發控制的整個調優過程。考慮事務的性能我們要考慮到:事務使 用的鎖的個數(在所有其他條件相同的情況下,使用的鎖個數越少,性能越好);鎖的類型? (讀鎖對性能更有利);事務持有鎖的時間長短(持有時間越短,性能越好)。
關于鎖的調優 有以下建議:
(1)使用特殊的系統程序來處理長的讀操作。對于一個只讀的事務R 來說,它“看到” 的數據庫的狀態一直是事務R? 開始時的狀態。只讀查詢可以不需要封鎖開銷,在不造成阻 塞和死鎖的情況下,只讀的查詢可以與其他對同一數據進行更新的較小的事務并行地執行。
(2)消除不必要的封鎖。只有一個事務執行時,或所有事務都是只讀事務時,用戶應 利用配置選項減少鎖的個數,從而減小鎖管理模塊的內存開銷和執行封鎖操作的處理時間開 銷。
(3)根據事務的內容將事務切分成較小的事務。事務所要求的鎖越多,它需要等待其 他事務釋放某個鎖的可能就越大。事務T 執行的時間越長,被T? 阻塞的事務等待的時間可 能就越長。因此,在可能發生阻塞的情況下,利用較短的事務較好。
(4 )在應用程序允許的情況下,適當降低隔離級別。
(5)選擇適當的封鎖粒度。頁級封鎖阻止并發事務訪問或修改該頁面上所有記錄,表 級封鎖阻止并發事務訪問或修改表內所有的頁面;記錄級封鎖(行級鎖)比頁級封鎖粒度好, 頁級封鎖比表級封鎖粒度好。長事務(指要訪問表內幾乎所有頁面的事務)應該盡可能使用 表級封鎖來防止死鎖,而短事務應該使用記錄級封鎖來提高并發度。
(6)只在數據庫很少被訪問時才修改有關數據定義的數據(系統目錄或元數據)。每個 能夠編譯、添加或刪除表、添加或刪除索引、改變屬性定義的事務都必須訪問目錄數據,因 此,目錄很容易成為熱點,也因而成為瓶頸。
(7)減少訪問熱點(大量事務訪問和更新的數據)。只有在更新某熱點的事務完成滯后, 其他的事務才能獲得這個熱點上的鎖,因此熱點可能成為瓶頸。
(8)死鎖檢測周期的調優。
以上每個建議都可以獨立于其他建議來運用,但是在調優時必須檢測是否能體現合適 的隔離性保證。
7.總結
數據庫性能優化的基本原則就是通過盡可能少的磁盤訪問獲得所需要的數據。本文從計 算機硬件、關系系統與應用程序、數據庫索引、SQL? 語句、事務處理幾個比較共性的方面 分析了數據庫性能優化的問題,? 提出了若干數據庫性能優化的策略。當然實現優化的方法還 有很多,? 要根據具體情況而定。對于不同的應用情況,我們應該具體情況具體分析,? 各方面優 化措施綜合運用,? 以使數據庫性能得到提高。數據庫應用系統的性能是一項全民工程,開發 團隊的所有人都有責任為性能做貢獻,樹立性能意識,使之成為日常工作的習慣而不是單獨 成為某一階段的工作,要未雨綢繆,不要寄希望于某一個環節的工作。
總結
- 上一篇: 【Hibernate框架开发之五】Hib
- 下一篇: Android项目之——Activity