[SQL Server]檢查SQL Server真正使用到多少核心(Cores)

上禮拜參加8月的SQL PASS,講師是微軟厲害的資料庫技術支援工程師Eddie,會議中有一個議題: 檢查SQL Server真正使用到多少Cores,回家作業(寫)。

SQL Server 2012之後,EE(企業版本)的計價從socket改為cores核心授權計價,AP Team也沒太注意安裝細節,infra會安裝,採購會算錢,我們AP使用就對了。

隨著版本升級,接著AP開始用SQL Server 2012、SQL Server 2014,也因為處理的資料量越來越大,機器從2U升級到4U,CPU從E5升到E7,為的就是更多穩定的CPU運算力及延展。

 

這個議題的收穫也算是類DB效能提升!來筆記DB消失的運算力:

 

SQL Server安裝檔下載問題

通常我們都透過MSDN訂閱網站來下載測試軟體,搜尋欄位輸入SQL Server 2016 Enterprise,有3個結果:其中,橘色框才是以後客戶新採購SQL Server核心授權計價時要下載的。

以前看到有Core字樣,可能誤以為是Server core那種沒UI的安裝檔所以沒選,因此選了最下面的哪一個,經過微軟技術支援工程師Eddie及網友Simon的解釋分享發現,如果安裝了非core license安裝,其實CPU的使用是有license上限的!

SQL Server EE – Server

佈署環境

CPU使用上限

VM

20 Core

實體機

20 Core

實體機(啟用hyper-thread)

40 Core

 

趕快來查測試環境SQL Server版本

語法查看版本:

SELECT @@VERSION

果然安裝的不是核心授權版!

從SQL Server的紀錄也看的到!

測試環境: SQL Server 2012 Enterprise

測試環境: SQL Server 2014 Enterprise

嗯,果然都出現License的限制!

 

執行測試CPU 100%語法

USE master

SELECT MyInt = CONVERT(BIGINT, o1.object_id) + CONVERT(BIGINT, o2.object_id) + CONVERT(BIGINT, o3.object_id)
INTO #temp
FROM sys.objects o1
JOIN sys.objects o2 ON o1.object_id < o2.object_id
JOIN sys.objects o3 ON o1.object_id < o3.object_id

SELECT SUM(CONVERT(BIGINT, o1.MyInt) + CONVERT(BIGINT, o2.MyInt))
FROM #temp o1
JOIN #temp o2 ON o1.MyInt < o2.MyInt

工作管理員/效能/CPU

嗯,只有20 Core在工作,剩下來的12 Core都休假出國玩了。

 

解決方式

百敬老師也有幫忙提問Eddie解決的方式,我們來試試看:

1.下載SQL Server 2014 Enterprise Core 版本

2.升級安裝

點選安裝檔後,選維護(Maintenance)/版本升級(Edition Upgrade)

輸入金鑰

選定要升級的執行個體(Instance)

升級中

完成升級,過程約3分鐘

完成升級

4.重新啟動SQL Server 服務

5.查看版本

SELECT @@VERSION

Instance屬性資訊:

SQL Server log

6.執行耗時CPU

這才是Team work!

小結:

  • 還好專案都還在測試階段,還有機會救。
  • SQL PASS收穫很多。

 

SQL_Server_2012_Licensing_Quick_Reference_Guide_Mar2012_2_ZHTW.pdf

 

參考:

Compute Capacity Limits by Edition of SQL Server

Differences between SQL Server 2012 Enterprise Edition - Server CAL and Per Core Licensing

Upgrade to a Different Edition of SQL Server 2016 (Setup)

Supported Version and Edition Upgrades

Trying to create an SQL Query that will max all CPUs to 100%