搜尋本站文章

2025-08-01

[Hyper-V] 安裝 Windows 11 Pro 虛擬機器(使用本機帳戶 Local Account 登入)

[Hyper-V] 安裝 Windows 11 Pro 虛擬機器(使用本機帳戶 Local Account 登入)

更新日期:2025/07/30

ISO 檔版本:

  • Win11_24H2_Chinese_Traditional_x64.iso(Windows 11 24H2),是 Win11 24H2 版本。


前言

  • 因測試需求,需在 Hyper-V 中安裝 Windows 11 Pro 虛擬機器。
  • 本文紀錄整個安裝流程,特別是如何 跳過 Microsoft 帳號登入,改為使用 本機帳戶(Local Account) 登入。

2020-04-22

Install SQL Server 2019 on Windows Server 2019: 安裝抓圖


版本資訊:
SQL Server 2019 RTM - 15.0.2070.41 (X64)

Build Information
Note
SQL Server Version
SQL Server 2019
Product Version
15.0.2070.41
Product Level
RTM
Product Edition
Enterprise Edition (64-bit)
Database Internal Version
904

SQL Server 2019 的圖型介面工具:SSMS、SSDT,需要額外下載安裝。




版本資訊

-- 01_SQL Server 2019 + Windows Server 2019



-- 02_資料庫相容性層級:150








安裝抓圖

Install SQL Server 2019 on Windows Server 2019

https://photos.app.goo.gl/TwioHWoq2GrKnbpBA



Query version, edition and update level 

V2: Query SQL Server system and build information

適用於 SQL Server 2019
加上 作業系統平台
使用 SQL Server 2017 新增加的 sys.dm_os_host_info


-- V2_SQL Server system and build information
-- Applies to: SQL Server 2019
  
SELECT @@SERVERNAME 'InstanceName',
 CASE WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '8%' THEN 'SQL Server 2000'
  WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '9%' THEN 'SQL Server 2005'
  WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '10.0%' THEN 'SQL Server 2008'
  WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '10.5%' THEN 'SQL Server 2008 R2'
  WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '11%' THEN 'SQL Server 2012'
  WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '12%' THEN 'SQL Server 2014'
  WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '13%' THEN 'SQL Server 2016'
  WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '14%' THEN 'SQL Server 2017'
  WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductVersion')) like '15%' THEN 'SQL Server 2019'
  ELSE 'unknown'
  END AS 'SQLServerVersion ', 
 CASE WHEN SERVERPROPERTY('IsClustered') = 1 AND SERVERPROPERTY('IsHadrEnabled') = 1 THEN 'Failover Cluster + Availability Groups'
  WHEN SERVERPROPERTY('IsClustered') = 1 THEN 'Failover Cluster'
  WHEN SERVERPROPERTY('IsHadrEnabled') =1 THEN 'Availability Groups'
  ELSE 'unknown'
 END AS 'High-Availability', 
 host_distribution 'HostDistribution', host_release 'HostRelease',
 SERVERPROPERTY('ProductVersion') 'ProductVersion',
 SERVERPROPERTY('ProductLevel') 'ProductLevel',
 SERVERPROPERTY('Edition') 'ProductEdition',
 SERVERPROPERTY('ProductUpdateLevel') 'ProductUpdateLevel', 
 SERVERPROPERTY('ProductBuildType') 'ProductBuildType', 
 SERVERPROPERTY('ProductUpdateReference') 'ProductUpdateReference', 
 DATABASEPROPERTYEX('master','Version') 'DatabaseInternalVersion'
FROM sys.dm_os_host_info 
GO




Reference

Install SQL Server 2017 on Windows Server 2016
https://sharedderrick.blogspot.com/2017/10/install-sql-server-2017-on-windows.html

[SQL Server] Query version, edition and update level - 版本、版次、編號
https://sharedderrick.blogspot.com/2017/08/sql-server-query-version-edition-and.html

2020-04-21

Sysprep 變更 SID(Security Identifier),以 Windows Server 2019 為例

Sysprep 變更SID(Security Identifier),以 Windows Server 2019 為例

在使用虛擬機器時,採取「複製虛擬機器」的方式來建置多台虛擬機器,可簡化安裝建置的時間。

