中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

索引掃描可能不如全表掃描的場景的理解__純粹數據量而言,不涉及CLUSTERING_FACTOR

發布時間:2020-08-08 23:28:07 來源:ITPUB博客 閱讀:236 作者:lusklusklusk 欄目:關系型數據庫
多塊讀的場景
Full Table Scan --全表掃描
Index Fast Full Scans  --索引快速全掃描

單塊讀的場景
Rowid Scans --直接通過Rowid獲取
Index Unique Scans --索引唯一掃描
Index Range Scans --索引局部掃描
Index Skip Scans --索引跳躍掃描
Index Full Scans --索引全掃描


全表掃描(Full Table Scans FTS)
為實現全表掃描,Oracle 讀取表中所有行,并檢查每一行是否滿足語句的WHERE 限制條件,全表掃描時一次I/O 能讀取多個數據庫塊(db_file_multiblock_read_count參數設定),而不是只讀取一個數據塊,即多塊讀,這極大的減少了I/O 總次數,提高了系統的吞吐量。

索引掃描(Index Scan或index lookup)
我們先通過index 查找到數據對應的rowid 值(對于非唯一索引可能返回多個rowid 值),然后根據rowid 直接從表中得到具體的數據,這種查找方式稱為索引掃描或索引查找(indexlookup)。
一個rowid 唯一的表示一行數據,該行對應的數據塊是通過一次I/0 得到的,在此情況下該次i/o 只會讀取一個數據庫塊,即單塊讀。

在索引中,除了存儲每個索引的值外,索引還存儲具有此值的行對應的ROWID 值。
索引掃描可以由2 步組成:
1 掃描索引得到對應的rowid 值。
2 通過找到的rowid 從表中讀出具體的數據。
每步都是單獨的一次I/O,但是對于索引,由于經常使用,絕大多數都已經CACHE 到內存中,所以第1 步的I/O 經常是邏輯I/O,即數據可以從內存中得到。但是對于第2 步來說,如果表比較大,則其數據不可能全在內存中,所以其I/O 很有可能是物理I/O,這是一個機械操作,相對邏輯I/O 來說,是極其費時間的。



為什么多塊讀比單塊讀快,即為什么有時全表掃描比索引掃描還快
因為邏輯讀物理讀單位是次塊(一次讀取相同或不同塊數情況下,看讀取了多少次,當然邏輯讀沒有IO,只有物理讀有IO),數據總塊數一樣的情況下,多塊讀的話,讀取次數就少,邏輯讀或物理讀就少了,而全表掃描就是多塊讀。
個人理解:一個IO就是一個IO,不管多塊,還是單塊,都是一個次IO。
就好比你花1塊錢買了1顆糖,有人1塊能買10顆糖,消耗的成本其實都是1塊錢。
再比如一秒內要讀完10個塊,單塊讀的話1次讀一個塊,需要10次,多塊讀的話假如1次讀10個塊,需要1次。雖然兩者產生的IO吞吐量都是一樣的,但是前者的IOPS是10,后者的IOPS是1,而一次IO的開啟和結束是要消耗操作系統很多資源的。

案例1
假定多塊讀,一次讀取5個數據庫塊,一張大表10000個數據庫塊,100個索引塊,如果要取出的數據大于總量的20%,使用索引掃描,因為兩步的每一步都是單獨的一次I/O,且每一次I/O都是單塊讀只能讀取一個數據庫塊,所以要掃描的次數=索引塊的數量+全部數據塊的20%的數量=100+10000*20%=2100次,如果都是物理讀那么其中IO次數就是2100;使用全表掃描,一次就讀取5個數據塊,所以要掃描的次數=全部數據庫/5=10000/5=2000,如果都是物理讀那么IO次數就是2000。


案例2
假設一張表含有10萬行數據--------100000行
我們要讀取其中20%(2萬)行數據----20000行
這張表一共有10000個數據塊--------10000塊(一個塊10行,每行800字節)
通過索引讀取20000行數據 = 約20000個table access by rowid = 需要處理20000個塊來執行這個查詢,但是,整個表只有10000個塊,所以:如果按照索引讀取全部的數據的20%相當于將整張表平均讀取了2次。

當然也不能說索引讀取行數大于整表的塊數,那都是全表掃描了,還要考慮讀取的塊是邏輯讀還是物理讀。
如果都是邏輯讀,肯定是
索引掃描次數大于全表掃描次數
如果都是物理讀,不CLUSTERING_FACTOR極端的情況下,肯定是索引掃描小于全表掃描
--
比如上面案例2索引掃描雖然要處理20000個塊,但是這20000個塊,肯定不是都是物理讀,其中物理讀IO正常情況下大概也就2000個塊(占整表塊的20%),全表掃描的話如果都是物理讀那么IO是10000個塊。
當然如果這20%的數據分布極端散列,分布在了表的所有塊上, 也就是10000個塊上,如果索引掃描和全表掃描都是物理讀,那么索引掃描的IO=100+10000,全表掃描的IO=10000


所以如果較大表進行索引掃描,取出的數據如果大于總量的5%—10%,使用索引掃描可能效果還不如全表掃描
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石阡县| 中卫市| 广南县| 尉犁县| 乐山市| 徐汇区| 芦山县| 南和县| 漯河市| 大埔县| 陇西县| 酉阳| 安图县| 祁东县| 陆良县| 阳高县| 德兴市| 长兴县| 资溪县| 乡宁县| 呼伦贝尔市| 尼勒克县| 清原| 湘潭市| 驻马店市| 安徽省| 千阳县| 彭山县| 华容县| 大安市| 岢岚县| 加查县| 汪清县| 揭西县| 临猗县| 万盛区| 玉屏| 安吉县| 阳东县| 水富县| 安国市|