Oracle簡單查詢原理時候元資料時如何通過I/O讀取的?舉例:Select Name From Student Where Sex = ‘男’And Age > 12;
1、表中沒有任何索引:全表掃描,讀取表中所有元資料進入快取,并逐行篩選符合Sex與Age的條件的Student,符合則記錄Name值,負責下一行
2、Sex為索引,其余都不是:首先根據Sex索引掃描獲取滿足條件的RowID,然后根據RowId讀取符合條件的所有Student元資料進入快取并通過Age篩選大于12的Student,符合則記錄Name值,負責下一行
3、Name、Sex、Age都有索引:則直接讀取索引,不需要讀取Student表元資料
歡迎大神指點!!!!!以上都是自我理解,肯定有許多理解不對的地方,尤其是讀取元資料到快取的時候。找了好多貼和視頻,都沒有找到有關讀取快取時具體細節問題,所以只能自己寫一點,還望高人指點。。如果有類似的貼,請發個鏈接,多謝
uj5u.com熱心網友回復:
元資料是元資料,資料是資料,你說的元資料都是資料?1、大致步驟差不多,但不一定會經過記憶體,更不可能一次性進入記憶體;
2、如果索引在性別這種欄位上,除非where條件種有其他條件,并且多個索引通過種種途徑同時使用到了,那么單掃描索引獲得rowid返表取數的效率不如表掃描;
1、第三條說的直接讀取索引,意思是索引覆寫了sql?那也得是組合索引才行,btree索引不能提供你第三條的功能,但用到sex+age上兩條索引的可能性還是有的,就是我上面說的一種情況,你在執行計劃中能看到BITMAP CONVERSION FROM ROWIDS這樣的操作,簡單地可以理解為:oracle將btree索引轉為了位圖索引,通過兩個位圖的操作(你的栗子中是and),之后再從合并后的位圖中獲取rowid,進一步在從表中獲取資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/38272.html
標籤:基礎和管理
