今年所做的優化,大的涉及到體系架構改造,通過cache來減少sql執行次數,通過更改應用的實現方式等,小的如加hint,建索引等等,大大小小快接近上百個了,如何來做優化,這邊我稍微闡述一下。
1.紮實的基本功
資料庫最基本的理論要清楚,要理解的透徹一點。比如索引為什麼有些塊delete後不能重用,而表delete後這些塊很快會被重用掉的?想象索引b樹的樹狀結果,想象關係型資料庫heap表的最大特點是什麼,就很容易理解上述問題了。我一直認為會什麼不重要,重要的是有紮實的基本功,勤奮,態度,態度能決定一切,很多東西要通過時間來沉澱的,葉開提到過,statspack中每個sql該排在報表中的哪個位置要清清楚楚,這樣一有風吹草動很容易快速定位出來。
2.如何判定sql的效能?
通過邏輯讀大小是很難斷定sql是否優化,看是很難看出來的,要結合業務,返回的資料量來判斷。
舉個例子,web分頁語句每頁顯示20行,單次邏輯讀消耗在60左右,每小時執行次數在300萬左右,這種sql要學會評估,假設20行各分散在不同的塊上,取20行的資料最多需要20個塊+索引掃瞄取rowid 差不多在3-10個塊左右,那sql消耗的邏輯讀差不多在30個塊左右,邏輯讀在60左右肯定是高了,如果能優化到30左右,每小時節省的邏輯讀在300萬執行次數*30,差不多1個億的邏輯讀。我們這種系統中,很多sql每小時執行次數在百萬級別之上,甚至在達到千萬級別,sql優化要特別重視,也很有效。
3.理解分頁list的兩種寫法
基本上是必修課了,有不用這個功能的應用嗎?分頁對於oracle來說有兩種寫法:普通寫法和rowid寫法,要深刻理解這兩個寫法,特別是rowid寫法,優勢是什麼,用在哪個地方,具體的可以參考http://www.taobaodba.com和piner的書,裡面有多篇文章。
4.更改sql的實現方式
基本上我是禁止大表之間的關聯查詢,如果核心表出現這種 查詢,我是堅決要求改掉,很多時候寧願開發拆成兩個sql,分兩次來執行。舉個例子,比如彙總表(sborder_biz)和明細表(sborder_detail)是一對多的關係,乙個彙總存在多個明細,我一般都是建議在明細表做的足夠詳細,做到不需要關聯彙總表來實現。大家可以想象一下,關聯兩個大表,乙個錶走索引(t2.it_id索引)另乙個表只能走關聯的鍵值(t1.orderid) 了,進而回表,對於oltp型的資料庫來說,記錄是非常分散的,回表的代價很大,t2返回多少條記錄,就需要去回表t1的多少記錄。
select t1.order_id,t2.createdate,t2.deleted from sborder_biz t1, sborder_detail t2
where t1.order_id = t2.order_id and t1.deleted = 0 and t2.it_id = :1 and t2.code = :2
5.建合適的索引
建合適的索引,特別是聯合索引,需要很多技巧的,要根據查詢條件,根據索引列的資料分布來建立,聯合索引的好壞對sql效能影響非常大,這個在《sql查詢中儘量減少<>的使用》中也有描述.
6.不用is null條件
建表時,列要盡量設定成not null,盡量設定成不為空或是預設值,我是很反對這種寫法的.select * from table where (status=0 or status is null)
7.關注細節,關注應用實現方式
是的,一定要多關注細節,從小事做起,我認為這是最重要的。
簡單總結了這麼幾條,其他的如怎麼利用cache,核心表怎麼設計等這些以後會補充進來,實際上面我所提到的幾條,任何一條是否能做好,對資料庫的效能影響都是極大的。優化我最強調的是細節,特別是自己跟的應用,好比小時候去河裡揀田螺,一次一小顆,什麼時候才能揀到一籃呢,優化也是,我們這麼大的系統,剛開始優化很難出效果的,做好每乙個sql,關注每個sql的實現方式,積少成多,當你埋頭在揀田螺時,籃子也漸漸滿了。
SQL優化之一
在sqlserver2008 management studio中執行下列 set statistics time on goselect from information.lhbinfo where tradingdate between 2010 01 01 and 2011 06 10 god...
tinyxml優化之一
最近在搞xml解析優化,公司引擎用了tinyxml1和tinyxml2兩個xml庫,後者的效率比前者高60 吧,tinyxml1解析大檔案是很慢的,可以淘汰了,tinyxml2還勉強,快的話還得算pugixml或者rapidxml吧。奈何一些引擎 根深蒂固,無法更換為pugixml,只能區域性修改一...
Oracle筆記之一
1.oracle 複製表 create table tmps as select from emp 2.使用子查詢插入資料 insert into temps select from user objects 3.oracle 中遞迴查詢的使用 select from emp start with ...