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