Powershell--批量拆分SQL語句為事務並批處理

来源:http://www.cnblogs.com/TeyGao/archive/2016/09/07/5849989.html
-Advertisement-
Play Games

作為DBA,時不時會遇到將數據導入到資料庫的情況,假設業務或研發提供一個包含上百萬行INSERT語句的腳本文件,而且這些INSERT 語句沒有使用GO來進行批處理拆分,那麼直接使用SQLCMD來執行會發現該進程消耗大量物理記憶體並遲遲沒有數據寫入,即使腳本中每一行都添加了GO,你依然會發現這插入效率太 ...


作為DBA,時不時會遇到將數據導入到資料庫的情況,假設業務或研發提供一個包含上百萬行INSERT語句的腳本文件,而且這些INSERT 語句沒有使用GO來進行批處理拆分,那麼直接使用SQLCMD來執行會發現該進程消耗大量物理記憶體並遲遲沒有數據寫入,即使腳本中每一行都添加了GO,你依然會發現這插入效率太差,讓你無法忍受,怎麼搞呢,下麵小代碼幫你折騰下:

$old_file_path= 'C:\insert_scripts.sql'
$new_file_path='C:\insert_scripts_new.sql'
$tran_rows=50

$line_content="
SET NOCOUNT ON
GO
BEGIN TRAN
BEGIN TRY
"
$line_content |Out-File $new_file_path
$line_num=1

$sr1=[IO.StreamReader]$old_file_path
$line_content=""
while(-not $sr1.EndOfStream)
{
    
    $tmp_content= $sr1.ReadLine()
    $line_content=$line_content+"`r"+$tmp_content
    $line_num_mode =$line_num % $tran_rows
    
    if($line_num_mode -eq 0)
    {
        $line_content=$line_content+"
COMMIT
PRINT '執行第"+($line_num-$tran_rows)+"行到第"+($line_num)+"行成功'
END TRY
BEGIN CATCH
ROLLBACK
PRINT '執行第"+($line_num-$tran_rows)+"行到第"+($line_num)+"行失敗'
END CATCH
GO
BEGIN TRAN
BEGIN TRY
"
        $line_content | Out-File -Append $new_file_path
        Write-Host "處理到行" $line_num
        $line_content=""
    }

    $line_num=$line_num+1
    
}

$line_content=$line_content+"
COMMIT
PRINT '執行第"+($line_num-$tran_rows)+"行到第"+($line_num)+"行完成'
END TRY
BEGIN CATCH
ROLLBACK
PRINT '執行第"+($line_num-$tran_rows)+"行到第"+($line_num)+"行失敗'
END CATCH
GO
"
$line_content | Out-File -Append $new_file_path

$sr1.Close()

還是看點療效吧,原始SQL為:

經過此腳本修改過的變為:

這樣實現有以下有點:

1.  使用“SET NOCOUNT ON”來屏蔽每條語句返回影響行數,減少與cmd視窗交互的次數;

2.  將每50條語句拆分到一個批處理中,降低資料庫進行語法檢查分析的消耗,在封裝到一個事務中進行提交,減少寫日誌的次數;

3.  列印輸出事務執行結果,方便排查錯誤(可修改代碼只輸出執行失敗的事務)

執行結果截圖:

====================================================

在個人電腦測試,以100條一個事務來拆分,大概1分鐘可以導入50萬到60萬,按不同的行數進行拆分插入效率不同,具體合適的拆分行數需要根據實際情況測試為準。

對於超大數據量的導入,還是推薦使用csv+bcp的方式來導入,INSERT+SQLCMD的效率始終太低太低!

====================================================

沒啥技術含量,厚臉拿出來分享,只是因為很久沒寫博客啦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於項目的需要,系統的彈出框已經不能滿足我們的需求,我們需要各式各樣的彈出框,這時就需要我們去自定義彈出框了。 新建佈局文件 dialog_layout.xml,將下麵內容複製進去 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:a ...
  • 仿造美圖秀秀移動滑鼠調整seekbar,調整圖片的顏色 項目佈局如下: 效果如下: 邏輯部分代碼如下: 運行效果: ...
  • 安裝eclipse for android 時候的錯誤記錄,轉載自:http://blog.csdn.net/chenyufeng1991/article/details/47442555 (1)打開Preferences,在Windows下麵應該在WIndow-->Preferences.在mac ...
  • Android的SharedPreferences用來存儲一些鍵值對, 但是卻不支持跨進程使用. 跨進程來用的話, 當然是放在資料庫更可靠啦, 本文主要是給作者的新庫[PreferencesProvider](https://github.com/mengdd/PreferencesProvider... ...
  • 原諒我只提供一個鏈接,我在這裡寫了兩遍,最後加個鏈接頁面卡死了,下麵的demo,最好真機調試。(寫博客還是在別的地方寫複製到這裡比較好!) https://pan.baidu.com/s/1mi2fHDu 另外還有一些資料分享,喜歡的可以看一下:http://www.cnblogs.com/ljcg ...
  • 今天總結一下android客戶端從伺服器端獲取json數據的實現代碼,需要的朋友可以參考下 首先客戶端從伺服器端獲取json數據 1、利用HttpUrlConnection /** * 從指定的URL中獲取數組 * @param urlPath * @return * @throws Excepti ...
  • 在網上看了很多資料都是空說一談,都只是說很簡單,然後沒有說遇到這樣的情況具體該怎麼做,看到這裡都知道是許可權問題,其實我們每一個人都知道,又是我覺得我還是要給以後遇到的朋友個解決方法: 這裡用到的資料庫是08版本的,出現了這種一直報許可權錯誤:錯誤截圖如下: 所見效果描述:在windows身份驗證的 情 ...
  • 一、導出數據外部 1)mysql連接+將查詢結果輸出到文件。在命令行中執行(windows的cmd命令行,mac的終端) -h:後面跟的是鏈接的host(主機) -u:後面跟的是用戶名 -p:後面跟的是密碼 db:你要查詢的資料庫 file:你要寫入的文件,絕對路徑 例如: 下麵將 sql語句 se ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...