SQL Server插入或者批量导入大量数据的性能表现
我经常看到客户测试SQL Server 的插入(INSERT)或者批量导入大量数据的性能表现。其中有测试大量INSERT的TSQL脚本如下: use myDB go create table t1 ( id int primary key not null identity ( 1 , 1 ), name varchar ( 200 ), memo char ( 500 )); go trun
我经常看到客户测试SQL Server 的插入(INSERT)或者批量导入大量数据的性能表现。其中有测试大量INSERT的TSQL脚本如下:
use myDB
go
createtable t1(id intprimarykeynotnullidentity (1,1),name varchar(200),memo char(500));
go
truncatetable t1
go
declare @i int
set @i=0
declare @beginTime datetime,@endTime datetime
set @beginTime=GETDATE()
while(@i200000)
begin
insertinto t1(name,memo)values('test'+str(RAND()*100000000),'memo'+str(RAND()*100000000))
set @i=@i+1
end
set @endTime=GETDATE()
select @endTime-@beginTime
上面这个脚本测试插入200000行数据需要的时间。这个脚本有问题么?
语法没有问题,但是写法却不够优化。如果你使用performance monitor
来观察,就会发现在数据插入期间log flushes/sec的次数非常高。在我的机器上达到5000。Log flushes发生一次,意味着SQL server 需要写入事务日志(transaction log)一次。每秒5000次的日志写动作导致磁盘大量的写操作。正是这个磁盘写操作影响了上面的batch的性能。我上面脚本在我的机器上使用了大概40秒左右的时间。
如何改进这个脚本的性能呢?如何减少log flushes/sec从而减少磁盘的写操作? 答案是使用Batch Size如下面脚本所示。
truncatetable t1
go
declare @i int
set @i=0
declare @beginTime datetime,@endTime datetime
set @beginTime=GETDATE()
declare @batchSize int
set @batchSize=1000
while(@i00000)
begin
if (@i%@batchSize=0)
begin
if (@@TRANCOUNT>0)COMMITTRAN
BEGINTRAN
end
insertinto t1(name,memo)values('test'+str(RAND()*100000000),'memo'+str(RAND()*100000000))
set @i=@i+1
end
if (@@TRANCOUNT>0)COMMITTRAN
set @endTime=GETDATE()
select @endTime-@beginTime
黄色高亮是我改进的地方。我在同样的机器上跑了一下,奇迹发生了,它只使用了7秒多一点。快了5倍多!如果在看下performance

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SQL中MINUS的用法及具體程式碼範例在SQL中,MINUS是一種用於在兩個結果集之間執行差集操作的運算子。它用於從第一個結果集中刪除與第二個結果集中相同的行。 MINUS操作符傳回的結果集將包含僅存在於第一個結果集中的行。下面透過具體的程式碼範例來示範MINUS的用法:假設有兩個表-"table1"和"table2",它們的結構如下:表名:table1字段

SolutionYes,Wecaninsertnullvaluestoalisteasilyusingitsadd()method.IncaseofListimplementationdoesnotsupportnullthenitwillthrowNullPointerException.Syntaxbooleanadd(Ee)將指定的元素追加到此清單末尾的元素。類型參數E −元素的運行時類型。參數e −要追加到此列表的元

1.開啟wps軟體,進入wps文字的操作介面。 2、在該介面內找到插入選項。 3.點選插入選項,在其編輯區域內找到形狀選項。 4.點選形狀選項,在其子級選單中找到推薦選項。 5、在推薦選項內找到中國地圖選項。 6.點選中國地圖選項,用滑鼠左鍵在編輯輸入區裡拖曳,就得到了我們需要的中國地圖。

如何使用MongoDB實作資料的批次匯入、匯出功能MongoDB是一種NoSQL資料庫,作為一種非關係型資料庫,其在資料儲存和查詢上有著很大的靈活性和效能優勢。對於需要批次匯入和匯出資料的應用場景,MongoDB也提供了對應的工具和介面。本文將介紹如何使用MongoDB實作資料的批次匯入和匯出功能,並提供具體的程式碼範例。一、批次匯入資料在MongoDB中,可

microsoft sql server是Microsoft公司推出的關係型資料庫管理系統,是一個全面的資料庫平台,使用整合的商業智慧(BI)工具提供了企業級的資料管理,具有使用方便可伸縮性好與相關軟體整合程度高等優點。 SQL Server資料庫引擎為關聯式資料和結構化資料提供了更安全可靠的儲存功能,使用戶可以建置和管理用於業務的高可用和高效能的資料應用程式。

如何使用PDO連接到MicrosoftSQLServer資料庫介紹:PDO(PHPDataObjects)是PHP提供的一個存取資料庫的統一介面。它提供了許多優點,例如實作了資料庫的抽象層,可以方便地切換不同的資料庫類型,而不需要修改大量的程式碼。本文將介紹如何使用PDO連接到MicrosoftSQLServer資料庫,並提供一些相關程式碼範例。步驟

SQLServer還是MySQL?最新研究揭秘最佳資料庫選擇近年來,隨著網路和大數據的快速發展,資料庫的選擇成為了企業和開發者面臨的重要議題。在眾多資料庫中,SQLServer和MySQL作為兩個最常見且廣泛使用的關聯式資料庫,備受爭議。那麼,在SQLServer和MySQL之間,到底該選擇哪一個呢?最新的研究為我們揭示了這個問題。首先,讓

隨著互聯網的普及,網站和應用程式的開發成為了許多企業和個人的主要業務。而PHP和SQLServer資料庫則是其中非常重要的兩個工具。 PHP是一種伺服器端腳本語言,可用於開發動態網站;SQLServer是微軟公司開發的關聯式資料庫管理系統,具有廣泛的應用場景。在本文中,我們將討論PHP和SQLServer的開發,以及它們的優缺點和應用方法。首先,讓我們
