千萬別用Sql Server Management Studio的資料列編輯功能剪貼來匯大量資料

今天檢視前一日的SQL 效能報表時發現下班前到晚上8點持續有BatchRequest偏高的趨勢

調出前一日的資料看看當下是那些語法在跑導致SQL發生這樣的情形。經過檢視後發現當下是某一位同仁持續用SSMS在Insert資料,但前前後後塞了4小時且還有一堆系統產生的語法夾雜。

因此我請教該同仁當下在做甚麼,他表示是將Excel的資料複製後透過SSMS貼上而已,但是SSMS跑很久且很慢。當下只能解釋給他聽,說大量資料請善用匯入匯出精靈

以下是一個簡單的LAB來模擬問題。

下圖中紅色圈選處就是SSMS提供的一個功能,該功能是讓我們可以編輯前200筆資料列。

開啟後如下圖右邊,會有一個表格,我們就可以輕易地用這一個UI來新增刪除或修改資料。

在該表格按滑鼠右鍵時還可以發現這UI有 貼上 資料的選項。

此時我開啟一張Excel表,然後選取並複製4筆資料出來。

接下來我直接在SSMS上貼上資料。

 

如下圖所示,4筆資料被貼到資料表內了。 哇 ! 這功能這樣好用為何不要拿來貼大量資料呢? 因為魔鬼往往藏在細節裡,讓你越簡單的操作就表示很多步驟是SSMS私底下做掉了

要知道SSMS到底做了哪些事,此時就得召喚出DBA的好朋友Profiler登場。如下圖所示我只錄製RPC:Completed及SQL:BatchCompleted兩個事件,然後只監測adminDB這一個資料庫。

 

這次我只在Excel中複製一筆資料到SSMS中貼,看看單一筆資料會做多少動作。

登!登!登!登! 下圖中是我貼一筆資料後Profiler錄到的事件,整整做了20個動作。而Insert的動作只是20個中的1個(如下圖紅色圈選處)。

有時工具會給我們方便,但我們使用也不能太隨便而沒去發現背後藏有魔鬼。這一個功能貼小量資料我覺得還OK,但像我同事拿來貼17萬筆資料就太Over了。大資料量就用匯入匯出精靈或Bulk Insert都有很好的效能歐。

 

我是ROCK

rockchang@mails.fju.edu.tw