目錄
什么是 SQL Server?
安裝
關(guān)鍵概念
系統(tǒng)數(shù)據(jù)庫(System Databases)
登錄名與數(shù)據(jù)庫用戶(Login and user)
身份驗證模式(Authentication Mode)
包含數(shù)據(jù)庫(Contained Database)
總體架構(gòu)
協(xié)議層(Protocol Layer)
關(guān)系引擎(Relational Engine)
存儲引擎(Storage Engine)
數(shù)據(jù)文件架構(gòu)
數(shù)據(jù)文件
附錄 - SQL Server 工具集
參考文檔
什么是 SQL Server?
SQL Server 是由微軟公司(Microsoft)開發(fā)的關(guān)系型數(shù)據(jù)庫(RDBMS)。RDBMS 是 SQL 以及所有現(xiàn)代數(shù)據(jù)庫系統(tǒng)的基礎(chǔ)富蓄,比如 MS SQL Server,IBM DB2筋讨,Oracle赊舶,MySQL 以及微軟的 Microsoft Access。
SQL Server 主要是和 MySQL 和 Oracle 二者競爭晒他。
這里簡答提一下 SQL 的歷史:SQL 由 IBM 在 19 世紀 70 年代提出吱型,在 1986 年成為 ANSI(American National Standards Insittute) 標準,在 1987 年成為 ISO(International Organization for Standardization) 標準陨仅。
SQL Server 支持 ANSI SQL 標準津滞。但是 SQL Server 設(shè)計了自己的 SQL 語言,稱之為 T-SQL(Transactional-SQL)灼伤。類似于 Oracle 的 PL/SQL触徐。
Microsoft 和 Sybase** 在 1989 年發(fā)布 SQL Server 1.0 版本。在 19 世紀 90 年代二者合作關(guān)系結(jié)束之后微軟保持了 SQL Server 的所有權(quán)狐赡。此后撞鹉,微軟陸續(xù)發(fā)布了 SQL Server 2000, 2005颖侄, 2008鸟雏, 2012,2014览祖, 2016孝鹊, 2017, 以及 2019展蒂。從 SQL Server 2017 開始又活,SQL Server** 開始支持 Linux苔咪。在 2009 年微軟宣布發(fā)行 Microsoft Azure SQL 數(shù)據(jù)庫并在 2010 年正式發(fā)布。
安裝
安裝分為三個步驟:
- 安裝前 - 仔細閱讀安裝要求
- 安裝 - 選擇一種安裝方式安裝 SQL Server
- 安裝后 - 使用 SQL Server 實用工具配置 SQL Server
安裝前需要考慮安裝的平臺柳骄,比如是 Microsoft Server 的什么版本团赏,還是Linux 平臺;同時需要考慮磁盤空間耐薯,處理器(類型馆里,速度),內(nèi)存可柿,以及存儲系統(tǒng)鸠踪,比如存儲架構(gòu)(NAS,DAS复斥,SAN)营密,磁盤類型(SCSI,SSD目锭,...)评汰,RAID類型(RAID0,RAID1痢虹,...)被去。
還有重要的一點是需要選擇合適的 Collation(有人把 Collation 翻譯為排序規(guī)則其實是不嚴謹?shù)模驗?Collation 除了影響排序之外還代表了字符在數(shù)據(jù)集里的呈現(xiàn)形式)奖唯。Collation 主要影響兩個方面:
- 排序規(guī)則(Sorting rules)
- 文本數(shù)據(jù)的語義:字符大小寫(Case Sensitivity)惨缆,聲調(diào)是否敏感(Accent Sensitivity。比如丰捷,法語里的 é 和 e)
比如下面這個例子坯墨,不同的 Collation 導(dǎo)致了完全不同的排序結(jié)果。
SQL Server 支持在單一數(shù)據(jù)庫中存儲具有不同 Collation 的對象病往。
安裝時有四種安裝方式可以選擇:
- 通過 SQL Server 安裝向?qū)О惭b - 一步一步的可視化安裝
- 通過 SQL Server 命令提示符安裝 - 完全或簡單靜默安裝捣染。可以指定要安裝的功能以及如何配置這些功能停巷。 還可以指定與安裝用戶界面是進行靜默交互耍攘、基本交互還是完全交互。
- 使用 SQL Server 配置文件安裝 - 可以使用配置文件在整個企業(yè)中部署具有相同配置的 SQL Server 畔勤。
- 使用 SQL Server SysPrep 安裝 - 在計算機上準備 SQL Server 的獨立實例蕾各,以后再完成配置。
安裝后驗證安裝是否成功硼被。一般可以檢查:
SQL Server 的服務(wù)是否存在 - services 工具頁面示损。如果沒有特地設(shè)置實例名(instance name),默認為 SQL Server (MSSQLSERVER)嚷硫。
相關(guān)安裝文件夾是否存在 - 確認配置的默認文件和 temp 文件夾存在检访,且這些文件夾里包含所期望的文件,比如系統(tǒng)數(shù)據(jù)庫的 .mdf仔掸,.ldf脆贵。
-
連接到 SQL Server 服務(wù)器驗證 - 這是最簡單的方法。只需要在 CMD 窗口輸入
OSQL -E
起暮。如果連接成功卖氨,則會在窗口顯示 1>。
關(guān)鍵概念
系統(tǒng)數(shù)據(jù)庫(System Databases)
SQL Server 有五個系統(tǒng)數(shù)據(jù)庫:
- master - 記錄 SQL Server實例的所有系統(tǒng)級信息负懦。
- msdb - 用于 SQL Server 代理計劃警報和作業(yè)筒捺。
- model - 用作 SQL Server實例上創(chuàng)建的所有數(shù)據(jù)庫的模板。 對 model 數(shù)據(jù)庫進行的修改(如數(shù)據(jù)庫大小纸厉、排序規(guī)則系吭、恢復(fù)模式和其他數(shù)據(jù)庫選項)將應(yīng)用于以后創(chuàng)建的所有數(shù)據(jù)庫。
- resource - 一個只讀數(shù)據(jù)庫颗品,包含 SQL Server包括的系統(tǒng)對象肯尺。 系統(tǒng)對象在物理上保留在 Resource 數(shù)據(jù)庫中,但在邏輯上顯示在每個數(shù)據(jù)庫的 sys 架構(gòu)中躯枢。
- tempdb - 一個工作空間则吟,用于保存臨時對象或中間結(jié)果集。注意锄蹂,tempdb 會在 SQL Server 每次重啟時重新創(chuàng)建氓仲。
這里只是簡單介紹一下每個系統(tǒng)數(shù)據(jù)庫的功能。如果需要了解詳細信息得糜,可以參考微軟官方文檔寨昙。
登錄名與數(shù)據(jù)庫用戶(Login and user)
- 登錄名 - 登錄名是用于登錄到 SQL Server 數(shù)據(jù)庫引擎的單個用戶帳戶。 SQL Server 和 SQL 數(shù)據(jù)庫 支持基于 Windows 身份驗證的登錄名和基于 SQL Server 身份驗證的登錄名掀亩。
-
數(shù)據(jù)庫用戶 -
- 通過在數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)庫用戶并將該數(shù)據(jù)庫用戶映射到登錄名來授予登錄名對數(shù)據(jù)庫的訪問權(quán)限舔哪。
- 每個數(shù)據(jù)庫用戶均映射到單個登錄名。
- 也可以創(chuàng)建不具有相應(yīng)登錄名的數(shù)據(jù)庫用戶槽棍。 這些數(shù)據(jù)庫用戶稱為“包含的數(shù)據(jù)庫用戶”
身份驗證模式(Authentication Mode)
SQL Server 提供兩種身份驗證模式:
-
Windows 驗證模式(Windows Authentication mode)- 該模式下
- 支持:Windows 身份驗證
不支持:SQL Server 身份驗證
-
混合模式(Mixed mode)- 該模式下
- 支持:Windows 身份驗證
- 支持:SQL Server 身份驗證
在 SSMS 里右擊實例名稱捉蚤,選擇屬性(Properties),瀏覽到安全(Security)選項卡頁面炼七,可以修改身份認證模式缆巧。
包含數(shù)據(jù)庫(Contained Database)
從 SQL Server 2012 開始 SQL Server 引進了包含數(shù)據(jù)庫(Contained Database)。包含數(shù)據(jù)庫獨立于其他數(shù)據(jù)庫和它所屬的實例豌拙。
它的主要優(yōu)勢是:
- 許多描述數(shù)據(jù)庫的元數(shù)據(jù)都在該數(shù)據(jù)庫本身之中維護
- 允許數(shù)據(jù)庫自己部分包含之前存儲在數(shù)據(jù)庫之外的數(shù)據(jù)陕悬。換句話說就是,一旦啟用了包含數(shù)據(jù)庫特性按傅,就可以創(chuàng)建能夠把用戶信息(身份驗證信息)存儲在數(shù)據(jù)庫自己內(nèi)部的數(shù)據(jù)庫而不是把這些信息存儲在 master 數(shù)據(jù)庫捉超。
啟用包含數(shù)據(jù)庫特性必須在數(shù)據(jù)庫的實例上進行胧卤,然后才可以創(chuàng)建包含數(shù)據(jù)庫。
登錄包含數(shù)據(jù)庫時拼岳,需要在選項>>(Options>>)里指定要連接到的數(shù)據(jù)庫枝誊,否則會出錯。
總體架構(gòu)
SQL Server 有三個主要組件:
- 協(xié)議層(Protocol Layer)
- 關(guān)系引擎(Relational Engine)
- 存儲引擎(Storage Engine)
協(xié)議層(Protocol Layer)
-
共享內(nèi)存(Shared Memory)- 客戶端和 SQL Server 運行在同一臺機器上時惜纸,可通過該協(xié)議通訊叶撒。
- 使用 SSMS 連接到本地 SQL Server 時,SSMS 登錄窗口中的服務(wù)器名稱(Server Name)可以為:
- . - 這里的點號 . 表示 SQL Server為本地安裝
- localhost - 顧名思義耐版,指本地安裝
- 127.0.0.1 - 同上
- <Machine>\<Instance> - 服務(wù)名稱加上實例名稱
- 使用 SSMS 連接到本地 SQL Server 時,SSMS 登錄窗口中的服務(wù)器名稱(Server Name)可以為:
-
TCP/IP - 客戶端和 SQL Server 不運行在同一臺機器上時祠够,或者可理解為處在網(wǎng)絡(luò)環(huán)境時,可采取此種方式通訊粪牲。
- 使用 SSMS 連接到遠端時古瓤,SSMS 登錄窗口中的服務(wù)器名稱(Server Name)只能是:<Machine><Instance>
命名管道(Named Pipe)- 為局域網(wǎng)(LAN)開發(fā)的協(xié)議。默認是關(guān)閉的虑瀑,需要通過 SQL 配置管理器(SQL Configuration Manager)開啟湿滓。
架構(gòu)圖中的 TDS 是 Tabular Data Stream 的縮寫。
- TDS 最初由 Sybase 開發(fā)舌狗,現(xiàn)在為微軟所有叽奥。
- TDS 是包裝的網(wǎng)絡(luò)包。
- 三種協(xié)議均使用 TDS 包痛侍。
關(guān)系引擎(Relational Engine)
關(guān)系引擎(Relational Engine)又被稱為查詢處理器(Query Processor)朝氓。它包含能夠決定執(zhí)行什么樣的查詢以及如何做到最優(yōu)查詢。它負責從存儲引擎(Storage Engine)請求數(shù)據(jù)并處理返回的數(shù)據(jù)主届。
-
命令解析器(CMD Parser)
- 從協(xié)議層(Protocol Layer)傳入的數(shù)據(jù)進入關(guān)系引擎赵哲。命名解析器首先接收到查詢數(shù)據(jù)。它的主要職責是:
- 語法檢查(Syntatitic) -> 語義檢查(Semantic) -> 創(chuàng)建查詢樹(Query Tree)
- 解釋:
- 語法檢查(Syntatitic) - SQL Server 預(yù)定義了很多關(guān)鍵字(SELECT, INSERT, UPDATE 等等)和語法君丁。如果查詢數(shù)據(jù)沒有遵守這些規(guī)則枫夺,則會返回錯誤。
- 語義檢查(Semantic) - 由規(guī)范器(Normalizer)執(zhí)行绘闷。比如橡庞,檢查表名、列名是否存在于架構(gòu)(Schema)里印蔗。如果存在扒最,則將其綁定(Bind)到查詢。
- 創(chuàng)建查詢樹(Query Tree) - 產(chǎn)生查詢在里面運行的不同的執(zhí)行樹华嘹。當然吧趣,所有的執(zhí)行樹均返回同樣的預(yù)期結(jié)果。
- 從協(xié)議層(Protocol Layer)傳入的數(shù)據(jù)進入關(guān)系引擎赵哲。命名解析器首先接收到查詢數(shù)據(jù)。它的主要職責是:
-
優(yōu)化器(Optimizer)
- 優(yōu)化器(Optimizer)為查詢創(chuàng)建執(zhí)行計劃,該執(zhí)行計劃決定查詢?nèi)绾螆?zhí)行强挫。
- 并非所有的查詢都會被優(yōu)化岔霸。優(yōu)化只針對 DML 命令,比如 SELECT纠拔,INSERT秉剑,DELETE 和 UPDATE泛豪。這些查詢會首先被標記然后發(fā)送到優(yōu)化器稠诲。DDL 命令,如 CREATE 和 ALTER 不會被優(yōu)化诡曙,而是被編譯成內(nèi)部形式臀叙。
- 查詢成本(Query cost)的計算基于多種因素,如 處理器使用情況(CPU usage)价卤,內(nèi)存使用情況(Memory usage)以及輸入輸出需求(Input/Output needs)劝萤。
- 優(yōu)化器(Optimizer)的目的是找到最省的執(zhí)行計劃,而不是最好的慎璧、最有效的執(zhí)行計劃床嫌。
-
優(yōu)化器(Optimizer)尋找成本最低的執(zhí)行計劃過程涵蓋下面三個階段:
- 微計劃(Trivial Plan)-> 事務(wù)執(zhí)行計劃(Transaction Processing Plan)-> 并行執(zhí)行和優(yōu)化(Parallel Processing and Optimization)
- 解釋
- 微計劃(Trivial Plan)- 又稱為預(yù)優(yōu)化階段(Pre-optimization Stage)。有些情況下胸私,可能只有一種方便可用的計劃厌处,這就是微計劃。此時岁疼,無需創(chuàng)建優(yōu)化計劃阔涉。如果沒有找到微計劃,則進入下一階段事務(wù)執(zhí)行計劃捷绒。
- 事務(wù)執(zhí)行計劃(Transaction Processing Plan)- 包括簡單計劃(Simple Plan)和復(fù)雜計劃(Complex Plan)的搜尋瑰排。在簡單計劃搜尋中,查詢中涉及的索引和列將被用于數(shù)據(jù)分析(Statistical Analysis)暖侨;通常以一個表一個索引的方式執(zhí)行椭住。如果無法找到簡單計劃,則會進一步搜索復(fù)雜計劃字逗;此時會包含一個表的多個索引京郑。
- 并行執(zhí)行和優(yōu)化(Parallel Processing and Optimization)- 如果上述兩個策略都沒有奏效洋魂,優(yōu)化器會搜尋并行執(zhí)行的可能性灾票。這取決于服務(wù)器的處理能力和配置绪爸。如果這也無法做到楚昭,優(yōu)化器會嘗試找到所有可能的執(zhí)行計劃蛮粮,此稱之為最終優(yōu)化(Final Optimization)炉旷。最終優(yōu)化的算法是微軟的專利募书。
- 查詢執(zhí)行器(Query Executor)- 查詢執(zhí)行器調(diào)用通道方法(Access Method)折剃。它為執(zhí)行計劃提供獲取數(shù)據(jù)的邏輯。一旦從存儲引擎獲得數(shù)據(jù)绪抛,結(jié)果將發(fā)布到協(xié)議層(Protocol Layer)资铡;最后,返回數(shù)據(jù)給用戶幢码。
存儲引擎(Storage Engine)
存儲引擎把數(shù)據(jù)存儲在存儲系統(tǒng)笤休,如硬盤或 SAN,并在需要時返回數(shù)據(jù)症副。
-
通道方法(Access Method)- 為查詢執(zhí)行器和緩沖管理器以及事務(wù)管理器之間的接口店雅。它判斷一個查詢是否是:
Select 語句 - 這種情況下,查詢會被傳遞到緩沖管理器做進一步處理
-
非 Select 語句 - 這種情況下贞铣,查詢被被傳遞到事務(wù)管理器闹啦。通常是 UPDATE 語句。
緩沖管理器(Buffer Manager)
-
緩沖管理器管理如下三個模塊功能:
-
計劃緩存(Plan Cache)
- 已有查詢計劃(Existing Query Plan)- 緩沖管理器檢查是否存在已存儲的計劃緩存辕坝,如果有窍奋,則使用該查詢計劃緩存及其關(guān)聯(lián)的數(shù)據(jù)緩存。
- 首次查詢計劃(First time Cache Plan)- 如果是查詢執(zhí)行計劃首次執(zhí)行酱畅,則將其存儲到計劃緩存琳袄。這樣當下次執(zhí)行同樣的查詢時可以更快的獲取到執(zhí)行計劃。
-
數(shù)據(jù)解析(Data Parsing):緩沖緩存(Buffer Cache)和數(shù)據(jù)存儲(Data Storage)
- 緩沖緩存(Buffer Cache)- 軟解析(Soft Parsing)纺酸,緩沖管理器在緩沖區(qū)里尋找數(shù)據(jù)窖逗,如果有,則返回給查詢執(zhí)行器(Query Executor)吁峻。這有助于減少 I/O 操作滑负。
- 數(shù)據(jù)存儲(Data Storage)- 硬解析(Hard Parsing),如果數(shù)據(jù)不在緩沖區(qū)用含,則數(shù)據(jù)將從數(shù)據(jù)存儲搜索矮慕。數(shù)據(jù)同時會被緩存在數(shù)據(jù)緩存(Data Cache)里供將來使用。
- 臟頁(Dirty page)
-
計劃緩存(Plan Cache)
事務(wù)管理器(Transaction Manager)- 通道方法(Access Method)判斷查詢是一個非 SELECT 語句時啄骇,事務(wù)管理器將被調(diào)用痴鳄。
數(shù)據(jù)文件架構(gòu)
每個 SQL Server 數(shù)據(jù)庫至少具有兩個操作系統(tǒng)文件:一個數(shù)據(jù)文件和一個日志文件。
數(shù)據(jù)文件
-
數(shù)據(jù)文件(Data Files)
- 包含數(shù)據(jù)和對象缸夹,比如表痪寻,索引,存儲索引和視圖
- 可以組織在文件組(Filegroup)里
-
日志文件(Log files)
- 日志文件包含恢復(fù)數(shù)據(jù)庫中的所有事務(wù)所需的信息虽惭。
- 每個數(shù)據(jù)庫至少有一個日志文件橡类。
- 日志文件是可復(fù)寫文件(wrap-around file)。
-
數(shù)據(jù)庫文件類型
數(shù)據(jù)庫文件類型主要有三種
- 主要 (Primary)- 主要數(shù)據(jù)文件包含數(shù)據(jù)庫的啟動信息芽唇,并指向數(shù)據(jù)庫中的其他文件顾画。每個數(shù)據(jù)庫有一個主要數(shù)據(jù)庫文件取劫。建議文件后綴為 .mdf。
- 輔助副本(Secondary) - 可選研侣,由用戶定義谱邪。建議文件后綴為 .ndf 。
- 事務(wù)日志 (Transaction Log)- 保存用于恢復(fù)數(shù)據(jù)庫的日志信息庶诡。每個數(shù)據(jù)庫必須至少有一個日志文件惦银。建議文件后綴為 .ldf。
-
文件組(Filegroups)
- 每個數(shù)據(jù)庫有一個主要文件組末誓。
- 此文件組包含主要數(shù)據(jù)文件和未放入其他文件組的所有次要文件扯俱。
- 文件組類型有:主文件組,內(nèi)存優(yōu)化文件組基显,F(xiàn)ilestream蘸吓,用戶定義的文件組
-
頁和區(qū)(Pages & Extents)
-
頁(Pages)
- 頁的大小為 8KB善炫。
- SQL Server 中數(shù)據(jù)存儲的基本單位是頁撩幽。
- 磁盤 I/O 操作在頁級執(zhí)行。 也就是說箩艺,SQL Server 讀取或?qū)懭胨袛?shù)據(jù)頁窜醉。
- 頁的類型有:數(shù)據(jù)(Data),索引(Index)等等艺谆。
-
區(qū) (Extents)
- 區(qū)是管理空間的基本單位榨惰。
- 一個區(qū)是 8 個物理上連續(xù)的頁(即 64 KB)
- 區(qū)有兩種類型:混合區(qū)和統(tǒng)一區(qū)(從 SQL Server 2016 (13.x) 開始,數(shù)據(jù)庫中所有分配的默認值都是統(tǒng)一區(qū))
-
頁(Pages)
附錄 - SQL Server 工具集
- SQL Server Management Studio - SQL Server 主要客戶端
- SQL Server Configuration Manager - 所有 SQL Server 服務(wù)的集中配置工具
-
Performance tools - 開始>所有程序>Microsoft SQL
Server xxxx>性能工具- SQL Server Profiler
- DatabaseEngine Tuning Advisor
- SQL Server Business Intelligent Development Studio - Microsfot Visual Studio 的插件集
- 第三方工具
- –Embarcadero Technologies - ER/Studio
- Computer Associates - ERWin
- Red Gate Software - SQL Compare and SQL Data Compare Utilities
- Quest Software - TOAD
參考文檔
- https://www.w3schools.com/sql/sql_intro.asp
- https://en.wikipedia.org/wiki/Sybase
- https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-overview?view=sql-server-2017
- https://en.wikipedia.org/wiki/Microsoft_Azure_SQL_Database
- https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-2017#Collation_Defn
- https://docs.microsoft.com/zh-cn/sql/relational-databases/security/authentication-access/getting-started-with-database-engine-permissions?view=sql-server-2017
- https://docs.microsoft.com/zh-cn/sql/relational-databases/security/choose-an-authentication-mode?view=sql-server-2017
- https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/migrate-to-a-partially-contained-database?view=sql-server-2017#enable
- https://www.guru99.com/sql-server-introduction.html
- https://docs.microsoft.com/zh-cn/sql/database-engine/configure-windows/buffer-pool-extension?view=sql-server-2017
- https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/database-files-and-filegroups?view=sql-server-2017
- https://docs.microsoft.com/zh-cn/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-2017