星期一, 1月 31, 2022

[SSMS] 索引在陣列的界限之外

SSMS 連接 SQL Server 2019,使用資料庫圖表功能時,要把 Table 加進圖表內就出現下面錯誤訊息
現有 SSMS 為 V18.9.2
發現有 V18.10,更新完成後該問題就消失啦
 
20220324 補充

再開啟資料庫圖表使用時,還是出現相同的錯誤訊息,這次是把資料庫擁有者,從 sa 改成 Windows 帳號就能正常使用,改成 SQL 帳號也不行喔


20230722 補充

上次紀錄完後,久久使用資料庫圖表功能仍然後發生該錯誤,就當是 SSMS 更新時間點,更新後就又正常,今天有需求要開起來使用,它竟然是正常的,目前使用的 SSMS 版本為 19.0.2,希望這問題就此修復

星期六, 1月 29, 2022

[SQL] 警示應用 - 監測 CPU 使用

在研討會上聽到的管理手法,找資料實作練習,處理情境為當 CPU 使用莫名升高要如何處理,主要分為兩個部分
  • 監控 CPU 使用
  • CPU 升高時處理流程

利用 Alter 來監控 CPU 使用

建立 Alter - [CPU High] 並選擇 [WMI 事件警示] 來進行監控
  • 命名空間:\\.\root\cimv2
  • 查詢:透過 WQL 每 5 秒查詢 CPU loading 是否超過 50%
SELECT * 
FROM __InstanceModificationEvent WITHIN 5 
WHERE TargetInstance ISA 'Win32_Processor' 
	AND TargetInstance.loadpercentage > 50  
回應
  • 執行 Job - CPU High Process (後面介紹)
  • 使用 [通知操作員] 來發 Mail 通知 DBA
選項
  • 將警示的錯誤文字包含於:可以把特定訊息或是語法塞在這,以該練習為例,可以塞擴充事件查詢語法,收到 mail 當下就可以抓出來查詢
  • 回應之間延遲:避免 Alter 一直觸發,依管理需求設定多久間隔觸發一次,該練習是設定 10分鐘

CPU 升高時處理流程

建立 Job - CPU High Process,並設定處理流程,該練習只有一個步驟,開啟事先建立的擴充事件收集 TSQL


啟用擴充事件
ALTER EVENT SESSION TSQLCollection ON SERVER  
STATE = start;  
GO


收集 TSQL 語法除了擴充事件,也可以利用 SQL Trace 或是 WhoIsActive 來達成喔。

另外發信通知部分,不使用操作員的話,也可以在 Job 內建立一個步驟,透過 sp_send_dbmail 來送出通知信

監控測試

該 文章 內有 CPU High 語法可以使用,當 CPU 超過設定的 50% 就會發出 mail 通知囉


有主動 mail 通知,也有發生當下的 TSQL 語法側錄,就可以知道當下 SQL Server 情況,方便釐清問題點囉

其他相關測試紀錄

一開始其實是朝 Alert 搭配 [SQL Server 效能條件警示] 來偵測 CPU High,測試過程一直沒有辦法觸發 Alert,後來才轉向 WMI,記錄這三篇參考資料

星期二, 1月 25, 2022

[SQL] Primary Key 和 Clustered Index 分離

在 論壇討論 時注意到問題提供的 Table Script,以前雖然有在 SSMS 上操作 Primary Key 和 Clustered Index 分開,但沒有轉成 Script 來看過,特地操作來確認產生的 Table Script 和問題是否一致

在 SSMS 內設定 Primary Key,該 Table 不存在 Clustered Index 的話,預設 Primary Key 就是 Clustered Index,所以要把兩者分開,要先建立 Clustered Index 後再去建立 Primary Key

Step1:Table => 索引 => 新增索引 => 叢集索引


Step2:建立 Primary Key


完成上述兩步驟後來觀察結果
  • Step1:建立 Clustered Index (紅線)
  • Step2:建立 Primary Key 和 NonClustered Index (綠線)

