自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談SQL Server內(nèi)部運(yùn)行機(jī)制

數(shù)據(jù)庫 SQL Server
要想成為一個(gè)好的Sql優(yōu)化高手,首先要做的一件事無疑就是了解sql語句在SQL Server中是如何執(zhí)行的。在這一系列中,我們將開始sqlserver優(yōu)化系列講解,本 講為優(yōu)化系列的開篇文章,在本篇文章中,我們將重點(diǎn)講解SQL Server體系結(jié)構(gòu)。

對于已經(jīng)很熟悉T-SQL的讀者,或者對于較專業(yè)的DBA來說,邏輯的增刪改查,或者較復(fù)雜的SQL語句,都是非常簡單的,不存在任何挑戰(zhàn),不值得一提,那么,SQL的哪些方面是他們的挑戰(zhàn) 或者軟肋呢?

那就是sql優(yōu)化。然而,要想成為一個(gè)好的Sql優(yōu)化高手,首先要做的一件事無疑就是了解sql語句在SQL Server中是如何執(zhí)行的。在這一系列中,我們將開始sqlserver優(yōu)化系列講解,本講為優(yōu)化系列的開篇文章,在本篇文章中,我們將重點(diǎn)講解SQL Server體系結(jié)構(gòu)。

在正式講解之前,我們先來看看如下問題,你是否遇到過,若你遇到過且成功解決,那么這篇文章,你可以跳過。

為了測試需要,我們先模擬插入5億3千多萬條數(shù)據(jù)。

 

  1. SELECT COUNT(1) FROM BigDataTest 

 

 

 

 

(一)查詢緩慢問題

*,臨時(shí)表,表連接,子查詢等造成的查詢緩慢問題,你能解決嗎?

(二)內(nèi)存泄漏

如下查詢了8分2秒,然后內(nèi)存溢出,你知道問題嗎?

 

  1. SELECT * FROM BigDataTest 

 

 

 

 

(三)經(jīng)常聽說如下概念,你都能解決嗎?

事務(wù)與鎖(請參考我另一篇文章:淺談SQL Server事務(wù)與鎖(上篇)https://www.cnblogs.com/wangjiming/p/8396986.html,ACID,隔離級別,臟讀,分表分庫,水平拆分,垂直拆分,高并發(fā)等

一、SQL Server體系結(jié)構(gòu)抽象

 

 

 

 

二、SQL Server體系結(jié)構(gòu)概述

SQL Server核心體系結(jié)構(gòu),大致包括六大部分:客戶端訪問工具、SQL Server 網(wǎng)絡(luò)接口(SQL Server Network Interface,SNI)、關(guān)系引擎、存儲引擎、

磁盤和緩沖池。下圖為SQL Server核心體系大致輪廓圖。

 

 

 

 

(一)SQL Server客戶端訪問工具

 

 

 

 

SQL Server客戶端訪問工具,提供了遠(yuǎn)程訪問技術(shù),它與SQL Server服務(wù)端基于一定的協(xié)議,使其能夠遠(yuǎn)程訪問數(shù)據(jù)庫,就像在本地操作數(shù)據(jù)庫一樣,如我們經(jīng)常用的

Microsoft SQL Server Management Studio。

SQL Server客戶端訪問工具是比較多的,其中比較流行的要數(shù)Microsoft SQL Server Management Studio 和Navicat(Navicat在MySQL中也是比較常用的)了,至于其他工具,本篇文章就不列舉了,感興趣的讀者朋友,可以查詢一下。

(二)SQL Server網(wǎng)絡(luò)協(xié)議

 

 

 

 

SQL Server網(wǎng)絡(luò)協(xié)議,又叫SQL Server網(wǎng)絡(luò)接口(SNI),它是構(gòu)成客戶端和服務(wù)端通信的橋梁,它與SQL Server服務(wù)端基于一定協(xié)議,方可通信,如我們在客戶端輸入一條查詢語句SELECT * FROM BigDataTest,這條語句,只有客戶端和服務(wù)端基于一定協(xié)議,方可被服務(wù)端解析,否則,被視為無效語句。

SQL Server網(wǎng)絡(luò)協(xié)議,由一組API構(gòu)成,這些API供SQL Server數(shù)據(jù)庫引擎和SQL Server本地客戶端調(diào)用,如實(shí)現(xiàn)最基本的CRUD通信。

SQL Server 網(wǎng)絡(luò)接口(SQL Server Network Interface,SNI)只需要在客戶端和服務(wù)端配置網(wǎng)絡(luò)協(xié)議即可,它支持一下協(xié)議:

(1)共享內(nèi)存

(2)TCP/IP

(3)命名管道

(4)VIA

(三)關(guān)系引擎

 

 

 

 

關(guān)系引擎,也叫查詢引擎,其主要功能是負(fù)責(zé)處理SQL語句,其核心組件由三部分組成:命令分析器、查詢優(yōu)化器和查詢執(zhí)行器。

(1)命令分析器:負(fù)責(zé)解析客戶端傳遞過來的T-SQL語句,如客戶端傳遞一條SQL語句:SELECT * FROM BigDataTest,它會檢查該語句的語法結(jié)構(gòu),若語法

錯(cuò)誤,它會將錯(cuò)誤返回給協(xié)議層,然后協(xié)議層將錯(cuò)誤返回給客戶端;如果語法結(jié)構(gòu)正確,它會根據(jù)查詢命令生成查詢計(jì)劃或?qū)ふ乙粋€(gè)已存在的查詢計(jì)劃(先在緩沖池計(jì)劃緩存中查找,若找到,則直接給查詢執(zhí)行器執(zhí)行,若未找到,則會生成基于T-SQL的查詢樹,然后交給查詢優(yōu)化器優(yōu)化)