但每台虛擬機器的電腦安全性識別碼(SID,Security Identifie),因為採取複製方式,導致其電腦安全性識別碼都重複相同。

影響

  • 這個問題會影響到各種工作群組環境中的安全性,而且卸除式媒體安全性在具有多重相同電腦 SID 的網路中也會受到影響。


使用系統準備(Sysprep)工具,會將電腦設定為重新開機時,建立新的電腦安全性識別碼(SID)。

系統準備(Sysprep)的功能


  • 從 Windows 映像中移除電腦特定的資訊,包括電腦的安全識別碼(SID)。 這可讓您捕獲映射並將它套用到其他電腦。 這就是所謂的電腦一般化(generalizing)。
  • 從 Windows 映像卸載電腦特有的驅動程式。
  • 將電腦設定為開機至 OOBE,以準備電腦以傳遞給客戶。
  • 可讓您將回應檔案(自動安裝)設定新增至現有的安裝。



注意事項


  • 在完成變更SID(Security Identifier)後,系統相關的組態會重置,例如:
  • 設定時區、鍵盤、電腦名稱、登入帳戶的密碼、「Windows 需要重新啟用」等。




Sysprep 圖形化使用者介面

示範環境:
Windows Server 2019 Datacenter 版本。

-- 01_使用whoami,user參數,查詢SID


-- 02_使用檔案總管,執行C:\Windows\System32\Sysprep目錄下的Sysprep.exe。

使用參數:
系統清理動作:進入系統全新體驗(ODBE)。
勾選:一般化。
關機選項:重新開機。

Sysprep 會重設安全性識別碼 (SID),清除任何系統還原點以及刪除事件記錄檔







-- 03_再度使用whoami查詢,觀察到:電腦名稱、安全性識別碼 (SID)等,都已經重設。









參考資料

Sysprep 圖形化使用者介面,變更SID(Security Identifier),以 Windows Server 2016 為例
http://sharedderrick.blogspot.com/2017/02/sysprep-sidsecurity-identifier-windows.html

Sysprep 命令列,變更SID,以 Windows Server 2016 為例
http://sharedderrick.blogspot.com/2017/02/sysprep-sid-windows-server-2016.html

Sysprep (系統準備)總覽
https://docs.microsoft.com/zh-tw/windows-hardware/manufacture/desktop/sysprep--system-preparation--overview

2020-04-20

Windows server 2019 安裝


在 Windows Server 2019 Datacenter 版本上設定基礎環境,準備作為安裝 SQL Server 2019 版本之用






版本:Windows Server 2019 Datacenter
編號:10.0.17763.1098






安裝歷程的抓圖

https://photos.app.goo.gl/pXy5wueKYuCG58NE6



2018-12-01

Enabled SET XACT_ABORT ON in SSMS, 在 SSMS 啟用 XACT_ABORT



延續前一篇文章:BEGIN TRAN with XACT_ABORT

若需要以此 SSMS 為單元,所建立的 Connection,都要啟用 XACT_ABORT,可以在 SSMS 執行以下設定




影響範圍


  • 啟用後,僅套用在此 SSMS 新建立的 Connection,不影響 SQL Server。
  • 由此 SSMS 新建立的 Connection,即刻適用。但對既有的 Connection 則不受影響。

若有需要,可以關閉 SSMS,再度開啟 SSMS。




Enabled SET XACT_ABORT ON in SSMS, 
在 SSMS 啟用 XACT_ABORT


01. 在 SSMS ,點選上方工具選單,Tools ,選擇 Options。

02. 在 Options 視窗


  • 點選 Query Execution,SQL  Server,Advanced。
  • 或是,在 Search Options 方塊,輸入: XACT 關鍵字。


03. 在 Advanced \ Specify the advanced execution settings 對話方塊


  • 勾選: SET XACT_ABORT ON


-- figure 01_SSMS_SET_XACT_ABORT_ON




影響範圍


  • 啟用後,僅套用在此 SSMS 新發出的 Connection,不影響 SQL Server。
  • 由此 SSMS 發出的新 Connection,即刻適用。但對既有的 Connection 則不受影響。

若有需要,可以關閉 SSMS,再度開啟 SSMS。






Reference

BEGIN TRAN with XACT_ABORT
http://sharedderrick.blogspot.com/2018/11/begin-tran-with-xactabort.html

