Ⅰ 怎樣保持Oracle資料庫SQL性能的穩定性
有客戶遇到SQL性能不穩定 突然變差導致系統性能出現嚴重問題的情況 對於大型的系統來說 SQL性能不穩定 有時突然變差 這是常常遇到的問題 這也是一些DBA的挑戰
對於使用Oracle資料庫的應用系統 有時會出現運行得好好的SQL 性能突然變差 特別是對於OLTP類型系統執行頻繁的核心SQL 如果出現性能問題 通常會影響整個資料庫的性能 進而影響整個系統的正常運行 對於個別的SQL 比如較少使用的查詢報表之類的SQL 如果出現問題 通常隻影響少部分功能模塊 而不會影響整個系統
那麼應該怎麼樣保持SQL性能的穩定性?
SQL的性能變差 通常是在SQL語句重新進行了解析 解析時使用了錯誤的執行計劃出現的 下列情況是SQL會重新解析的原因
SQL語句沒有使用綁定變數 這樣SQL每次執行都要解析
SQL長時間沒有執行 被刷出SHARED POOL 再次執行時需要重新解析
在SQL引用的對象(表 視圖等)上執行了DDL操作 甚至是結構發生了變化 比如建了一個索引
對SQL引用的對象進行了許可權更改森拿
重新分析(收集統計信息)了SQL引用的表和索引 或者表和索引統計信息被刪除
修改了與性能相關的部分參數
刷新了共享池
當然重啟資料庫也會使所有SQL全部重新解析
SQL重新解析後 跟以前相比 性能突然變差 通常是下列原因
表和索引的優化統計信息被刪除 或者重新收集後統計信息不準確 重新收集統計信息通常是由於收集策略(方法)不正確引起 比如對分區表使用 *** yze命令而不是用dbms_stats包 收集統計信息時采樣比例過小等等 Oracle優化器嚴重依賴於統計信息 如果統計信息有問題 則很容易導致SQL不能使用正確的執行計劃
SQL綁定變數窺螞祥探(bind peeking) 同時綁定變數對應的列上有直方圖 或者綁定變數的值變化范圍過大 分區數據分布極不均勻
) 綁定變數的列上有悶春搏直方圖
假如表orders存儲所有的訂單 state列有 種不同的值 表示未處理 表示處理成功完成 表示處理失敗 State列上有一個索引 表中絕大部分數據的state列為 和 佔少數 有下面的SQL
select * from orders where state=:b
這里:b 是變數 在大多數情況下這個值為 則應該使用索引 但是如果SQL被重新解析 而第一次執行時應用傳給變數b 值為 則不會使用索引 採用全表掃描的方式來訪問表 對於綁定變數的SQL 只在第一次執行時才會進行綁定變數窺探 並以此確定執行計劃 該SQL後續執行時全部按這個執行計劃 這樣在後續執行時 b 變數傳入的值為 的時候 仍然是第一次執行時產生的執行計劃 即使用的是全表掃描 這樣會導致性能很差
) 綁定變數的值變化范圍過大
同樣假如orders表有一列created_date表示一筆訂單的下單時間 orders表裡面存儲了最近 年的數據 有如下的SQL
Select * from orders where created_date >=:b ;
假如大多數情況下 應用傳入的b 變數值為最近幾天內的日期值 那麼SQL使用的是created_date列上的索引 而如果b 變數值為 個月之前的一個值 那麼就會使用全表掃描 與上面描述的直方圖引起的問題一樣 如果SQL第 次執行時傳入的變數值引起的是全表掃描 那麼將該SQL後續執行時都使用了全表掃描 從而影響了性能
) 分區數據量不均勻
對於范圍和列表分區 可能存在各個分區之間數據量極不均勻的情況下 比如分區表orders按地區area進行了分區 P 分區只有幾千行 而P 分區有 萬行數據 同時假如有一列proct_id 其上有一個本地分區索引 有如下的SQL
select * from orders where area=:b and proct_id =:b
這條SQL由於有area條件 因此會使用分區排除 如果第 次執行時應用傳給b 變數的值正好落在P 分區上 很可能導致SQL採用全表掃描訪問 如前面所描述的 導致SQL後續執行時全部使用了全表掃描
其他原因 比如表做了類似於MOVE操作之後 索引不可用 對索引進行了更改 當然這種情況是屬於維護不當引起的問題 不在本文討論的范圍
綜上所述 SQL語句性能突然變差 主要是因為綁定變數和統計信息的原因 注意這里只討論了突然變差的情況 而對於由於數據量和業務量的增加性能逐步變差的情況不討論
為保持SQL性能或者說是執行計劃的穩定性 需要從以下幾個方面著手
規劃好優化統計信息的收集策略 對於Oracle g來說 默認的策略能夠滿足大部分需求 但是默認的收集策略會過多地收集列上的直方圖 由於綁定變數與直方圖固有的矛盾 為保持性能穩定 對使用綁定變數的列 不收集列上的直方圖 對的確需要收集直方圖的列 在SQL中該列上的條件就不要用綁定變數 統計信息收集策略 可以考慮對大部分表 使用系統默認的收集策略 而對於有問題的 可以用DBMS_STATS LOCK_STATS鎖定表的統計信息 避免系統自動收集該表的統計信息 然後編寫腳本來定製地收集表的統計信息 腳本中類似如下
exec dbms_stats unlock_table_stats…
exec dbms_stats gather_table_stats…
exec dbms_stats lock_table_stats…
修改SQL語句 使用HINT 使SQL語句按HINT指定的執行計劃進行執行 這需要修改應用 同時需要逐條SQL語句進行 加上測試和發布 時間較長 成本較高 風險也較大
修改隱含參數 _optim_peek_user_binds 為FALSE 修改這個參數可能會引起性能問題(這里討論的是穩定性問題)
使用OUTLINE 對於曾經出現過執行計劃突然變差的SQL語句 可以使用OUTLINE來加固其執行計劃 在 g中DBMS_OUTLN CREATE_OUTLINE可以根據已有的執行正常的SQL游標來創建OUTLINE 如果事先對所有頻繁執行的核心SQL使用OUTLINE加固執行計劃 將最大可能地避免SQL語句性能突然變差
注 DBMS_OUTLN可以通過$ORACLE_HOME/rdbms/admin/dbmsol sql腳本來安裝
使用SQL Profile SQL Profile是Oracle g之後的新功能 此處不再介紹 請參考相應的文檔
除此之外 可以調整一些參數避免潛在的問題 比如將 _btree_bitmap_plans 參數設置為FALSE(這個參數請參考互聯網上的文章或Oracle文檔)
lishixin/Article/program/Oracle/201311/18054
Ⅱ 如何保證資料庫在大批量插入和高並發查詢時的性能
1、如果硬信則件允許搞個讀寫分離。
2、讀取數據的時候採用臟讀方式,有效提高讀取性能
3、插入的時候大滑遲棚批量比如10W條,可以分開10次1W插入,有效提高寫入性能,但盡量不要1條1條來,會造成大量事務日誌旦輪
Ⅲ 簡述如何通過計算機系統硬體資源建設,保障資料庫系統的正常高效運行
通過計算機系統硬體資源建設,保障資料庫系統的正常高效運行,需要考慮以下幾個方面:
資料庫的安全性:防止非授權用戶對資料庫的惡意存取和破壞,例如黑客和犯罪分子。資料庫管理系統提供的安全措施主要包括用戶身份鑒別、存取控制和數據加密等。
資料庫的性能:優化資料庫的結構唯悉冊設計、存儲空間分配、索引建立、查詢處理和事務管理等,提高資料庫的響應速度和吞吐量。
資料庫的可靠性:保證資料庫在發生故障時能夠恢復到正常狀態,避免數據丟失或損壞。資料庫管理系統提供的可靠性措施主要包括備份、恢復和日誌等。
資料庫的可擴展性:使得資料庫能夠適應不斷增長的數據量和用戶需求,支持分布式、並行和雲計算等技術。
資料庫的易用性:為用陸渣戶提供指宏一個友好和方便的操作界面,支持多種語言和平台,簡化資料庫的開發和維護工作。
Ⅳ 怎樣提高資料庫的性能
1、使你的資料庫結構規范化,但是不要求一定達到第三範式,為了顯示和列印目的可以有數據冗餘2、評估你的系統中對性能影響的關鍵處,減少被頻繁訪問的核心表的數量,並在這些核心 表上重點優化索引,表結構(盡量緊湊)。典型的核心表是代碼表。 3、對於統計類應用,如果可能應寫成觸發器和存儲過程,這樣就有可能把一個消耗大量時 間的統計運算分布到每INSERT,DELETE,或者UPDATE來處理,從而極大提高查詢類操作的速度。 查詢選擇群居索引最有效。其他索引也要針對業務進行選擇。由於維護索引也要消耗系 統資源和時間,所以過多的索引對性能是損害甚至是毫無效果的。 5、如果可能,可以利用大數據庫對SQL的一些特殊規定來進一步優化,比如查詢暗示。 6、適當選擇硬體,綜合考慮CPU,內存,I/O系統的性能,以當前的CPU,內存配置來看, 很多資料庫系統的瓶頸出在I/O系統上。所以如果有可能,最好使用RAID。 當然如果你有足夠的財力,可以買更好的伺服器,或者橋態搞伺服器集群就更利害啦。 7、可能的話,盡量使用存儲過程,因為存儲過程的執行計劃可以重復使用,而且不需要 象普通由CLIENT提交的SQL那樣進行處理和編譯。 8、檢查你的應用程序設計,如果有可能戚兆,盡量減少查詢次數和在網路上往返的數據。為了 獲取少量欄位而寫SELECT * 對性能的損害也比較利害。 9、在應用程序中協調並發和一致性之間的矛盾。並不是所有業務都需要放在事務中。大量 業務是允許臟讀的,在不關鍵事務中使用臟讀,或者讀提交,可以大大降低DEADLOCK和 進程之間彼此等待的機會,從而把由於互相鎖定資源引起的等待降低到最小。 不要在事務執行中進行大高消租量計算或者與用戶交互的操作,因為事務的執行在要求上是 不允許被打斷的原子操作(回滾是失敗的),所以事務應該多而短小。長事務會鎖住 很多資源比較長的時間,因此也比較容易導致其他進程對資源的等待和死鎖的機會。 10、評估你開發系統的關鍵業務,在很多資料庫系統對性能的要求是彼此矛盾的,比如OLTP 應用和DSS是不同的。DSS傾向於使用各種索引加快檢索速度,而大量的索引對OLTP則是負擔。 11、不要在應用程序中寫怪異的SQL 查詢,比如 WHERE money!40000,這樣的語句,這種 SQL查詢,資料庫的SQL優化器是無法進行優化的。 12、定期維護和管理你的資料庫系統,壓縮掉那些垃圾空間,很多資料庫系統執行類似 刪除,事務等操作的時候,並不回收無用的物理空間。所以,制定一份合理的資料庫 維護計劃,不要等日誌文件或者LOG文件越長越大的時候才去整理資料庫。 還有很多很多要注意的東西,。。。。。。
Ⅳ 資料庫性能優化有哪些措施
1、調整數據結構的設計
這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE資料庫的分區功能,對於經常訪問的資料庫表是否需要建立索引等。
2、調整應用程序結構設計
這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的資料庫資源是不同的。
3、調整資料庫SQL語句
應用程序的執行最終將歸結為資料庫中的SQL語句執行,因此SQL語句的執行效率最終決定了ORACLE資料庫的性能。ORACLE公司推薦使用ORACLE語句優化器(OracleOptimizer)和行鎖管理器(row-levelmanager)來調整優化SQL語句。
4、調整伺服器內存分配
內存分配是在信息系統運行過程中優化配置的,資料庫管理員可以根據資料庫運行狀況調整資料庫系統全局區(SGA區)的數據緩沖區、日誌緩沖區和共享池的大小;還可以調整程序全局區(PGA區)的大小。需要注意的是,SGA區不是越大越好,SGA區過大會佔用操作系統使用的內存而引起虛擬內存的頁面交換,這樣反而會降低系統。
5、調整硬碟I/O
這一步是在信息系統開發之前完成的。資料庫管理員可以將組成同一個表空間的數據文件放在不同的硬碟上,做到硬碟之間I/O負載均衡。
6、調整操作系統參數
例如:運行在UNIX操作系統上的ORACLE資料庫,可以調整UNIX數據緩沖池的大小,每個進程所能使用的內存大小等參數。
實際上,上述資料庫優化措施之間是相互聯系的。ORACLE資料庫性能惡化表現基本上都是用戶響應時間比較長,需要用戶長時間的等待。但性能惡化的原因卻是多種多樣的,有時是多個因素共同造成了性能惡化的結果,這就需要資料庫管理員有比較全面的計算機知識,能夠敏感地察覺到影響資料庫性能的主要原因所在。另外,良好的資料庫管理工具對於優化資料庫性能也是很重要的。
一、ORACLE資料庫性能優化工具
常用的資料庫性能優化工具有:
ORACLE資料庫在線數據字典,ORACLE在線數據字典能夠反映出ORACLE動態運行情況,對於調整資料庫性能是很有幫助的。
操作系統工具,例如UNIX操作系統的vmstat,iostat等命令可以查看到系統系統級內存和硬碟I/O的使用情況,這些工具對於管理員弄清出系統瓶頸出現在什麼地方有時候很有用。
SQL語言跟蹤工具(SQLTRACEFACILITY),SQL語言跟蹤工具可以記錄SQL語句的執行情況,管理員可以使用虛擬表來調整實例,使用SQL語句跟蹤文件調整應用程序性能。SQL語言跟蹤工具將結果輸出成一個操作系統的文件,管理員可以使用TKPROF工具查看這些文件。
ORACLEEnterpriseManager(OEM),這是一個圖形的用戶管理界面,用戶可以使用它方便地進行資料庫管理而不必記住復雜的ORACLE資料庫管理的命令。
EXPLAINPLAN——SQL語言優化命令,使用這個命令可以幫助程序員寫出高效的SQL語言。
二、ORACLE資料庫的系統性能評估
信息系統的類型不同,需要關注的資料庫參數也是不同的。資料庫管理員需要根據自己的信息系統的類型著重考慮不同的資料庫參數。
1、在線事務處理信息系統(OLTP),這種類型的信息系統一般需要有大量的Insert、Update操作,典型的系統包括民航機票發售系統、銀行儲蓄系統等。OLTP系統需要保證資料庫的並發性、可靠性和最終用戶的速度,這類系統使用的ORACLE資料庫需要主要考慮下述參數:
資料庫回滾段是否足夠?
是否需要建立ORACLE資料庫索引、聚集、散列?
系統全局區(SGA)大小是否足夠?
SQL語句是否高效?
2、數據倉庫系統(DataWarehousing),這種信息系統的主要任務是從ORACLE的海量數據中進行查詢,得到數據之間的某些規律。資料庫管理員需要為這種類型的ORACLE資料庫著重考慮下述參數:
是否採用B*-索引或者bitmap索引?
是否採用並行SQL查詢以提高查詢效率?
是否採用PL/SQL函數編寫存儲過程?
有必要的話,需要建立並行資料庫提高資料庫的查詢效率
三、SQL語句的調整原則
SQL語言是一種靈活的語言,相同的功能可以使用不同的語句來實現,但是語句的執行效率是很不相同的。程序員可以使用EXPLAINPLAN語句來比較各種實現方案,並選出最優的實現方案。總得來講,程序員寫SQL語句需要滿足考慮如下規則:
1、盡量使用索引。試比較下面兩條SQL語句:
語句A:SELECTdname,
(SELECTdeptnoFROMemp);
語句B:SELECTdname,deptnoFROMdeptWHERENOTEXISTS
(SELECTdeptnoFROMempWHEREdept.deptno=emp.deptno);
這兩條查詢語句實現的結果是相同的,但是執行語句A的時候,ORACLE會對整個emp表進行掃描,沒有使用建立在emp表上的deptno索引,執行語句B的時候,由於在子查詢中使用了聯合查詢,ORACLE只是對emp表進行的部分數據掃描,並利用了deptno列的索引,所以語句B的效率要比語句A的效率高一些。
2、選擇聯合查詢的聯合次序。考慮下面的例子:
SELECTstuffFROMtabaa,tabbb,tabcc
WHEREa.acolbetween:alowand:ahigh
ANDb.bcolbetween:blowand:bhigh
ANDc.ccolbetween:clowand:chigh
ANDa.key1=b.key1
AMDa.key2=c.key2;
這個SQL例子中,程序員首先需要選擇要查詢的主表,因為主表要進行整個表數據的掃描,所以主表應該數據量最小,所以例子中表A的acol列的范圍應該比表B和表C相應列的范圍小。
3、在子查詢中慎重使用IN或者NOTIN語句,使用where(NOT)exists的效果要好的多。
4、慎重使用視圖的聯合查詢,尤其是比較復雜的視圖之間的聯合查詢。一般對視圖的查詢最好都分解為對數據表的直接查詢效果要好一些。
5、可以在參數文件中設置SHARED_POOL_RESERVED_SIZE參數,這個參數在SGA共享池中保留一個連續的內存空間,連續的內存空間有益於存放大的SQL程序包。
6、ORACLE公司提供的DBMS_SHARED_POOL程序可以幫助程序員將某些經常使用的存儲過程「釘」在SQL區中而不被換出內存,程序員對於經常使用並且佔用內存很多的存儲過程「釘」到內存中有利於提高最終用戶的響應時間。
四、CPU參數的調整
CPU是伺服器的一項重要資源,伺服器良好的工作狀態是在工作高峰時CPU的使用率在90%以上。如果空閑時間CPU使用率就在90%以上,說明伺服器缺乏CPU資源,如果工作高峰時CPU使用率仍然很低,說明伺服器CPU資源還比較富餘。
使用操作相同命令可以看到CPU的使用情況,一般UNIX操作系統的伺服器,可以使用sar_u命令查看CPU的使用率,NT操作系統的伺服器,可以使用NT的性能管理器來查看CPU的使用率。
資料庫管理員可以通過查看v$sysstat數據字典中「CPUusedbythissession」統計項得知ORACLE資料庫使用的CPU時間,查看「OSUserlevelCPUtime」統計項得知操作系統用戶態下的CPU時間,查看「OSSystemcallCPUtime」統計項得知操作系統系統態下的CPU時間,操作系統總的CPU時間就是用戶態和系統態時間之和,如果ORACLE資料庫使用的CPU時間占操作系統總的CPU時間90%以上,說明伺服器CPU基本上被ORACLE資料庫使用著,這是合理,反之,說明伺服器CPU被其它程序佔用過多,ORACLE資料庫無法得到更多的CPU時間。
資料庫管理員還可以通過查看v$sesstat數據字典來獲得當前連接ORACLE資料庫各個會話佔用的CPU時間,從而得知什麼會話耗用伺服器CPU比較多。
出現CPU資源不足的情況是很多的:SQL語句的重解析、低效率的SQL語句、鎖沖突都會引起CPU資源不足。
1、資料庫管理員可以執行下述語句來查看SQL語句的解析情況:
SELECT*FROMV$SYSSTATWHERENAMEIN
('parsetimecpu','parsetimeelapsed','parsecount(hard)');
這里parsetimecpu是系統服務時間,parsetimeelapsed是響應時間,用戶等待時間,waitetime=parsetimeelapsed_parsetimecpu
由此可以得到用戶SQL語句平均解析等待時間=waitetime/parsecount。這個平均等待時間應該接近於0,如果平均解析等待時間過長,資料庫管理員可以通過下述語句
SELECTSQL_TEXT,PARSE_CALLS,EXECUTIONSFROMV$SQLAREA
ORDERBYPARSE_CALLS;
來發現是什麼SQL語句解析效率比較低。程序員可以優化這些語句,或者增加ORACLE參數SESSION_CACHED_CURSORS的值。
2、資料庫管理員還可以通過下述語句:
SELECTBUFFER_GETS,EXECUTIONS,SQL_TEXTFROMV$SQLAREA;
查看低效率的SQL語句,優化這些語句也有助於提高CPU的利用率。
3、資料庫管理員可以通過v$system_event數據字典中的「latchfree」統計項查看ORACLE資料庫的沖突情況,如果沒有沖突的話,latchfree查詢出來沒有結果。如果沖突太大的話,資料庫管理員可以降低spin_count參數值,來消除高的CPU使用率。
五、內存參數的調整
內存參數的調整主要是指ORACLE資料庫的系統全局區(SGA)的調整。SGA主要由三部分構成:共享池、數據緩沖區、日誌緩沖區。
1、共享池由兩部分構成:共享SQL區和數據字典緩沖區,共享SQL區是存放用戶SQL命令的區域,數據字典緩沖區存放資料庫運行的動態信息。資料庫管理員通過執行下述語句:
select(sum(pins-reloads))/sum(pins)"LibCache"fromv$librarycache;
來查看共享SQL區的使用率。這個使用率應該在90%以上,否則需要增加共享池的大小。資料庫管理員還可以執行下述語句:
select(sum(gets-getmisses-usage-fixed))/sum(gets)"RowCache"fromv$rowcache;
查看數據字典緩沖區的使用率,這個使用率也應該在90%以上,否則需要增加共享池的大小。
2、數據緩沖區。資料庫管理員可以通過下述語句:
SELECTname,valueFROMv$sysstatWHEREnameIN('dbblockgets','consistentgets','physicalreads');
來查看資料庫數據緩沖區的使用情況。查詢出來的結果可以計算出來數據緩沖區的使用命中率=1-(physicalreads/(dbblockgets+consistentgets))。
這個命中率應該在90%以上,否則需要增加數據緩沖區的大小。
3、日誌緩沖區。資料庫管理員可以通過執行下述語句:
selectname,valuefromv$sysstatwherenamein('redoentries','redologspacerequests');
查看日誌緩沖區的使用情況。查詢出的結果可以計算出日誌緩沖區的申請失敗率:
申請失敗率=requests/entries,申請失敗率應該接近於0,否則說明日誌緩沖區開設太小,需要增加ORACLE資料庫的日誌緩沖區。
昆明北大青鳥java培訓班轉載自網路如有侵權請聯系我們感謝您的關注謝謝支持
Ⅵ 如何優化資料庫的性能
--資料庫性能調優
--1.聚集索引、主鍵
--2.盡量不要用臨時表
--3.多多使用事務
--4.表設計要規范
--5.不要使用游標
--6.避免死鎖
--7.不要打開大數據集
--8.最好不要select *
--9.不要使用text數據類型,用varchar
--10.不要給諸如「性別」列創建索引
--11.不要使用Insert插入大量的數據
--12.盡量用join代替where,因為where進行全表搜索
Ⅶ 如何保證資料庫的安全性和一致性
關系型資料庫有四個顯著的特徵,即安全性、完整性、並發性和監測性。資料庫的安全性就是要保證資料庫中數據的安全,防止未授權用戶隨意修改資料庫中的數據,確保數據的安全。在大多數資料庫管理系統中,主要是通過許可來保證資料庫的安全性。完整性是資料庫的一個重要特徵,也是保證資料庫中的數據切實有效、防止錯誤、實現商業規則的一種重要機制。在資料庫中,區別所保存的數據是無用的肢孝垃圾還是有價值的信息,主要是依據資料庫的完整性是否健全。在SQL Server 7.0中,數據的完整性是通過一系列邏輯來保障的,這些邏輯分為三個方面,即實體完整性、域完整性和參考完整性。對任何系統都可以這樣說,沒有監測,就沒有優化。這句話用在資料庫管理系統方面,也是切合實際的。只有通過對資料庫進行全面的性能監測,姿飢缺也才能發現影響跡辯系統性能的因素和瓶頸,才能針對瓶頸因素,採取切合實際策略,解決問題,提高系統的性能。並發性也是一個非常重要的概念,它是用來解決多個用戶對同一數據進行操作時的問題。特別是對於網路資料庫來說,這個特點更加突出。提高資料庫的處理速度,單單依靠提高計算機的物理速度是不夠的,還必須充分考慮資料庫的並發性問題,提高資料庫並發性的效率。那麼如何保證並發性呢?在這個面向下一世紀的資料庫產品SQL Server 7.0中,通過使用事務和鎖機制,解決了資料庫的並發性問題。
本文來自: 中國網管聯盟(bitsCN.com) 詳細出處參考:http://www.bitscn.com/mssql/200605/27004.html
Ⅷ 如何提高oracle資料庫的性能
在公路建設中,通過建立多條車道可以提高道路的流量。其實這個道理在Oracle資料庫中也行得通。即可以將關鍵數據文件存儲在多塊硬碟上,以提高Oracle資料庫的性能。可惜的是,不少資料庫管理員沒有意識到這一點。在這篇文章中筆者就以Oracle11G為例,說明如何通過在硬碟之間分布關鍵數據文件來提高性能。 一、在硬碟之間分布關鍵數據文件的基本原則。
在傳統的文件系統上(即不是在裸機上)部署Oracle資料庫,可以通過將關鍵的數據文件分布到多個可用的文件系統上或者不同的硬碟上來提高資料庫的性能。具體的來說,需要遵循如下幾個原則。
一是對於表來說,往往包含兩個部分,即基本表與索引表。只要為基本表中的欄位創建了索引,其對應的就有一張索引表。當用戶訪問表中的數據時,應用系統需要同時訪問到索引表與數據表。此時我們可以將這兩張表比喻成兩輛車。如果現在只有一個車道(即將他們同時存放在一個硬碟或者文件系統中),那麼兩輛車必須前後行使。而如果現在有兩個車道(即將基本表與其相對應的索引表存放在不同的硬碟或者文件系統中),那麼這兩輛車就可以並排行使。顯然,後者的效率更高。為此筆者建議,可將經常需要訪問的表和與之對應的索引表分開來存放。
二是可以將日誌文件也分開來存放。不光光是數據表與索引表存在著這種狀況。其實在日誌文件管理中也是如此。只要條件允許,那麼最好能夠將聯機重做日誌和歸檔日誌與其它數據文件存放在不同的硬碟或者文件系統上。因為當用戶往資料庫中寫入數據時,需要同時往數據文件與重做日誌文件中寫入數據。此時如果將它們分開來存放,那麼就相當於有了多條車道,分別往不同的文件中寫入數據。這無疑就可以提高數據寫入的效率,從而提高資料庫的性能。
二、哪些文件最好能夠分開存放?
在講到硬碟之間分布關鍵數據文件的基本原則的時候,筆者舉了幾個需要分開存放的幾個案例。但是在實際工作中,並不僅僅局限於上面提到的這些文件。筆者認為,如果條件允許的話,那麼可以考慮將如下文件放置在不同的硬碟上。
一是表空間,如臨時表空間、系統表空間、UNDO表空間等等。這三個表空間可能系統會同時進行訪問。為此需要將其分開來存放。二是數據文件和索引文件。上面提到過,需要將經常訪問的數據文件與其對應的索引文件存放在不同的硬碟上。因為這兩類文件在訪問數據時也可能會同時訪問到。三是操作系統盤與資料庫文件單獨存放。顯然Oracle系統肯定是與操作系統同時運行的。為了避免他們之間的I/Q沖突,就需要將Oracle部署在操作系統盤以外的磁碟上。四是碼閉聯機重做日誌文件。這個文件比較復雜,不但要將其與其他文件分開來存放。而且還需要注意的是,最好能夠將其存放在性能最佳的硬碟上。
最後需要說明的一點是,增加磁碟也會增加成本。這不光光是購買磁碟所需要的花費,還包括管理的成本。所以這之間也會涉及到成本與性能之間的一個均衡問題。如果企業的數據不是很多,或者主要是涉及到查詢操作,那麼這么設計的話,就可能不怎麼合理。因為投入要大於回報。
三、如何確定是否需要將文件分開來存放?
在實際工作中,企業的數據是一個從少到多的過程。也就是說,剛開始使用資料庫的時候,可能數據量比較少,此時出於成本的考慮,沒有將相關文件存放在不同的磁碟上。但是隨著工作的深入,用戶會發現資料庫的性能在逐漸的降低。此時管理員就需要考慮,能夠採取這種多建車道的措施,來提高資料庫性能。當然在採取這個措施之前,管理員需要先進性評估。此時評估所需要用到的一個指標就是磁碟的I/O爭用。
磁碟爭用通常發生在有多個進程試圖同時訪問一個物理磁碟的情況下。如現在用啟棗戶需要訪問某個數據表中的數據,此時系統需要訪問索引文件與數據表文件。如果將它們放置在同一磁碟上,那麼在訪問時就會發生I/O沖突。所以評估I/O沖突的嚴重程度,可以幫我們來確定是否需要將關鍵文件存放在不同的磁碟上。
將I/O平均的分布到多個可用的磁碟上,這可以有效的減少磁碟之間的爭用情況,提高數據存儲與讀取的性能。從而提高Oracle等應用程序的效率。在實際工作中,數遲旁裂據庫控制文件中有兩個參數可以用來幫助我們評估這個指標。這兩個參數是文件平均讀取時間和文件平均寫入時間。不過在使用這兩個參數的時候,其只評估所有與資料庫相關聯的文件。管理員如果有需要的話,也可以通過下面的查詢語句來查詢數據文件是否存在I/O問題。查詢的語法與結果如下圖所示:
從如上的查詢結果中可以看出某個數據文件是否繁忙,數據文件之間是否存在著/I/O沖突文件。這里需要注意的是,這個結果是一個動態的結果。在不同的時刻、用戶進行不同的操作時往往會得出不同的結論。為此筆者建議,在使用這個數據的時候,最好能夠多跟蹤幾次。然後分析多次運行的結果。只有如此,才能夠得到比較合乎情理的判斷。 通常情況下,管理員根據上面的結果可以得出三種結論。
第一種結論是上面這些數據文件都不是很忙。即文件的平均讀取時間與寫入時間都比較短,表示這兩個文件都是比較空閑的。此時正常情況下,資料庫的性能應該是不錯的。也就是說,如果此時資料庫的性能不理想的話,那麼就不是磁碟的I/O所造成的。管理員應該從其他角度來改善資料庫的性能。
第二種結論是每個資料庫文件都非常的繁忙。此時有可能是讀取時間或者寫入時間比較長,或者說兩個時間都比較長。當多個數據文件同時比較繁忙並且他們處於同一磁碟的話,那麼管理員就需要考慮購買新的磁碟,然後將上面提到的這些關鍵文件重新整理,讓他們部署在不同的磁碟上。
第三種結論是某幾個特定的數據文件比較繁忙,而其他數據文件還可以。此時管理員如果成本受到限制,那麼也不需要重新購買硬碟。在磁碟上的物理寫入和讀取次數上如果出現比較大的差異,就表明某個磁碟負載過大,即有很嚴重的I/O沖突。此時最好能夠將這個磁碟中的文件進行調整,如將某些文件移動到另外的一塊I/O相對不怎麼嚴重的磁碟上。不過在採取這個操作的時候,需要注意一點。對於聯機重做日誌文件來說,即使其所在的磁碟I/O沖突比較低,或者訪問這個文件的時間比較短,但是也不建議將其他數據文件轉移到其所在的磁碟上來。因為通常情況下,為了保障資料庫的性能,我們都建議將聯機重做日誌文件單獨存放,並且還需要講起放置在性能比較高的硬碟上。
總之,將關鍵的Oracle資料庫文件分開放置。如此的話可以有效避免磁碟爭用成為Oracle資料庫系統的性能瓶頸。
Ⅸ 頻繁查詢資料庫,怎麼保證整個系統的性能
這個有很多可以說的了.以下全部手打by lcg1986:
資料庫層面優化
從資料庫本身來優化,優化SQL語句,建立適當的索引.盡量讓查詢條件命中索引,避免全表掃描.
精簡查詢語句,使用select 欄位,避免使用select *.
資料庫使用主備機或者集群模式,進行讀寫分離.
對數據進行分庫分表
系統應用層面優化
系統寬襲使用連接池連接數前乎據庫,避免頻繁的建立連接,釋放連接的IO開銷.
使用緩存,根據業務場景對數據進行劃分,盡量將基本不會發生改變的數據緩存下來,查詢時優先查詢緩存,減少對資料庫的訪問.
對服務進行降級功能設計,在並發大到資料庫實在無法處理的情況,對造成數據擁堵的服務進行降級.
支持數據的讀寫分離.讀請求和寫請求分別訪問不同的資料庫.
支持分庫分表,或引入資料庫中間件,如慧巧悉Mycat.
硬體方面優化
盡量使用SSD磁碟類型的資料庫伺服器,相比傳統機械硬碟類型的伺服器,具有更高的IO吞吐能力.
如果可能,盡量保證系統與資料庫,資料庫各個機器在同一區域內.避免如系統服務在北京,資料庫伺服器在上海的情況,減少因為網路環境,網路帶寬等因素帶來的影響
Ⅹ 資料庫性能優化有哪些措施
1、調整數據結構的設計。這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE資料庫的分區功能,對於經常訪問的資料庫表是否需要建立索引等。
2、調整應用程序結構設計。這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的資料庫資源是不同的。
3、調整資料庫SQL語句。應用程序的執行最終將歸結為資料庫中的SQL語句執行,因此SQL語句的執行效率最終決定了ORACLE資料庫的性能。ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。
4、調整伺服器內存分配。內存分配是在信息系統運行過程中優化配置的,資料庫管理員可以根據資料庫運行狀況調整資料庫系統全局區(SGA區)的數據緩沖區、日誌緩沖區和共享池的大小;還可以調整程序全局區(PGA區)的大小。需要注意的是,SGA區不是越大越好,SGA區過大會佔用操作系統使用的內存而引起虛擬內存的頁面交換,這樣反而會降低系統。
5、調整硬碟I/O,這一步是在信息系統開發之前完成的。資料庫管理員可以將組成同一個表空間的數據文件放在不同的硬碟上,做到硬碟之間I/O負載均衡。
6、調整操作系統參數,例如:運行在UNIX操作系統上的ORACLE資料庫,可以調整UNIX數據緩沖池的大小,每個進程所能使用的內存大小等參數。
資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。資料庫有很多種類型,從最簡單的存儲有各種數據的表格到能夠進行海量數據存儲的大型資料庫系統都在各個方面得到了廣激擾泛的應用。
在信息化社會,充分有效地管理和利用各類信息資源,是進行科學研究和決策管理的前提條件。資料庫技術是管理信息系統、辦公自動化系統、決策支持系統等各類信息系統的核心部分,是進行科學研究攔行和決策管理的重要技術手段。
在經濟管理的日常工作簡鉛嘩中,常常需要把某些相關的數據放進這樣的「倉庫」,並根據管理的需要進行相應的處理。
例如,企業或事業單位的人事部門常常要把本單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成是一個資料庫。有了這個"數據倉庫"我們就可以根據需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內的職工人數等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。此外,在財務管理、倉庫管理、生產管理中也需要建立眾多的這種"資料庫",使其可以利用計算機實現財務、倉庫、生產的自動化管理。
(10)如何保證資料庫性能擴展閱讀
資料庫,簡單來說是本身可視為電子化的文件櫃--存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。
資料庫指的是以一定方式儲存在一起、能為多個用戶共享、具有盡可能小的冗餘度的特點、是與應用程序彼此獨立的數據集合。
在經濟管理的日常工作中,常常需要把某些相關的數據放進這樣的"倉庫",並根據管理的需要進行相應的處理。
例如,企業或事業單位的人事部門常常要把本單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成是一個資料庫。有了這個"數據倉庫"我們就可以根據需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內的職工人數等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。此外,在財務管理、倉庫管理、生產管理中也需要建立眾多的這種"資料庫",使其可以利用計算機實現財務、倉庫、生產的自動化管理。