(2)查詢優(yōu)化器:負(fù)責(zé)優(yōu)化命令解析器生成的T-SQL查詢樹(基于資源的優(yōu)化,而非基于時(shí)間的優(yōu)化),然后將最終優(yōu)化結(jié)果傳遞給查詢執(zhí)行器執(zhí)行。查詢優(yōu)化器是基于

“資源開銷”的優(yōu)化器,這種算法評估多種可執(zhí)行的查詢方式,并從中選擇開銷***的方案作為優(yōu)化結(jié)果,然后將該結(jié)果生成查詢計(jì)劃輸出給查詢執(zhí)行器。注意,查詢優(yōu)化器是“基于資源開銷***”而非“基于方案***”,也就是,查詢優(yōu)化器的最終優(yōu)化結(jié)果未必是***的方案,但一定是資源開銷***的方案。

(3)查詢執(zhí)行器:負(fù)責(zé)執(zhí)行查詢。假若查詢執(zhí)行器接收到命令解析器或查詢優(yōu)化器傳遞過來的SQL語句:SELECT * FROM BigDataTest,它通過OLE DB接口傳遞到存儲引擎,再傳遞到存儲引擎的訪問方法。

(四)存儲引擎

 

 

 

 

存儲引擎,本質(zhì)就是管理資源存儲的,它的核心組件包括三部分:訪問方法、事務(wù)管理器和緩沖區(qū)管理器。

(1)訪問方法:訪問方法本質(zhì)是一個(gè)接口,供查詢執(zhí)行器調(diào)用(該接口提供了所有檢索數(shù)據(jù)的代碼,接口的實(shí)際執(zhí)行是由緩沖區(qū)管理器來執(zhí)行的),假若查詢執(zhí)行器傳遞一條SQL語句:

SELECT * FROM BigDataTest,訪問方法接收到該請求命令后,就會調(diào)用緩沖區(qū)管理器,緩沖區(qū)管理器就會調(diào)用緩沖池的計(jì)劃緩存,在計(jì)劃緩存中尋找到相應(yīng)的結(jié)果集,然后返回給關(guān)系引擎。

(2)緩沖區(qū)管理器:供訪問方法調(diào)用,管理緩沖池,在緩沖池中查詢相應(yīng)資源并返回結(jié)果集,供訪問方法返回給關(guān)系引擎。