查詢是否有啟用 XACT_ABORT 選項
http://sharedderrick.blogspot.com/2008/09/xactabort.html

設定 user options 伺服器組態選項
https://docs.microsoft.com/zh-tw/sql/database-engine/configure-windows/configure-the-user-options-server-configuration-option?view=sql-server-2017

SET XACT_ABORT (Transact-SQL)
https://docs.microsoft.com/zh-tw/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-2017

@@TRANCOUNT (Transact-SQL)
https://docs.microsoft.com/zh-tw/sql/t-sql/functions/trancount-transact-sql?view=sql-server-2017

2018-11-27

BEGIN TRAN with XACT_ABORT



若需求是

  • 遇到執行階段的錯誤,希望系統能自動回復 Rollback 整個 交易 Transaction。
  • 則 請使用 BEGIN TRAN 並且設定 SET XACT_ABORT ON。


當 SET XACT_ABORT 是 ON 時,如果 Transact-SQL 陳述式產生執行階段錯誤,就會終止和回復整個交易。

  • 例如:資料表不存在、違反 外部索引鍵 等。


有啟用 SET XACT_ABORT ON,當遇到 執行階段錯誤時,系統自動回復 Rollback 目前交易,查詢 @@TRANCOUNT = 0。






BEGIN TRAN with enable XACT_ABORT


當 SET XACT_ABORT 是 ON 時,

  • 如果 Transact-SQL 陳述式產生執行階段錯誤,就會終止和回復整個交易。
  • 例如:資料表不存在、違反 外部索引鍵 等
  • SET XACT_ABORT 不會影響到如語法錯誤之類的編譯錯誤。


01. 僅使用 BEGIN TRAN,執行 Script:

  • 資料表 Products 存在,第 1 句 SELECT 執行成功,有回傳資料。
  • 但 SELECT 資料表 Products_XXX 不存在,執行時系統回傳 Error Message 208: Invalid object name。


問題:

  • 第 2 句 SELECT 執行失敗,但先前已經啟用 BEGIN TRAN,這會造成什麼影響呢?

-- figure 01_BEGIN TRAN without XACT_ABORT



02. 使用 @@TRANCOUNT ,檢視目前連線已經啟用 BEGIN TRAN 的數量。

  •  回傳 1,表示已經有 1 個 BEGIN TRAN 存在。
  • 若沒有 BEGIN TRAN,預設回傳 0。

-- figure 02_Have opened a transaction, @@TRANCOUNT = 1




03. 若嘗試去關閉該連線。

在 SSMS 產生警示的對話方塊,該連線有 未認可的交易(uncommitted transaction)。
點選 No,可以 退回 Rollback Transaction。

-- figure 03_Get_uncommitted_transaction





BEGIN TRAN with SET XACT_ABORT ON


當 SET XACT_ABORT 是 ON 時,

  • 如果 Transact-SQL 陳述式產生執行階段錯誤,就會終止和回復整個交易。
  • 例如:資料表不存在、違反 外部索引鍵 等
  • SET XACT_ABORT 不會影響到如語法錯誤之類的編譯錯誤。


01. 在新的連線上,使用 SET XACT_ABORT ON 與 BEGIN TRAN。

  • 資料表 Products 存在,第 1 句 SELECT 執行成功,有回傳資料。
  • 但 SELECT 資料表 Products_XXX 不存在,執行時系統回傳 Error Message 208: Invalid object name。

問題:

  • 先前已經使用 SET XACT_ABORT ON 與 BEGIN TRAN。其中,第 2 句 SELECT 因資料表 不存在 而執行失敗,這會造成什麼影響呢?

-- figure 11_Get_Error




02. 使用 @@TRANCOUNT ,檢視目前連線已經啟用 BEGIN TRAN 的數量。


  •  回傳 0,表示沒有任何 BEGIN TRAN 存在。
  • 若沒有 BEGIN TRAN,預設回傳 0。

這是因為當 SET XACT_ABORT 是 ON 時,
如果 Transact-SQL 陳述式產生執行階段錯誤,就會終止和回復整個交易。

-- figure 12_ @@TRANCOUNT = 0



