{eval=Array;=+count(Array);}
我根據(jù)所維護(hù)的Oracle 項目經(jīng)驗(yàn)來回答這個問題,希望能夠幫助到題主及有需要的朋友。
Oracle 運(yùn)行越來越慢,是有多種原因,我從由易到難的思路,介紹一下我們實(shí)際運(yùn)用的方法分享給大家:
一、Oracle 數(shù)據(jù)庫層自身的優(yōu)化
1. 表的優(yōu)化。表是Oracle中存放數(shù)據(jù)的最終載體,表的優(yōu)化是核心。 隨時業(yè)務(wù)系統(tǒng)使用時間越長,表中的數(shù)據(jù)就越多,表的優(yōu)化會起到立竿見影的效果。
(1) 表的高水位問題。
表中的數(shù)據(jù),因較多的 delete 操作,會產(chǎn)生高水位,此時當(dāng)發(fā)生全表讀的操作,將會額外消耗資源,從而造成業(yè)務(wù)人員直接感覺到系統(tǒng)使用慢。
補(bǔ)救的辦法是:回收高水位。
(2) 表的統(tǒng)計信息過舊或者不準(zhǔn)確
統(tǒng)計信息不準(zhǔn)確,會引起執(zhí)行計劃出錯,造成業(yè)務(wù)系統(tǒng)越來越慢。 表的統(tǒng)計信息就相當(dāng)于人的基本情況,當(dāng)基本情況都不準(zhǔn)確時,如何能夠保證正確的執(zhí)行呢。
補(bǔ)救的辦法是:收集表的統(tǒng)計信息。
(3) 未實(shí)施表分區(qū)技術(shù)
化整為零的思想。 某些表,根據(jù)業(yè)務(wù)的實(shí)際需要,未做表分區(qū)。 比如會經(jīng)常用按年月來查詢表中某月的數(shù)據(jù),如果表中的數(shù)據(jù)量非常大,比如超100萬條,就可以按月進(jìn)行分區(qū),讓按月的查詢,只需要讀取所需要月份的分區(qū)表。
補(bǔ)救的辦法是: 對表實(shí)行化整為零,轉(zhuǎn)為分區(qū)表
2. 索引的優(yōu)化
(1) 差索引
數(shù)據(jù)庫運(yùn)行慢,很多的情況是查詢語句中引用的列,差索引。索引是提升速度非常重要的手段。
補(bǔ)救的辦法是: 分析SQL 語句,對缺失的索引進(jìn)行創(chuàng)建。
(2) 索引的統(tǒng)計信息不準(zhǔn)
索引的統(tǒng)計信息與表的信息信息思想是一樣的, 只有統(tǒng)計信息準(zhǔn)確,SQL 才能夠最大程度的選擇最好的執(zhí)行計劃,以最短的時間執(zhí)行完所需要的業(yè)務(wù)SQL。
補(bǔ)救的辦法是:收集索引的統(tǒng)計信息。
3. SQL 語句的優(yōu)化
數(shù)據(jù)庫慢,很多情況是因?yàn)镾QL寫法不對,造成執(zhí)行時間長,消耗了過多的資源。 因此優(yōu)化SQL 是非常重要的方式之一。
補(bǔ)救的辦法是:收集Oracle 數(shù)據(jù)庫的 AWR, ADDM, ASH 等性能報告,找出執(zhí)行時間長、消耗資源多的SQL 語句進(jìn)行優(yōu)化。
4. Oracle 數(shù)據(jù)庫的參數(shù)優(yōu)化
數(shù)據(jù)庫想要運(yùn)行速度快,對Oracle的運(yùn)行參數(shù)進(jìn)行優(yōu)化是重要的手段和方法,比如大家所熟悉的 SGA、PGA、DB_Cache_Size 、Process 等參數(shù)進(jìn)行分析、優(yōu)化。
Oracle 數(shù)據(jù)庫的運(yùn)行也是要挑系統(tǒng)平臺的,一般的中、小企業(yè),推薦的是使用 Linux ,從每次Oracle新版本的發(fā)行就知道,首先推出的是Linux平臺,然后是 Unix平臺,最后才是Windows平臺。
三、 升級 Oracle 數(shù)據(jù)庫硬件
如經(jīng)過前面 2 個大項的優(yōu)化,仍然不能提升Oracle 數(shù)據(jù)庫的運(yùn)行速度,則可能是因?yàn)楝F(xiàn)有的硬件不能滿足當(dāng)前的業(yè)務(wù)需求,必須采取升級 Oracle 數(shù)據(jù)庫服務(wù)器的硬件資源比如:升級CPU、內(nèi)存、磁盤(特別是提升 磁盤 I/O 速度),來提升Oracle數(shù)據(jù)庫的運(yùn)行速度。
以上方法和思路,是我們實(shí)際項目中遇到并運(yùn)用的方法和手段,歡迎大家交流。
隨著業(yè)務(wù)數(shù)據(jù)的增長,以及新業(yè)務(wù)的推出,很多企業(yè)都面臨著系統(tǒng)性能的問題,并且日益凸顯。似乎用盡了所有招數(shù),但性能就是不見改善,問題到底出在哪里?
遇到如此問題,我們一般怎么做呢?是不是都有過下面的體會?
不差錢人的做法:
升級cpu、擴(kuò)內(nèi)存、換固態(tài)盤存儲,只能說一開始很管用,慢慢地老問題又出現(xiàn)了。
老實(shí)人做法:
新上線了業(yè)務(wù)系統(tǒng)性能不佳,怎么辦呢?我們來玩打游擊。把一些不重要的業(yè)務(wù)放在晚上運(yùn)行,調(diào)整新業(yè)務(wù)的功能模塊,或者暫時不做數(shù)據(jù)同步等
扯皮做法:
看看網(wǎng)絡(luò)有沒有問題呢,有的話就改;是不是存儲的問題呢,有問題就換;運(yùn)維人員有沒有問題呢,服務(wù)商也隨意招;但要誰來承擔(dān)責(zé)任呢,每次遇到嚴(yán)重的故障,是不是時間用來扯皮較多?
現(xiàn)實(shí)中,很多運(yùn)維人員都很拼命地在保障系統(tǒng)高效運(yùn)行,但根據(jù)相關(guān)統(tǒng)計,80%的系統(tǒng)性能問題來自SQL方面的問題。所以,在基本保證網(wǎng)絡(luò)(跟平時比,跟同時段其他業(yè)務(wù)比)、服務(wù)器(CPU、內(nèi)存使用率)、存儲(IO等待)等資源都問題不大的情況下,可以通過查看Oracle對應(yīng)時段的AWR、ASH、ADDM來尋找同時段運(yùn)行較慢的SQL。有針對性的去優(yōu)化。
而SQL優(yōu)化中最基本的做法就是建立索引(這個需要根據(jù)SQL執(zhí)行計劃去建立合適的索引)、SQL改寫、HINT提示等等
性能優(yōu)化是一個比較復(fù)雜的系統(tǒng)工程,以上僅是提示點(diǎn)思路吧,具體還需要根據(jù)系統(tǒng)的實(shí)際情況多做練習(xí),然后再觀察。優(yōu)化是一個循序漸進(jìn)的過程,就像我們?nèi)松∫粯樱瘸运幹尾?,然后再去醫(yī)院復(fù)查,看看是否已經(jīng)治愈一個道理。
希望以上對題主有所幫助,也歡迎其他大牛提出更好的思路,幫助題主。
你先生成你運(yùn)行慢那一時間段的性能報告,然后通過里邊的指數(shù)看是你的硬件問題還是你的語句的問題,SGA區(qū)小的話加SGA區(qū),接著再分析你的語句,看是不是你這個語句的計劃任務(wù)是怎么走的,是否沒走索引走了全表掃描!以上就是我的觀點(diǎn)
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答5
回答