對于經(jīng)常管理數(shù)據(jù)庫的人來說,對SQL非常了解,有的甚至創(chuàng)建了許多SQL的項目,但是他們都不知道SQL數(shù)據(jù)庫引擎如何工作。顯然沒有人關心SQL引擎的內部工作或其他方面,因為在不知道SQL引擎如何工作的情況下,我們仍然可以使用SQL的任何程序創(chuàng)建和訪問數(shù)據(jù)庫。今天本文就詳細介紹一下SQL數(shù)據(jù)庫引擎如何工作的,以幫助您更好的認識和了解SQL數(shù)據(jù)庫。
## SQL是編程語言還是查詢語言?
使用SQL時,我們可以互換使用查詢和編程語言,許多開發(fā)人員將SQL稱為一種特殊的編程語言,因為SQL引擎包含兩個組件,即編譯器和垂直計算機,編譯器將查詢命令編譯為過程,而虛擬機則運行該過程。SQL引擎編譯和執(zhí)行SQL查詢的概念使其成為一種編程語言。因此,如果有人說SQL是一種編程語言,那么在某種程度上他將被認為是正確的。
如果我們任何編程語言都可以創(chuàng)建CRUD操作程序,為什么還要使用SQL?
的確,使用任何一種編程語言,我們都可以創(chuàng)建一個可以執(zhí)行簡單的CRUD操作的程序,但是當涉及到復雜的查詢時,我們必須用幾行等效的幾行代碼來編寫數(shù)百行SQL。
SQL概述
SQL代表結構化查詢語言,它可以被稱為編程語言或查詢語言,是SQL與關系數(shù)據(jù)庫進行交互的主要目的,其中關系數(shù)據(jù)庫以表格形式存儲數(shù)據(jù)。SQL可以管理大量數(shù)據(jù),特別是如果數(shù)據(jù)是同時寫入的,并且我們在該數(shù)據(jù)上有許多轉換。
當用戶使用SQL進行數(shù)據(jù)管理時,用戶可以在數(shù)據(jù)庫之間執(zhí)行創(chuàng)建,檢索,更新和刪除數(shù)據(jù)的功能。有各種關系數(shù)據(jù)庫管理系統(tǒng),例如MySQL,SQLite,Postgres SQL等,它們都提供相同的功能。
數(shù)據(jù)庫中有一些術語,例如數(shù)據(jù)庫服務器,數(shù)據(jù)庫引擎或數(shù)據(jù)庫管理系統(tǒng)。在數(shù)據(jù)庫中,我們可以互換使用這三個術語,因此當我們說SQL引擎或SQL Server時,不要混淆,它們都是相同的。
什么是SQL引擎?
SQL引擎是一種收集和解釋SQL命令的軟件,因此可以在關系數(shù)據(jù)庫上執(zhí)行適當?shù)牟僮鳌QL引擎的目的是從數(shù)據(jù)庫中創(chuàng)建,讀取,更新和刪除數(shù)據(jù)。
SQL引擎或SQL Server數(shù)據(jù)庫引擎包括兩個主要組件:存儲引擎和查詢處理器,如今,一些現(xiàn)代SQL DBMS包含多個存儲引擎。我們有很多類型的SQL引擎,它們都有不同的體系結構,但是用于執(zhí)行相同的目標,包括對數(shù)據(jù)庫的CRUD操作和許多其他功能。
SQL已覆蓋在線市場的很大一部分,許多企業(yè)將其SQL系統(tǒng)用于在線事務處理和在線分析處理。
SQL數(shù)據(jù)庫引擎如何工作?
表面上我們都知道,SQL的編譯器編譯查詢,而虛擬機執(zhí)行編譯的查詢。現(xiàn)在讓我們討論數(shù)據(jù)庫引擎如何工作。
SQL具有查詢編譯和執(zhí)行過程的許多階段。每個SQL數(shù)據(jù)庫引擎都包含兩個主要組件:編譯器和虛擬機,以執(zhí)行查詢。編譯器讀取查詢并將該查詢轉換為適當?shù)淖止?jié)碼,然后由虛擬機評估該字節(jié)碼并向客戶端返回適當?shù)捻憫?/p>
查詢的完全執(zhí)行將類別分為3個主要階段
· 編譯
· 捆綁
· 最佳化
· 執(zhí)行中
編譯解析
這是編譯過程的一部分,在編譯解析過程中,查詢語句被標記為帶有適當?shù)脑~法和從句的單個單詞。
編譯檢查語義
編譯符號學檢查語句的有效性,并將其與系統(tǒng)目錄匹配。此編譯階段驗證查詢是否有效,還驗證用戶執(zhí)行該語句的權限。
編譯綁定
它為輸入的查詢語句創(chuàng)建相應的二進制表示形式。所有SQL Server引擎都具有此編譯狀態(tài),在該狀態(tài)下將生成字節(jié)碼。
到此編譯階段,該語句已被編譯,現(xiàn)在將其發(fā)送到數(shù)據(jù)庫服務器以進行優(yōu)化和執(zhí)行。
最佳化
它為字節(jié)碼優(yōu)化了最佳算法。此功能也稱為查詢優(yōu)化器或關系引擎。
執(zhí)行中
虛擬機獲取優(yōu)化的字節(jié)碼并執(zhí)行。
SQL STATEMENT --> Parsing -->Binding --> Query Optimization --> Query Execution --> Result
注意:解析編譯過程不需要數(shù)據(jù)庫的任何許可,這使其成為最快的編譯處理階段。
SQL將數(shù)據(jù)轉換為表
SQL用C語言編寫,它使用Binary-Tree原理,使傳入的數(shù)據(jù)存儲在Rows和Columns中。在二叉樹結構中,我們有幾個分支,它們始終指向新的數(shù)據(jù)元素。SQL數(shù)據(jù)庫遵循相同的結構,在該結構中,數(shù)據(jù)被轉換成表,其中每一列和每一行數(shù)據(jù)彼此指向。
SQL數(shù)據(jù)庫引擎簡而言之
SQL引擎將查詢處理為多階段。查詢的處理可以從一個關系DBMS到另一個關系DBMS有所不同。在第一階段,查詢將被解析并轉換為兼容格式,例如JASON文件,然后進行另一個編譯過程,以檢查已解析文件的語義,在編譯的最后階段,已解析文件將轉換為相應的字節(jié)碼。
第二步是優(yōu)化,其中將適當?shù)乃惴☉糜谧止?jié)碼。最后,虛擬機執(zhí)行代碼并為客戶端提供適當?shù)慕Y果。
什么是SQL Server存儲引擎?
它是用于在磁盤和內存之間執(zhí)行CRUD操作的軟件。
要創(chuàng)建數(shù)據(jù)庫環(huán)境,我們需要SQL數(shù)據(jù)庫引擎,并且為了構建數(shù)據(jù)庫引擎,我們經(jīng)常使用低級編程語言,因為它們使用戶可以控制內存管理,而高級編程則缺少這種語言在高級編程語言中,語言是由操作系統(tǒng)自動完成的。SQL引擎是跨平臺的,開發(fā)人員可以使用不同的平臺來構建某些程序,但是所有平臺都可以與SQL引擎鏈接以獲取數(shù)據(jù)庫功能。更多關于數(shù)據(jù)庫的知識,請繼續(xù)關注中培偉業(yè)。