03. 對比兩者的差異


  • 兩邊 SQL Script 執行後,在第 2 句 SELECT 資料表 Products_XXX 不存在,系統回傳 Error Message 208: Invalid object name。
  • 有啟用 SET XACT_ABORT ON,當遇到 執行階段錯誤時,系統自動回復 Rollback 目前交易,查詢 @@TRANCOUNT = 0。



-- figure 21_Compare





2018-10-29

Find out Statistics used to Execution Plan from Plan Cache - DBCC TRACEON(8666), 由 Plan Cache 取得 執行計畫 所使用的 統計值



啟用 TRACEON(8666) 後,在 該 Session 就可以:

  • 由 Plan Cache (Memory) 取得 Execution Plan 所使用的 Statistics
  • 由 Include Actual Execution Plan / Display Estimated Execution Plan ,取得 Execution Plan 所使用的 Statistics
  • 在 Execution Plan 上會額外提供 Internal Debugging Information(內部偵錯用訊息) ,這包含了 Statistics 細節資訊。

例如,可以取得:
StatName、ColName、ModCtr、RowCount、Threshold、Reason 等資訊。


此為 Undocumented Trace Flags: DBCC TRACEON(8666)
適用版本: SQL Server 2008 以上的環境







檢視 ModTrackingInfo 元素

  • StatName: _WA_Sys_00000003_014935CB
  • ColName: ContactName
  • ModCtr: 91
  • RowCount: 91
  • Threshold: 500
  • Reason: small table










Find out Statistics used to Execution Plan from Plan Cache - DBCC TRACEON(8666), 

由 Plan Cache 找出 執行計畫 所使用的 統計值 - - DBCC TRACEON(8666)


本文 以下介紹 2 種用法:

(1) 由 Plan Cache (Memory) 取得 Execution Plan 所使用的 Statistics - 
啟用 TRACEON(8666) ,並執行 sys.dm_exec_query_plan



用法:

  • 啟用 DBCC TRACEON(8666) 後,可以使用 sys.dm_exec_query_plan 由 Plan Cache ,取得 Query Optimizer 在 Execution Plan 所使用的 Statisitics。


功能:

  • 將 內部偵錯用訊息 存放於 Execution Plan 內,這包含了 Statistics 細節資訊。


若沒有啟用 DBCC TRACEON(8666) ,則 sys.dm_exec_query_plan 顯示為 NULL,沒有資料。


(2) 由 Include Actual Execution Plan / Display Estimated Execution Plan ,取得 Execution Plan 所使用的 Statistics
- 啟用 TRACEON(8666) 


用法:

  • 若搭配指定的 SQL Query,使用 Include Actual Execution Plan / Display Estimated Execution Plan,可以取得 Query Optimizer 在 Execution Plan 所使用的 Statistics。


功能:

  • 將 內部偵錯用訊息 存放於 Execution Plan 內,這包含了 Statistics 細節資訊。




(1) 由 Plan Cache (Memory) 取得 Execution Plan 所使用的 Statistics
啟用 TRACEON(8666) ,並執行 sys.dm_exec_query_plan

  • 用法: 啟用 DBCC TRACEON(8666) 後,可以使用 sys.dm_exec_query_plan 由 Plan Cache ,取得 Query Optimizer 在 Execution Plan 所使用的 Statisitics。
  • 功能: 將 內部偵錯用訊息 存放於 Execution Plan 內,這包含了 Statistics 細節資訊。
  • 若沒有啟用 DBCC TRACEON(8666) ,sys.dm_exec_query_plan 的 [Statistics] 顯示 NULL,沒有資料。

01. 使用 dm_db_stats_properties: 傳回 資料表 的所有 Statistics 屬性

  • Table: Customers, Orders
  • 已經存在 15 個 Statistics

-- figure 01_dm_db_stats_properties Returns properties of statistics for the specified database object




02. 執行 SQL Query。


  • 僅查詢單一資料表。
  • DBCC FREEPROCCACHE: 清除 Plan Cache,此為非必要,在本範例中,也僅是用於重置環境參數。


-- figure 02_Removes plan cache and Query Table with Auto Create Statistics







