SQL Server 2008 基礎
SQL流程
TDS是一種協議,一系列描述兩個計算機間如何傳輸數據的規則。象別的協議一樣,它定義了傳輸信息的類型和他們傳輸的順序。總之,協議描述了“線上的位”,即數據如何流動。表格數據流協議是建立在TCP/IP Net-Library之上的,包含在TCP數據段內。TDS用1433端口進行數據庫通信。
TDS協議位於TCP的數據段內,結構如下:
IP | TCP | TDS頭 | TDS的DATA段 |
8位頭
TDS客戶端使用稱爲表格格式數據流 (TDS) 的 SQL Server 專用應用程序級協議來發送 SQL 語句。數據包由用於 SQL Server 的 Microsoft OLE DB 提供程序、SQL Server ODBC 驅動程序或 DB-Library DLL 生成。TDS 數據包然後被傳遞給 SQL Server 客戶端 Net-Library,客戶端 Net-Library 將 TDS 數據包封裝爲網絡協議數據包。在服務器上,服務器 Net-Library 接收網絡協議數據包,且析取 TDS 數據包並將其傳遞給關係數據庫服務器。在將結果返回給客戶端時,這一進程反向執行。
表格數據流端點:一個網絡協議一旦連接成功,就會創建一個對應的TDS端點,用於在客戶端與服務器之間互傳信息
對於這一步,性能問題可能會出現在把請求的內容轉換成SQL Server能處理的格式的過程中,如果數據量大,轉換開銷就高,不管是從外部傳入SQL Server還是從SQL Server輸出到外部,都是如此
命令解釋器:在TDS把請求轉換成SQL Server內部可識別的格式後,首先會傳到命令解釋器處,這個組件會檢查傳入的T-SQL語法是否符合規定。如果語法符合要求,就好生成查詢樹傳入查詢優化器中
命令解釋器同時也會檢查是否已經存在緩存了的執行計劃,如果存在,就重用;如果不存在,就讓查詢優化器生成執行計劃
查詢優化器:該組件是SQL Server的核心部分,優化器的作用是對特定的請求進行一系列的優化,使其儘可能高效地對數據進行操作,最終選擇最低開銷的候選計劃生成預估執行計劃,並傳入執行器執行查詢.
查詢執行器:查詢執行器是執行查詢的組件,但是實際上並不是真正執行,而是通過OLEDB協議訪問並使用一系列的指令操作存儲引擎進行查詢的執行操作。存儲引擎纔是實際的查詢執行者
數據訪問方法:數據訪問方法是提供數據和索引的存儲、查詢及修改的代碼集合。它包含了索引操作數據的代碼,但是並不由自己去數據操作數據,而是提交請求到緩衝管理器
緩衝區管理器:緩衝管理器是管理BufferPool的組件。Buffer Pool是SQL Server內存的主要部分,它管理內存中的數據,並把適當的數據作爲輸出傳輸給(數據訪問方法)。如果所需數據不在於內存中,緩衝管理器需要從磁盤讀取對應的數據頁到內存的數據緩存,然後把所需的數據返回給數據訪問方法。在這個過程中可能會出現一種等待狀態PageIOLatch
數據緩存:數據緩存是BufferPool中的最大部分,也可以說是SQL Server中佔用內存最多的部分。它用於存放從磁盤加載到內存中的數據,以便後續操作使用
對於當前數據緩存中每個數據庫的緩存大小情況。可以使用一個DMV來查詢
——sys.dm_os_buffer_descriptors
SELECT COUNT(*) * 8 / 1024 AS 'Cached Size(MB)' ,
CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE DB_NAME(database_id)
END AS 'Database'
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id) , database_id
ORDER BY 'Cached Size (MB)' DESC
事務管理器
事務管理器主要包含兩部分:鎖管理器和日誌管理器
1、 鎖管理器通過使用鎖機制來保證數據的併發性和隔離性。
2、日誌管理器通過預寫入日誌機制,保證事務的ACID特性當需要修改數據時,數據訪問方法會先到事務管理器中通過對事務日誌進行操作,把請求傳到Buffer管理器中完成,然後返回給數據訪問方法並通過事務管理器寫入日誌文件中
數據庫事務
事務是對數據庫操作的工作單元,這個單元可以是一個select語句,也可以是包含多個select、update、dalete、insert等操作的命令集合。這個集合被認爲是工作單元,SQL SERVER的很多特性都是基於這個工作單元,也就是事務
關係數據庫包含4大核心事務特性:原子性、一致性、隔離性和持久性,簡稱ACID特性
原子性意味着一個事務內的所有操作必須全部完成或者全部回滾。典型的例子是在ATM機上操作時,要麼取錢、存錢或者轉賬成功,要麼等於從來都沒有做過任何操作。如果轉賬成功但是對方未收到款項,勢必造成很大問題
2、一致性
一致性要求整個事務在運行的前後數據庫的狀態是一致的,比如庫存不能爲負值、性別字段的值要麼爲“男”要麼爲“女”等。爲了確保事務的一致性,事務不能打破數據定義中的一致性約束
3、隔離性
隔離性保證在同一時間中,一個事務的運行不能被另外一個事務所影響。但是SQL Server實際是允許這個操作的
4、持久性
持久性意味着事務一旦成功提交,將永久存儲到服務器的文件系統中,即使系統在中途崩潰,所發生的效果都不會丟失,這個會通過日誌來保證
提交事務意味着永久把事務的影響記錄到數據庫中,回滾意味着把發生的所有操作去除,等於沒有做過,不過日誌其實還是會記錄這個操作
關係引擎和存儲引擎是SQLServer的兩大組件
1、關係引擎,也叫查詢處理器,因爲它的主要作用是優化和執行查詢。關係引擎中包含的命令解析器用於檢查語法和轉換查詢樹,而查詢優化器則用於優化查詢,還有一個查詢執行器負責執行查詢
2、存儲引擎,負責管理所要數據及涉及的I/O,其中包含的數據訪問方法用於處理對行、索引、也、行版本、空間分配等的I/O請求,緩衝區管理器用於管理SQL Server的主要內存消耗組件——Buffer Pool,事務管理器將通過所管理數據及維護事務的ACID屬性
緩衝池:在數據庫性能及管理領域中屬於相當重要的一個組件,也是SQL Server中內存消耗最大的組件。緩衝池包含了SQL Server的所有緩存,如計劃緩存和數據緩存等
下面是邏輯CPU 格式在不同位數的操作系統中
能支持的最大工作者線程數。
1)對於32 位操作系統:
總可用邏輯CPU<=4 時,最大工作者線程=256。
總可用邏輯CPU>4 時,最大工作者線程=256+((邏輯CPU-4)×8)。
2)對於64 位操作系統:
總可用邏輯CPU<=4 時,最大工作者線程=512。
總可用邏輯CPU>4 時,最大工作者線程=512+((邏輯CPU-4)×16)。
還有一個比較簡單的方法可用於檢查當前系統的最大線程數。比如執行下面的腳本:
FROMsys.dm_os_sys_info
通常出現threadpool 類型的等待意味着當前有大量並行執行計劃,或者遇到了CPU 瓶
頸,但是不管是什麼情況,都需要經常檢查這部分的數據,以確保有足夠的線程可用對
於每個工作線程,在64 位系統中都要消耗2MB 的內存,在32 位系統需要消耗0.5MB 的
內存,所以SQL Server 只會在需要的時候才創建工作線程。這部分的信息可以通過sys.
dm_os_workers 這個DMV 來查看。
FROMsys.dm_os_workers
SQL Server NUMA CPU 配置
SELECT scheduler_id ,
cpu_id ,
parent_node_id ,
status
FROM sys.dm_os_schedulers
當前已緩存的計劃數及所佔的MB 數
SELECT COUNT(*) AS 'Number of Plans' ,
SUM(CAST(size_in_bytes AS BIGINT)) / 1024 /1024 AS 'Plan Cache Size (MB)'
FROM sys.dm_exec_cached_plans
查看緩存對象的對應內存數
SELECT objtype AS 'Cached Object Type' ,
COUNT(*) AS 'Number of Plans' ,
SUM(CAST(size_in_bytes AS BIGINT)) / 1024 /1024 AS 'Plan Cache Size (MB)' ,
AVG(usecounts) AS 'Avg Use Count'
FROM sys.dm_exec_cached_plans
GROUP BY objtype
查詢數據庫路徑
USE master
go
SELECT physical_name
FROM sys.master_files
WHERE database_id = DB_ID('RJBDB')
檢查證書
select name, start_date, expiry_date
from sys.certificates
where name not like '##%'
查看鏡像端點
SELECT * FROM sys.endpoints e
查詢鏡像狀態
select *
from sys.database_mirroring
where database_id=DB_ID('RJBDB')