為了回饋我們默默關註的粉絲朋友們,我們特地聯合電子工業出版社給大家免費贈送最新版《收穫,不止Oracle》圖書5本,具體參與方式見文末。
鼎力推薦
顛覆IT技術圖書的傳統寫作方式,在妙趣橫生的故事中學到Oracle核心知識與最佳化方法論,讓你擺脫技術束縛,超越技術。
內容提要
在這本書裡讀者將會跟隨作者一同對Oracle資料庫的相關知識進行梳理,最終共同提煉出必須最先掌握的那部分知識,無論你是資料庫開發、管理、最佳化、設計人員,還是從事Java、C的開發人員。接下來作者再將這部分知識中最實用的內容進一步提煉,濃縮出最精華的部分,分享給大家。這是二八現象的一次經典應用。
這部分知識就是Oracle的物理體系結構、邏輯體系結構、表、索引以及表連線五大部分。透過閱讀這些章節,讀者將會在最短時間內以一種有史以來最輕鬆的方式,完成對Oracle資料庫的整體認識,不僅能在工作中解決常規問題,還能具備一定的設計和調優能力。相信透過這些章節的學習,會給讀者的Oracle學習帶來極大的收穫。
然而,作者最希望看到的是:讓讀者的收穫,不止Oracle。
為達到此目的,作者精心將全書分成了上下兩篇,剛才所描述的具體知識點體現在全書的上篇,而在下篇中,讀者將透過各種精彩故事、生動案例,體會到該如何學習和如何思考,在意識的天空拋開束縛,無拘無束、盡情飛翔。
在這裡,讀者也許會有疑問,前面說的有史以來最輕鬆的方式是一種什麼樣的方式呢?還請親愛的讀者自己去揭曉謎底吧。
作者簡介
梁敬彬,網名wabjtam123,任ITPUB版主、ITPUB社群專家、福建富士通公司資料庫專家。參與編寫過《劍破冰山——Oracle開發藝術》、《DBA手記2》等技術書籍,多年從事電信相關行業工作,負責系統架構設計、最佳化、培訓等工作,有著豐富的資料庫管理、設計、開發、培訓經驗和電信行業經驗。
梁敬弘,清華大學計算機系博士畢業,在計算機領域和金融領域皆有建樹,擁有多項計算機相關核心專利技術的同時還擁有金融行業的CFP等高階認證。現就職於華夏銀行總行。
名人推薦
作者在書中反覆傳達的核心觀點是:Oracle資料庫看似艱深的原理實際上和生活中的基本常識並無二致。理解了這一層意思,就能夠剋服對於這門技藝的畏懼之心,此後的學習自然就能夠順風順水。誠然如此,我也經常和朋友們說,對於Oracle的很多艱深演演算法,如果由我們去深思熟慮,其結果都必然大致相同。類似HASH原理,布隆過濾等演演算法,理解了你就只覺得巧妙而不覺艱深。現在梁老師就為我們尋找了一系列源於生活、循序漸進的學習路線,如果你能夠細心領會,就會覺得這一門技藝實在是趣味橫生。
——Oracle ACE總監、雲和恩墨創始人、ACOUG創始人蓋國強(eygle)
曾經有Oracle的初學者問我,怎麼開始學習Oracle?那時候我的答案很簡單:“去下載Oracle的線上檔案,包括Database Concept、Administrator’s Guide,然後開始學著做實驗。”誠然,對學習技術而言,線上檔案是一個不可多得的利器,但是,對於一個剛剛開始接觸Oracle的人來說,要從枯燥的英文檔案中去學習和理解Oracle的技術體系,也許有點勉為其難。 就算是市面上眾多的Oracle技術書籍,多數也是堆砌滿了技術細節,隨時可能嚇跑初學者。
好在,現在梁敬彬先生透過自己在日常工作和培訓中的磨練,把自己對Oracle技術的感悟,透過一個一個的小故事,淺顯而又形象地展現了出來。對於初學者來說,可以慢慢地在一個個小故事中去瞭解Oracle資料庫。讀完這本書,你也許會恍然大悟:“哦,原來Oracle是這樣子的。”
——羅海雄(rollingpig)ITPUB Oracle管理版資深版主
豈曰無衣,與子同袍。此書必為IT行業帶來一股清新之風,打造出IT書籍的一段傳奇佳話,成就一部永不過時的經典力作!我相信,此書將為廣大讀者開啟驚喜之心扉,讓讀者飛翔在思想的天空、遨遊在方法論的海洋、採摘到技術的纍纍碩果,相信收穫遠不止Oracle!
——福富軟體公司副董事長、總經理楊林
我在ITPUB認識梁敬彬先生始,就拜讀他當時參與的大作《劍破冰山——Oracle開發藝術》,直至今天,這本書裡的部分內容在行業裡還發揮著重要影響力。從事資料庫事業多年,讀過無數的技術書,有洋洋萬言的,有短小精悍的,但大多寫得正兒八經,有距離感,還有點冷。梁敬彬先生的新書,用生動的故事形式敘述複雜技術,開創資料庫技術書籍故事化的寫作先河。梁先生技術功底和文字功底同樣深厚,更重要的是具有作為講師那種縝密、體系化的思維方式,以及對讀者心思的透視力,因此成書脈絡清晰,裡面還不斷穿插許多人生哲理,技術前瞻,讓人獲益良多。這本書非常適合入行者和在行業裡謀求上升的同仁閱讀,動人的文筆可以讓你一口氣讀完這本書,而且完全沒有讀其它技術書籍時那種頭暈腦脹,昏昏入睡的感覺。這是一本值得向行業推介的優秀技術書籍。
——中國資料庫社群ITPUB創始人黃志洪(tigerfish)
多年前作為DBA時我曾經總結過,到底是什麼後天原因能導致人和人之間的學習結果發生重大差異,其中有一點就是思維方式。於是我嘗試在思維方式方面去影響身邊的一些人,最後這些人在各自的領域也都獲得了成功,而在此之前他們卻是默默無聞。思維方式可以由長期的訓練而固化下來,但若是無人在身邊影響你,那麼最好就是你自己有意識的發生改變。敬彬此書就是用詼諧幽默的語言生動地引導大家在意識層面發生改變,然後逐步轉化為行動上的改變,按此堅持幾年下來,相信每個人都能邁上自己新的臺階,這的確早已超越oracle的範疇,對我們諸多方面都有益處。
——支付寶平臺資料部資深總監馮春培 (biti_rainy)
敬彬兄這本書有著與市場上其他Oracle書籍與眾不同的特點,他透過一個個精彩的小故事,串起Oracle的核心知識和最佳化方法論,並時刻強調學習和工作的意識,如何不被技術束縛,如何跳出技術,意識和方法真的很重要。相信讀完本書,你的收穫,絕對不止Oracle!
——ITPUB Oracle開發版資深版主,《劍破冰山——Oracle開發藝術》副主編 丁俊(dingjun123)
通讀本書,如醍醐灌頂,豁然開朗,本書從實戰出發,出發於技術,而超脫於意識,回味無窮,作者擁有多年的Oracle應用和體系架構設計的經驗,付出了不亞於任何人的努力,總結出眾多獨到的經驗,不失為一本好書,為學習和使用Oracle的技術人員帶來諸多益處。
——福富軟體公司運營總監傅祥文
由梁敬彬、梁敬弘兄弟合作的《收穫,不止Oracle》一書問世了。這對學習和從事資料庫相關事務的業內人員來說,是一件幸事。讀一本技術方面的書,或修一門課程、聽一個講座,大凡可能有三方面的收穫:掌握相關的知識,提高解決問題的能力,激發學習、探討有關問題的興趣和熱情。這些可能的收穫不在一個層面上,後兩者更為可貴。梁敬彬梁敬弘兄弟的這本書恰恰給讀者提供了這樣的機會。當然,要有真收穫,還要有真努力。
梁敬弘曾是我的學生,不僅學業專精,圍棋也下得很不錯,是一個真誠而聰明的小夥子,跟他的哥哥相比,內向一些。梁敬彬與弟弟相比更善於溝通和表達,是一個資料庫方面的專家,也是一個很好的教師。在此,預祝本書的出版獲得成功,同時也祝兄弟二人在事業上不斷取得新的成就。
——清華大學計算機系教授黃連生
我們選取了《收穫,不止Oracle》中的一些章節,希望對大家有些參考。
精彩章節
1、Oracle體系結構圖:
圖片來自網路
① Oracle由實體和資料庫組成,上半部的直角方框為實體instance,下半部的圓角方框為資料庫databases。
② 實體是由一個開闢的記憶體區SGA(System Global Area)和一系列後臺行程組成的,其中SGA最主要被劃分為共享池(shared pool)、資料緩衝區(db cache)和日誌緩衝區(log buffer)三類。後臺行程包括PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH等系列行程。
③ 資料庫是由資料檔案、引數檔案、日誌檔案、控制檔案、歸檔檔案等系列檔案組成的,其中歸檔日誌最終可能會被轉移到新的儲存介質中,用於備份恢復使用。
④ PGA(Program Global Area)區,這也是一塊開闢出來的記憶體區,和SGA最明顯的區別在於,PGA不是共享記憶體,是私有不共享的,S理解為共享的首字母。使用者對資料庫發起的無論查詢還是更新的任何操作,都是在PGA先預處理,然後接下來才進入實體區域,由SGA和系列後臺行程共同完成使用者發去的請求。
PGA起到的具體作用,也就是前面說的預處理,是什麼呢?主要有三點:第一,儲存使用者的連線資訊,如會話屬性、系結變數等;第二,儲存使用者許可權等重要資訊,當使用者行程與資料庫建立會話時,系統會將這個使用者的相關許可權查詢出來,然後儲存在這個會話區內;第三,當發起的指令需要排序的時候,PGA正是這個排序區,如果在記憶體中可以放下這個排序的尺寸,就在記憶體PGA區內完成,如果放不下,超出的部分就在臨時表空間中完成排序,也就是在磁碟中完成。
⑤ 使用者的請求發起經歷的順序一般如下:1區 -> 2區 -> 3區;或者1區 -> 2區。
後臺行程介紹:
PMON:行程監視器,當其他行程出錯時進行處理
SMON:系統監視器,重點工作在於instance recovery 除此之外,還有清理臨時表空間、回滾段表空間和合併空閑空間
LCKn:僅適用於RAC資料庫,最多可有10個行程,用於實力間的封鎖
RECO:用於分散式資料庫的恢復
CKPT:用於觸發DBWR從資料緩衝區寫出資料到磁碟
DBWR:負責將資料緩衝區中的資料寫出到磁碟檔案中
LGWR:負責將日誌緩衝區的日誌資料寫出到REDO檔案中
ARCH:負責磁碟日誌檔案的歸檔,轉存到其他儲存介質中
2、Oracle邏輯結構:
表空間(tablespace):系統表空間、回滾段表空間、臨時表空間、使用者表空間。
段(segment)、區(extent)
塊(block):資料塊的組成
① 資料塊頭:包含標準內容和可變內容
② 表目錄區:資料所在的表資訊
③ 行目錄區:存放插入的行的地址
④ 可用空間區:塊中的空餘空間
⑤ 行資料區:儲存具體的行資訊或索引資訊
1)、在建表空間時需要預先規劃好表空間的大小,如果段的擴充套件導致表空間不夠而需要表空間去擴大,那麼開銷是很大的,但如果預先分配過多空間,也是一種浪費,因此我們需要根據實際應用去平衡。
2)、delete操作是無法釋放空間的,即沒辦法回收block塊,在delete之後只是block中無資料,可block依然存在,在後續的insert時將填充delete的空block,因此普通的堆表無法滿足有序插入有序讀出(不適用 order by)。
3、Oracle表分類
1)、普通堆表
不足:
表更新有日誌開銷
表delete操作不能釋放空間
表記錄太大檢索較慢
索引回表讀開銷很大
有序插入難有序讀出
2)、全域性臨時表
分類:基於session、基於事務
優點:高效刪除記錄,退出session或commit結束事務,記錄就刪除;不同會話獨立,避免鎖競爭,利於並行
3)、分割槽表
分類:range分割槽(範圍分割槽),list分割槽(串列分割槽),hash分割槽(雜湊分割槽),組合分割槽
分割槽表的特性:
① 高效的分割槽消除
② 強大的分割槽操作:分割槽truncate消除資料比較快速,並不同於delete,可釋放空間;分割槽資料轉移;分割槽切割想分就分,可將某個分割槽切割成多個分割槽,以達到增加分割槽數量的目的;分割槽合併想合就合;分割槽的增刪非常簡單
③ 分割槽索引型別:全域性索引;區域性索引
④ 分割槽表相關陷阱:對分割槽進行truncate操作之後,全域性索引失效,區域性索引正常,為了避免全域性索引失效,在對分割槽進行刪除、轉移、切割、合併、增加等操作時,可在命令後加“update global indexes”關鍵字;有索引效率反而更低;無法應用分割槽條件
4)、索引組織表:在create table的陳述句之後增加 organization index 關鍵字
優點:不需要回表查詢主鍵之外的列,效能更高
缺點:更新操作代價較高
4、索引
1)、建立索引有哪些操作
① 建索引先排序:將需要建索引的列和rowid取出排好序放在記憶體中
② 列值入塊成索引:依次將記憶體中的順序存放的列的值和對應的rowid存進Oracle空閑的Block塊中,形成索引塊
③ 填滿一塊接一塊:當塊1被填滿時,會接著填到其他空閑塊,如塊2,此時會有另外一件重要的事情發生,會產生一個莖塊B1用來管理塊1和塊2
④ 同級兩塊則會產生上層塊來管理下級塊,直到root根節點
2)、索引結構的三大特點
① 索引高度較低
② 索引儲存列值及能定位到行資料在資料表中的位置的rowid
③ 索引本身有序
3)、應用索引三大特性進行查詢最佳化
① 索引高度較低的妙用:由於索引結構導致高度較低,因此在表資料量相差甚遠的情況下,運用索引,查詢速度會相差無 幾,都會比較快,此種情況僅限於查詢結果比較少的情況,如果需要傳回表中的絕大部分資料,那用索引反而會更慢,不如全表掃描,原因是索引也是快,如果一個索引3層,100萬資料,那麼就需要300萬次IO,因此效能會下降
② 分割槽索引的設計誤區:如果在分割槽表中查詢時不能使用到分割槽條件,那麼建立分割槽索引是根據分割槽個數建立的,如果查詢沒有使用分割槽條件,就會去所有索引塊中查詢,那麼此時的索引高度將變得極高,IO次數變多,效能下降
③ count(*) 最佳化:索引不能儲存空值,索引列必須設定成不能為空,可以用 where object is not null 解決;當表中欄位很少,比如只有一個欄位,那此時使用索引會比全表掃描更慢,因為索引中儲存了欄位以外的rowid資料,總體來說比原表 資料更大了
④ sum/avg 最佳化:允許為空的列仍然不能使用索引
⑤ max/min 最佳化:能使用允許為空的列的索引;執行計劃只有兩次邏輯讀,這是因為索引的結構導致的結果,max只要去最右邊的最後一列查詢,min則去最左邊第一列查詢即可,因為索引是有序的;select min(object_id),max(object_id) from t 不能使用索引,因為object_id列屬性允許為空,select min(object_id),max(object_id) from t where object_id is not null可以使用索引,但是 INDEX FAST FULL SCAN 型別索引,select max,min from(select max(object_id) max from t) a, (select min(object_id) min from t) b 能使用索引,並是 INDEX FULL SCAN(MIN/MAX)型別索引,邏輯讀比第二種少了非常多
⑥ 索引回表與最佳化:應儘量不要使用 select * from t,這樣會導致全表掃描操作;善用聯合索引,聯合索引欄位不宜超過3個;(聚合因子:表和索引兩者的列的排序相似度),如果表的插入順序和索引列的順序基本一致,那麼從索引回表查詢資料塊將會更容易,這就是聚合因子底對查詢最佳化的幫助
⑦ order by 排序最佳化:在 order by 列上加索引,能有效提升查詢效率
⑧ distinct 最佳化:索引能消除 distinct 觸發的排序,提升效率
⑨ 索引全掃描和快速全掃描:INDEX FULL SCAN 和 INDEX FAST FULL SCAN 在如count(*) 和 sum 這種不需要排序的查詢時使用快速全掃描,而在涉及排序陳述句時,就要權衡利弊了,也許使用全速全掃描,也許使用非快速掃描,由oracle最佳化器計算出成本值決定
⑩ union 合併最佳化:在使用union時索引是不能消除排序的,因為這是兩個結果集的篩選
4)、不得不說的主外來鍵設計
① 外來鍵上的索引與效能:外來鍵上建索引能對連線查詢有很大的效能提升
② 外來鍵索引與鎖的避免:在外來鍵上建立索引不但能提升查詢效能,還能有效避免鎖競爭
③ oracle支援級聯刪除,需慎用
5)、聯合索引
① 在等值查詢情況下,組合索引的列無論哪一列在前,效能都一樣
② 組合索引的列,當一列是範圍查詢,一列是等值查詢的情況下,等值查詢列在前,範圍查詢列在後,這樣的索引才能提高效能
分析:因為索引有序,當兩個查詢列都為等值時,遍歷索引塊的次數一樣,當一列為範圍時,如果該列在前那麼遍歷將不會那麼容易停下,相反,等值列在前時,將很快停止遍歷,也即是遍歷列更少,當然會更快
③ 設計需考慮單列的查詢:如果單列的查詢列和聯合索引的前置列一樣,那單列可以不建索引,直接利用聯合索引來進行檢索資料
6)、資料更新會受到索引影響,因此在需要插入資料時,應該先使索引失效,在資料插入完成之後,重新建立索引
7)、建立索引的過程會引發大量排序和鎖競爭
8)、可以透過監控索引來蚌段索引是否被使用過,從而刪除根本用不到的索加監控命令:alter index 索引名 monitoring usage;撤銷命令:alter index 索引名 nomonitoring usage
9)、點陣圖索引
① 點陣圖索引在進行count(*)統計操作時效能比B樹索引快近100倍,並且點陣圖索引可以儲存空值
② 點陣圖索引的適用場景需要滿足以下兩個條件:點陣圖索引列大量重覆
10)、函式索引:create index idx_upper_obj_name on t(upper(object_name))
5、表的連線:巢狀迴圈、雜湊連線、排序合併
1)、在巢狀迴圈連線中,驅動表傳回多少條記錄,被驅動表就傳回多少記錄
2)、在hash連線中,驅動表和被驅動表都只會訪問0次或1次
3)、排序合併連線和hash連線一樣,兩張表都只會訪問0次或1次,合併連線根本就沒有驅動和被驅動的概念
4)、巢狀迴圈連線要特別註意驅動表的排序,小的結果集先訪問,大的結果集後訪問,才能保證被驅動表的訪問次數降到最低,從而提升效能
5)、巢狀迴圈連線和hash連線有驅動順序,驅動表的順序不同將影響表連線的效能,而排序合併連線沒有驅動的概念,無論那張表在前都無妨
6)、巢狀迴圈連線和hash連線不需要排序,而排序合併則需要排序,在取欄位時,盡可能少的取欄位,排序需要消耗記憶體
7)、hash連線不支援不等值連線 “<>”、”>” 和 “”的連線條件,也不支援like的連線,但支援 “>” 之類的連線條件;巢狀迴圈無限制
8)、最適合巢狀迴圈連線的場景
① 兩表關聯傳回的記錄不多,幾遍兩張表的記錄奇大無比,也是非常迅速的
② 遇到一些不等值查詢導致雜湊和排序合併連線被限制使用時,不得不使用巢狀迴圈連線
*****連線查詢最佳化*****:驅動表的限制條件所在列加索引;被驅動表的連線條件所在列加索引
9)、雜湊連線與索引
① 索引的連線條件起不到快速檢索的作用,但是限制條件列如果有合適的索引,可以快速檢索少量記錄,還是可以提升效能的
② 雜湊連線需要在PGA中的HASH_AREA_SIZE中完成,因此增大HASH_AREA_SIZE也是最佳化雜湊連線的一種有效途徑,一般在記憶體自動管理的情況下只要加大PGA區大小即可
10)、排序合併與索引:排序合併連線上的連線條件雖然沒有檢索的作用,卻有清除排序的作用
原文:https://blog.csdn.net/eric520zenobia/article/details/80922035
為了回饋我們默默關註的粉絲朋友們,我們特地聯合電子工業出版社給大家免費贈送《收穫,不止Oracle》5本。
參與方式:
1. 留言最美:在本公眾號下方留言,可以分享自己的工作經驗,也可以談談工作中遇到的一些坑,與大家共勉,我們將選出最為真誠的一條留言作者贈與圖書;
2. 留言集贊數最多:在本公眾號下方留言,留言點贊數排名前四名將分別獲得圖書一本;
本次活動公平真實,每個微訊號最多可獲得一本圖書,4.13日將在本公眾號釋出獲獎名單,歡迎大家的參與!
朋友會在“發現-看一看”看到你“在看”的內容