偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

數(shù)據(jù)庫是如何獲取并處理數(shù)據(jù)的

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

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

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

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

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

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

1、查詢語句的執(zhí)行

假設有如下查詢語句:

SELECT * FROM employees WHERE employee_id=199;

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

先看下上述sql語句的執(zhí)行計劃

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

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

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

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

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

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

2、DML語句執(zhí)行

假設有如下更新語句:

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

update語句執(zhí)行計劃如下:

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

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

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

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

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

2021-01-26 13:40:44

mysql數(shù)據(jù)庫

2018-08-09 12:23:31

數(shù)據(jù)庫Oracle靜默錯誤

2021-07-01 10:45:08

硬盤數(shù)據(jù)庫性能

2017-10-23 13:52:31

數(shù)據(jù)庫硬件

2011-05-26 14:43:49

ORACLE數(shù)據(jù)庫異常處理

2011-04-07 15:47:28

MySQL數(shù)據(jù)庫

2011-03-23 16:54:38

數(shù)據(jù)庫聯(lián)機處理

2022-11-14 18:23:06

亞馬遜

2021-02-23 14:56:12

數(shù)據(jù)庫存儲索引

2010-05-31 15:23:02

MySQL數(shù)據(jù)庫NUL

2011-07-19 11:12:36

PHPMySQL數(shù)據(jù)庫

2011-06-30 16:57:03

數(shù)據(jù)壓縮

2024-08-09 08:28:14

品牌數(shù)據(jù)庫產品

2020-11-24 17:22:15

數(shù)據(jù)庫MySQL技術

2009-12-03 15:31:30

PHP獲取顯示數(shù)據(jù)庫數(shù)

2011-05-26 13:36:40

Oracle數(shù)據(jù)庫時間處理

2023-10-08 08:09:16

數(shù)據(jù)庫性能服務器

2011-03-25 13:47:33

開源數(shù)據(jù)庫兼容

2010-07-15 17:28:50

SQL Server

2010-04-07 14:22:46

點贊
收藏

51CTO技術棧公眾號