03. 啟用 TRACEON(8666) ,並執行 sys.dm_exec_query_plan

  • 用法: 啟用 DBCC TRACEON(8666) 後,可以使用 sys.dm_exec_query_plan 由 Plan Cache ,取得 Query Optimizer 在 Execution Plan 所使用的 Statisitics。
  • 功能: 將 內部偵錯用訊息 存放於 Execution Plan 內,這包含了 Statistics 細節資訊。
  • 若沒有啟用 DBCC TRACEON(8666) ,sys.dm_exec_query_plan 的 [Statistics] 顯示 NULL,沒有資料。


SQL Script 說明

  • 啟用 DBCC TRACEON(8666)
  • 執行 sys.dm_exec_query_plan,取得 Execution Plan  所使用的 Statistics
  • 關閉 DBCC TRACEOFF(8666)


-- DBCC TRACEON(8666) -- Find out Statistics used to Execution Plan from Plan Cache.
DBCC TRACEON(8666)

SELECT TOP 100 st.text [TSQL], DB_NAME(st.dbid) [DB], 
 qs.last_elapsed_time/1000000.0 [LastElapsedTime(sec)],
 qs.last_worker_time/1000000.0 [LastCPUTime(sec)],
 qs.last_logical_reads LastLogicalReads,
 qs.last_physical_reads LastPhysicalRead,
 qs.last_logical_writes LastlogicalWrites,
 qs.last_rows LastRows,
 cp.usecounts [ExecutionCount], cp.size_in_bytes/1024.0 [PlanSize(KB)],
 cp.cacheobjtype [CacheObject], cp.objtype [ObjType], qs.plan_generation_num [PlanRecompile],
 qp.query_plan.query('declare namespace ns="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
 (/ns:ShowPlanXML/ns:BatchSequence/ns:Batch/ns:Statements/ns:StmtSimple/ns:QueryPlan/ns:ParameterList/ns:ColumnReference[@Column])') [ParameterList],
 qp.query_plan.query('declare namespace ns="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
 (/ns:ShowPlanXML/ns:BatchSequence/ns:Batch/ns:Statements/ns:StmtSimple/ns:QueryPlan/ns:InternalInfo/ns:EnvColl/ns:Recompile)') [Statistics], 
 qp.query_plan [QueryPlan], cp.plan_handle, qs.last_execution_time, qs.creation_time
FROM sys.dm_exec_cached_plans cp INNER JOIN sys.dm_exec_query_stats qs
 ON cp.plan_handle = qs.plan_handle
 CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
 CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
WHERE st.dbid = DB_ID('Northwind')
-- CHARINDEX ('Products', st.text) >0
-- st.text LIKE '%xxx%'
ORDER BY qs.last_execution_time DESC;

DBCC TRACEOFF(8666)
GO


-- figure 03_ DBCC TRACEON(8666) -- Find out Statistics used to Execution Plan from Plan Cache.





04. 檢視 回傳的結果集。

  • QueryPlan: 存放 Execution Plan。
  • Statistics: 存放 XML 格式的 Statistics。


-- figure 04_Get_Statistics_XML





05. 檢視 QueryPlan 內的 Execution Plan

  • 點選左邊的 SELECT operator,滑鼠右鍵,選擇 Properties。
  • 在右邊 Properties 窗格,展開 Internal Debugging Information
  • 展開 與 觀察 Recompile ModTrackingInfo

-- figure 05_SELECT_Properties_Internal Debugging Information






06. 在 ModTractkingInfo,展開 顯示 更多資訊關於 Statistics 資訊。

-- figure 06_ModTrackingInfo





07. 檢視 由 Plan Cache 取得的 Statistics 資訊


  • 以 XML 格式呈現的 Statistics。


-- figure 07_Execution_Plan_Statistics





08. 檢視 ModTrackingInfo 元素

  • StatName: _WA_Sys_00000003_014935CB
  • ColName: ContactName
  • ModCtr: 91
  • RowCount: 91
  • Threshold: 500
  • Reason: small table

-- figure 08_Statistics_ModTrackingInfo






09. 以 XML 格式 來檢視 Execution Plan


  • InternalInfo 元素


-- figure 09_XML






10. 以 XML 格式 來檢視 Execution Plan


  • Recompile 元素


-- figure 10_XML





11. 以 XML 格式 來檢視 Execution Plan


  • ModTrackingInfo 元素


-- figure 11_XML_ModTrackingInfo







(2) 由 Include Actual Execution Plan / Display Estimated Execution Plan ,取得 Execution Plan 所使用的 Statistics
-- 啟用 TRACEON(8666)


先前介紹的是由 Plan Cache (Memory) 取得 Execution Plan 所使用的 Statistics。

以下方式,則是應用於 Include Actual Execution Plan / Display Estimated Execution Plan ,取得 在 Execution Plan 所使用的 Statistics。



DBCC TRACEON(8666) -- Find out Statistics used to Execution Plan


  • 用法: 若搭配指定的 SQL Query,使用 Include Actual Execution Plan / Display Estimated Execution Plan,可以取得 Query Optimizer 在 Execution Plan 所使用的 Statistics。
  • 功能: 將 內部偵錯用訊息 存放於 Execution Plan 內,這包含了 Statistics 細節資訊。


01. 執行以下 SQL Query


  • 啟用 DBCC TRACEON(8666)
  • 使用 Include Actual Execution Plan / Display Estimated Execution Plan
  • 執行 SQL Query ,僅查詢 單一 資料表
  • 關閉 DBCC TRACEOFF(8666)


-- figure 21_Actual_Execution_Plan_DBCC TRACEON(8666)






02. 檢視 Execution Plan


  • 點選左邊的 SELECT operator,滑鼠右鍵,選擇 Properties
  • 在右邊 Properties 窗格,展開 Internal Debugging Information
  • 展開 與 觀察 Recompile ModTrackingInfo



可以看到 1 份 Statistics 資訊,檢視 ModTrackingInfo 元素

  • StatName: _WA_Sys_00000003_014935CB
  • ColName: ContactName
  • ModCtr: 91
  • RowCount: 91
  • Threshold: 500
  • Reason: small table


-- figure 22_Execution_Plan_SELECT_Properties_Internal Debugging Information






03. 執行複雜 SQL Query


  • 此 SQL Query,使用 Inner Join,查詢 2 張資料表,並使用 Where 條件式。
  • 觀察 Recompile ModTrackingInfo
  • 可以看到 當時 2 張資料表上的 全部 Statistics 資訊,約:15 個


在此案例 (Inner Join) 中,啟用 DBCC TRACEON(8666) 後,會取得 當時  參與資料表上的全部 Statistics 資訊。但仍可分析像是 條件式 Where、On 等 SQL statement,得知 當時 所使用的 Statistics。

-- figure 31_Display all statistics






04. 以 XML 格式 來檢視 Execution Plan


  • 觀察 Orders  資料表的 Statistics。


-- figure 32_XML_Orders






05. 以 XML 格式 來檢視 Execution Plan


  • 觀察 Orders 資料表的 Statistics。


-- figure 33_XML





06. 以 XML 格式 來檢視 Execution Plan


  • 觀察 Customers 資料表的 Statistics。


-- figure 34_XML_Customers









Sample Code

20181029_Find out Statistics_TRACEON_8666
https://drive.google.com/drive/folders/0B9PQZW3M2F40OTk3YjI2NTEtNjUxZS00MjNjLWFkYWItMzg4ZDhhMGIwMTZl?usp=sharing



Reference

Use Autostat (AUTO_UPDATE_STATISTICS), 認識 自動更新統計資料 (1)
http://sharedderrick.blogspot.com/2018/10/statistics-use-autostat.html

Use Autostat (AUTO_UPDATE_STATISTICS), 認識 自動更新統計資料 (2)
http://sharedderrick.blogspot.com/2018/10/use-autostat-autoupdatestatistics-2.html

Find out Statistics used to Execution Plan in SQL Server 2017, 找出 執行計畫 所使用的 統計值
http://sharedderrick.blogspot.com/2018/10/find-out-statistics-used-to-execution.html

2018-10-19

Find out Statistics used to Execution Plan in SQL Server 2017, 找出 執行計畫 所使用的 統計值


SQL Server 2017 強化 Execution Plan,增加 [OptimizerStatsUsage] 屬性,可提供 Query Optimizer 在此 Execution Plan 所使用的 Statistics。

無論是 Include Actual Execution Plan / Display Estimated Execution Plan,都可以使用 [OptimizerStatsUsage] 屬性。

經過測試: SQL Server 2017 版本,並且 COMPATIBILITY_LEVEL = 120 以上適用。







Find out Statistics used to Execution Plan in SQL Server 2017
找出 Execution Plan (執行計畫) 所使用的 Statistics (統計值)



SQL Server 2017 強化 Execution Plan,增加 [OptimizerStatsUsage] 屬性,可提供 Query Optimizer 在此 Execution Plan 所使用的 Statistics。

無論是 Include Actual Execution Plan / Display Estimated Execution Plan,都可以使用 [OptimizerStatsUsage] 屬性。

初步測試: SQL Server 2017 版本,並且 COMPATIBILITY_LEVEL = 120 以上適用。SQL Server 2014 (x.12)




01. 使用 dm_db_stats_properties: 傳回 資料表 的所有 Statistics 屬性
  • Table: Customers, Orders

-- figure 01_dm_db_stats_properties_Customers_Orders






02. 執行 SQL Query
  • 僅查詢單一資料表。

  • 無論是 Include Actual Execution Plan / Display Estimated Execution Plan,都可以使用 [OptimizerStatsUsage] 屬性。
  • 點選 左邊 最後一個 SELECT Operator,滑鼠 右鍵,選擇 Properties。

  • 自動產生 Statistics。
    • 依據預設值,有啟用資料庫選項:AUTO_CREATE_STATISTICS。
    • WHERE 條件式使用 Column: ContactName,Query Optimizer 將自動為其建立 Statistics。

-- figure 11_SQL_Server 2017_SELECT







03. 在 Properties 視窗,可以看到 [OptimizerStatsUsage] 區塊,使用到 1 個 Statistics,包含以下資訊:
  • Database: [Northwind]
  • LastUpdate: 2018-10-19T21:01:05.14
  • ModificationCount: 0
  • SamplingPercent: 100
  • Schema: dbo
  • Statistics: _WA_Sys_00000003_014935CB
  • Table: [Customers]


-- figure 12_SELECT_Properties_OptimizerStatsUsage





04. 檢視 Show Execution Plan XML
  • 觀察 OptimizerStatsUsage

-- figure 13_Show_Execution_Plan_XML





05. 執行 SQL Query
  • Table Join 2 個

    • 無論是 Include Actual Execution Plan / Display Estimated Execution Plan,都可以使用 [OptimizerStatsUsage] 屬性。
    • 點選 左邊 最後一個 SELECT Operator,滑鼠 右鍵,選擇 Properties。
-- figure 14_SQL_Server 2017_SELECT






06. 在 Properties 視窗,可以看到 [OptimizerStatsUsage] 區塊,使用到 3 個 Statistics,包含以下資訊:

[1]
  • Database: [Northwind]
  • LastUpdate: 2018-10-19T21:01:05.14
  • ModificationCount: 0
  • SamplingPercent: 100
  • Schema: dbo
  • Statistics: _WA_Sys_00000003_014935CB
  • Table: [Customers]

[2]
  • Database: [Northwind]
  • LastUpdate: 2008-09-13T13:06:45.8
  • ModificationCount: 0
  • SamplingPercent: 100
  • Schema: dbo
  • Statistics: [CustomerID]
  • Table: [Orders]

[3]
  • Database: [Northwind]
  • LastUpdate: 2008-09-13T13:06:45.77
  • ModificationCount: 0
  • SamplingPercent: 100
  • Schema: dbo
  • Statistics: [PK_Customers]
  • Table: [Customers]

-- figure 15_SELECT_Properties_OptimizerStatsUsage






07. 檢視 Show Execution Plan XML
  • 觀察 OptimizerStatsUsage

-- figure 16_Show_Execution_Plan_XML





08. 使用 SSMS 檢視 Index 與 Statistics

-- figure 17_SSMS_Statistics







Sample Code

20181019_Find out Statistics used to Execution Plan
https://drive.google.com/drive/folders/0B9PQZW3M2F40OTk3YjI2NTEtNjUxZS00MjNjLWFkYWItMzg4ZDhhMGIwMTZl?usp=sharing




Reference


Use Autostat (AUTO_UPDATE_STATISTICS), 認識 自動更新統計資料 (1)
http://sharedderrick.blogspot.com/2018/10/statistics-use-autostat.html

Use Autostat (AUTO_UPDATE_STATISTICS), 認識 自動更新統計資料 (2)
http://sharedderrick.blogspot.com/2018/10/use-autostat-autoupdatestatistics-2.html