(3)事務(wù)管理器:主要負(fù)責(zé)事務(wù)的管理(ACID管理)和高并發(fā)管理(鎖),它包括兩個(gè)核心組件(日志管理器和鎖管理器),鎖管理器負(fù)責(zé)提供并發(fā)數(shù)據(jù)訪問,設(shè)置隔離級別等;日志管理器負(fù)責(zé)記錄所有訪問方法操作動作,如基本的CRUD。

(五)緩沖池

 

 

 

 

緩沖池駐于內(nèi)存中,是磁盤和緩沖區(qū)管理器的橋梁SQL Server中,所有資源的查詢都是在內(nèi)存中進(jìn)行的,即在緩沖池中進(jìn)行的,假若緩沖池接收到緩沖區(qū)管理器傳遞過來的的一條SQL語句:SELECT * FROM BigDataTest,緩沖區(qū)管理器數(shù)據(jù)緩存先從磁盤數(shù)據(jù)庫中取滿足條件的結(jié)果集,然后放在緩沖池?cái)?shù)據(jù)緩沖中,然后以結(jié)果集的形式返回給緩沖區(qū)管理器,供訪問方法返回給關(guān)系引擎的查詢執(zhí)行器,然后返回給協(xié)議層,協(xié)議層再返回給客戶端。注意,這里操作的是緩沖池中數(shù)據(jù),而不是磁盤DB中的數(shù)據(jù),并且操作的緩沖池?cái)?shù)據(jù)不會立即寫入磁盤,因此就會造成查詢到結(jié)果與BD中的結(jié)果不一致,這就是所謂的臟讀。

緩沖池主要包括兩部分:計(jì)劃緩存(生成執(zhí)行計(jì)劃是非常耗時(shí)耗資源的,計(jì)劃緩存主要用來存儲執(zhí)行計(jì)劃,以備后續(xù)使用)和數(shù)據(jù)緩存(通常是緩存池中容量***的,消耗內(nèi)存***,從磁盤中讀取的數(shù)據(jù)頁只要放在這里,方可調(diào)用)

(六)磁盤

 

 

 

 

磁盤主要是用來存儲持久化資源的,如日志資源,數(shù)據(jù)庫資源和緩存池持久化支援等。

三、一個(gè)查詢的完整流程

如下為一個(gè)比較完善的查詢過程,即第二部分查詢語句:SELECT * FROM BigDataTest 整個(gè)過程。

 

 

 

 

四、參考文獻(xiàn)

【01】《SQL Server 2012 深入解析與性能優(yōu)化 第3版》Christian Bolton,Justin Langford,Glenn Berry,Gavin Payne,Amit Banerjee,Rob Farley著 

責(zé)任編輯:龐桂玉 來源: 數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2019-05-10 14:00:21

小程序運(yùn)行機(jī)制前端

2019-08-15 10:17:16

Webpack運(yùn)行瀏覽器

2015-11-20 11:20:54

js開發(fā)

2009-02-03 14:00:20

PHP運(yùn)行PHP調(diào)用PHP原理

2009-12-11 10:52:37

PHP運(yùn)行機(jī)制

2010-02-01 17:19:30

C++運(yùn)行機(jī)制

2019-10-11 09:00:00

JavaScriptEvent Loop前端

2010-01-05 16:10:21

.NET Framew

2023-05-26 08:01:01

FacebookVelox機(jī)制

2010-02-23 10:15:22

WCF運(yùn)行機(jī)制

2012-03-06 10:22:00

程序

2009-10-22 17:10:04

CLR和JRE運(yùn)行機(jī)制

2010-09-28 11:05:49

jQuery

2015-11-16 11:17:30

PHP底層運(yùn)行機(jī)制原理

2016-12-13 14:12:25

程序機(jī)制

2016-12-14 14:41:20

Hello World程序運(yùn)行機(jī)制

2017-07-12 14:58:21

AndroidInstant Run

2010-05-06 17:54:54

Oracle鎖

2022-02-11 23:11:09

Kubernetes集群容器化

2017-05-31 13:16:35

PHP運(yùn)行機(jī)制原理解析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號