成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據庫是如何獲取并處理數據的

數據庫 SQL Server
SQL是結構化查詢語言(Structured Query Language)的簡稱,用戶只需要通過SQL告訴數據庫需要什么,至于怎么去做就是數據庫管理系統(DBMS)需要考慮的問題。

SQL是結構化查詢語言(Structured Query Language)的簡稱,用戶只需要通過SQL告訴數據庫需要什么,至于怎么去做就是數據庫管理系統(DBMS)需要考慮的問題。

上篇文章《SQL語句處理》介紹了數據庫執行的四個階段,每個階段都做了什么工作。今天這篇文章繼續探討數據庫是如何獲取到用戶所需的數據。

如下所探討的內容僅適用于Oracle單機環境,RAC環境稍有不同,不在本篇討論范圍內。

數據庫的所有操作增、刪、改、查都是在內存中完成的,為了處理數據,數據庫首先需要將數據從磁盤讀取到內存中,然后進行相應的操作。但是內存和磁盤的讀寫速度有著天壤之別。DDR4內存讀寫速度大概50G每秒(50000M),固態硬盤速度是300M每秒,是內存的二百分之一,機械硬盤的速度是100M每秒,是內存的五百分之一。為了解決兩者之間的速度差的問題,誕生了緩存的概念。緩存的作用就是避免每次獲取數據時都從緩慢的磁盤讀取,而是將之前訪問過的數據緩存在內存中,后續操作如果需要相同數據時,直接從內存獲取,大大提升讀取速度。

Oracle內存結構中有一個很重要的結構叫做DB Buffer Cache,DB Buffer Cache位于SGA中,正常系統中此部分內存占整個Oracle內存結構大絕大部分。如果DB Buffer Cache很大,幾十G,甚至是幾百G,每次在其中搜索所需的塊是否存在,也需要很長的時間,因此,為了提高效率,Oracle將DB Buffer Cache劃分為多個區域,每個區域稱為一個工作集(workset),每個工作集又被劃分為多個hash buckets,一個hash buckets管理著一個或多個數據塊。為了保證數據的一致性,hash buckets訪問是串行的,由相應的latch保護,只有獲取到相應的latch的會話才能到hash buckets上搜索數據塊。

1、查詢語句的執行

假設有如下查詢語句:

SELECT * FROM employees WHERE employee_id=199;

表employees表結構如下,employee_id是表的主鍵。

先看下上述sql語句的執行計劃

首先根據索引EMP_EMP_ID_PK查找employee_id=199鍵,獲取到鍵所對應的值ROWID,ROWID指向數據塊的真實地址。通過ROWID獲取數據塊,獲取到數據塊后,再從數據塊中獲取符合條件的數據。在此過程中至少需要訪問兩個數據塊(為了簡化過程,忽略其他數據塊),一個是鍵為199索引塊,假設為100號塊;另一個是索引塊所指向的數據塊,假設為1000號塊。

前面緩存介紹中提到,為了提升數據的訪問速度,Oracle會將訪問過的數據塊緩存到DB Buffer cache中,以備重復使用。因此上面獲取100號索引塊的時候,需要先到DB Buffer cache中查找100號索引塊是否已存在,以減少昂貴的磁盤讀。在搜索DB Buffer cache前,必須獲取相應的latch后才能進行搜索。如果未獲取到latch,此時會進入等待。待獲取到latch后便可以對DB Buffer cache搜索。

如果100號索引塊已存在于內存中,且沒有會話正在修改數據塊內容,直接訪問內存中的數據塊,獲取鍵為199的數據。如果有會話正在修改此數據塊內容,則需要通過undo數據和當前的數據塊構造一個一致性讀版本的數據塊,來讀取會話修改前的歷史版本數據。