把該 Table 轉成 Script 來觀察
CREATE TABLE [dbo].[PKSeparate]
(
	[ID] [int] NOT NULL,
	[Col1] [nchar](10) NULL,
	CONSTRAINT [PK_PKSeparate] PRIMARY KEY NONCLUSTERED -- 第一次看到這段 Script 
	(
		[ID] ASC
	)W ITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

星期六, 1月 22, 2022

[SQL] 大量匯入與索引

在大量匯入資料時,會建議停用非叢集索引,待資料匯入完成後再啟用非叢集索引,rebuild 非叢集索引即為啟用

停用索引

SSMS => 目標 Table => 索引 => 全部停用


停用索引頁面會列出索引清單,但不可以停用叢集索引,原因在於停用叢集索引就無法對 Table 進行存取。在下圖索引清單按 delete 鍵刪除後,再透過指令碼產生語法來執行


透過指令碼產生的停用索引語法,語法如下
ALTER INDEX [IX_BulkInsertDemo] ON [dbo].[BulkInsertDemo] DISABLE
GO
在 SSMS 內操作停用叢集索引,會有下圖警告訊息
 

匯入測試

準備大約 120 萬筆資料來進行測試,測試非叢集索引是否停用情況下的效能差異,bulk insert 語法如下
BULK INSERT DBName.dbo.BulkInsertDemo
FROM 'D:\Data.txt'
WITH
(
    BATCHSIZE = 10000,
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR = '\n',
    TABLOCK,
    KEEPNULLS
)

測試結果
 
非叢集索引狀態大量匯入時間
啟用約 90 秒
停用約 20 秒

啟用索引

一開始以為 alter index 會有個參數 enable 可以使用,後來查官方文件才知道,所謂的啟用,其實就是 rebuild Index

透過 sys.indexes 可以查到被停用的索引
SELECT
	name ,
	type_desc ,
	is_disabled
FROM sys.indexes
WHERE is_disabled = 1


SSMS 內有 [全部重建] 可以產生對應指令碼,基本上操作同 [全部停用],就不截圖說明囉



rebuild 語法如下
ALTER INDEX [IC_BulkInsertDemo] ON [dbo].[BulkInsertDemo] REBUILD
GO

星期三, 1月 19, 2022

[VFP] 事件順序觀察

閱讀該篇文章 - 了解Visual Foxpro 的事件運作 時發現,原來 IDE 上有功能可以觀察事件運行順序,以前剛學習時都是傻傻的設定一堆 Messagebox 來觀察,沒想到漸漸不寫後才發現

在 Form 上放上四個控件來觀察
 

在工具列上點選 Event Tracking 功能,並勾選 [Turn event tracking on]
  • 預設追蹤全部 event,調整只觀察 init 和 load event 就好
  • 執行順序結果預設是輸出至 [Debugger Output Windows]

開啟 Debug Output 視窗來觀察事件執行順序

執行 Form 後就可以在 [Debug Output] 視窗內看見事件執行順序,Button 內有下述語法可以直接輸出文字至[Debug Output] 視窗
DebugOut "輸出測試"
執行結果如下

星期二, 1月 18, 2022

[VFP] 離線列印時發生錯誤

VFP 收到離線列印時發生錯誤訊息,有該篇經驗 - [VFP] Error accessing printer spooler,立馬就找到問題排除
這次遇到的問題,反而是印表機出現中文,aprinters() 沒有辦法顯示中文,變成問號,該情況去指定印表機時就會拋出錯誤 
不知道為什麼 (複件 1) 的印表機都會自動被安裝,一整個無厘頭,Orz

星期五, 1月 14, 2022

[Win] 連接埠對應印表機消失

最近新安裝 PC 上跑 VFP ERP 發生無法指定印表機情況,仔細查發現連接埠對應印表機通通都消失,如下圖
  • 圖左:正常情況下連接埠會有對應安裝的印表機
  • 圖右:連接埠對應安裝印表機消失,導致 VFP aprint 語法完全抓不到印表機

最後確認是在 Win10 上安裝 Bullzip 12_2_0_2905 版本,連接埠對應印表機就會消失,移除就恢復正常,在同事建議下改安裝 12_1_0_2890 來避開該問題,另外升級上 Win11 也會恢復正常喔
公司內 C# ERP 即使遇上該問題,在抓取印表機資訊上也沒有任何異常喔

星期四, 1月 13, 2022

[C#] 不規則陣列

根據 不規則陣列 該篇文章,在 LinqPad 上了解不規則陣列

不規則陣列基礎
void Main()
{
	// 方式一
	int[][] jaggedArray = new int[3][];
	jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
	jaggedArray[1] = new int[] { 0, 2, 4, 6 };
	jaggedArray[2] = new int[] { 11, 22 };
	jaggedArray.Dump();

	// 方式二
	int[][] jaggedArray2 = new int[][]
	{
		new int[] { 1, 3, 5, 7, 9 },
		new int[] { 0, 2, 4, 6 },
		new int[] { 11, 22 }
	};
	jaggedArray2.Dump();
}


不規則陣列設定值
void Main()
{	
	// 針對不規格陣列設定值
	int[][] jaggedArray3 =
	{	
		new int[] { 1, 3, 5, 7, 9 },
		new int[] { 0, 2, 4, 6 },
		new int[] { 11, 22 }
	};

	// 指定第一個 arrary 的第二個 element 為 77
	jaggedArray3[0][1] = 77;

	// 指定第三個 arrary 的第二個 element 為 88
	jaggedArray3[2][1] = 88;
	
	jaggedArray3.Dump();
}