如果100號索引塊不在內存中,首先判斷是否有其他會話正在將100號索引塊讀入內存,如果是,則等待。否則通知后臺進程將100號索引塊從磁盤讀入內存,在將100號索引塊讀入內存前,需要在內存中找到一塊合適的空閑塊,以便保存即將讀入的100號索引塊。搜索空閑塊時同樣需要獲得latch。

如果內存中沒有空閑的空間,則通知后臺刷新進程刷新臟頁,以騰出空閑空間。

如果內存中有空閑的空間,直接將100號索引塊讀入內存。獲取到ROWID后,再去讀取數據塊,讀取數據塊的過程同讀取索引塊,讀取到數據塊后再從數據塊中獲取符合條件的行,返回給客戶端。

2、DML語句執行

假設有如下更新語句:

UPDATE employees SET first_name='Hello',last_name='Kitty' WHERE employee_id=199;

update語句執行計劃如下:

DML語句都存在相應的查詢過程,因為只有查詢到了所需要修改的數據,才能進行相應的操作。查詢的過程大致與查詢語句執行過程相同。但也有如下不同點:

獲取latch時,如果是只讀操作,多個會話可以同時獲取相同的latch,如果是DML操作,則不可以同時獲得。

只讀操作多個會話可以同時讀取同一個數據塊,DML操作則不可以多個會話同時修改同一個數據塊。

獲取到數據塊后進行相應的操作,并記錄對應的undo信息和redo log信息,完成update操作。

責任編輯:華軒 來源: 今日頭條
相關推薦

2021-01-26 13:40:44

mysql數據庫

2018-08-09 12:23:31

數據庫Oracle靜默錯誤

2017-10-23 13:52:31

數據庫硬件

2021-07-01 10:45:08

硬盤數據庫性能

2011-05-26 14:43:49

ORACLE數據庫異常處理

2011-04-07 15:47:28

MySQL數據庫

2011-03-23 16:54:38

數據庫聯機處理

2022-11-14 18:23:06

亞馬遜

2010-05-31 15:23:02

MySQL數據庫NUL

2021-02-23 14:56:12

數據庫存儲索引

2011-07-19 11:12:36

PHPMySQL數據庫

2009-12-03 15:31:30

PHP獲取顯示數據庫數

2011-06-30 16:57:03

數據壓縮

2024-08-09 08:28:14

品牌數據庫產品

2020-11-24 17:22:15

數據庫MySQL技術

2023-10-08 08:09:16

數據庫性能服務器

2011-05-26 13:36:40

Oracle數據庫時間處理

2010-07-15 17:28:50

SQL Server

2010-04-07 14:22:46

2017-10-23 16:06:41

數據庫MySQL復制中斷
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产aaaaav久久久一区二区 | 精品国产一区二区三区久久久蜜月 | 久久婷婷香蕉热狠狠综合 | 97超在线视频 | 久久久久国产精品一区 | 国产传媒在线观看 | 国产精品一区二区久久 | 国产免费一区二区 | 中文字幕精品一区二区三区精品 | 欧美在线视频网 | 亚洲国产成人精品女人 | 成人不卡视频 | 日韩不卡一区二区三区 | 成人高清在线 | 亚洲视频精品 | 91看片网| 亚洲天堂久久 | 日本公妇乱淫xxxⅹ 国产在线不卡 | 欧美另类视频在线 | 老司机免费视频 | caoporn国产精品免费公开 | 玖玖视频免费 | www国产成人 | 欧美精品在线一区二区三区 | 好好的日在线视频 | 亚洲h色 | 精品国产欧美 | 国产成人免费视频网站视频社区 | 久久国产精彩视频 | 欧美精品二区 | 在线黄| 国产一区二区三区四区五区加勒比 | 日日草天天干 | 久久99精品久久久久蜜桃tv | 亚洲视频在线观看 | 亚洲国产精品成人综合久久久 | 日韩在线第一 | 992人人草| 午夜精品一区二区三区在线观看 | 国产成人精品一区二区三 | 亚洲成人精选 |