2010-09-29 23 views
2

我一次向表中插入大約400行(SQL Server 2008)。我試過UNION ALL,但是這大大減緩了事情的速度。我定居在下面的查詢:如何加速多行插入到SQL服務器?

INSERT INTO table VALUES (a, b,...),(c, d,...),...(x,y,...); 

當我通過ODBC使這個查詢大約需要400毫秒(我使用C++和時間一次調用SQLExecDirect的去ODBC32.DLL)。但是,當我在MS SQL Server Management Studio中運行由Getdate()包裝的查詢時:

SELECT Getdate() 
INSERT INTO ... 
SELECT Getdate() 

它需要~10ms。爲了比較,在同一臺機器上,MySQL中的相同查詢需要大約20ms。

  1. SELECT Getdata()是一種確定事務處理時間的可靠方法嗎?
  2. 爲什麼MS SQL Server Management Studio如此之快?
  3. 我該怎麼做才能改善性能?任何ODBC的替代品?直接連接到SQL服務器?
+0

SSMS查詢看起來很快的原因是因爲我多次發送完全相同的查詢。只需更改原始查詢中的一個字母,即可再次運行「SQL Server分析和編譯」,並且執行速度降至非常接近ODBC的速度。 – ihamer 2010-09-30 17:05:46

回答

0

第一個連接通常需要一段時間才能設置。這可以解釋一個初始延遲:在SSMS中,當您開始查詢時,連接已經就位。嘗試從同一個C++程序中插入兩次,看看是否有所作爲。

另外:你使用的是什麼ODBC驅動程序?對於ODBC,請考慮本機驅動程序:

Driver={SQL Server Native Client 10.0};Server=myServerAddress; 
    Database=myDataBase;Uid=myUsername;Pwd=myPassword; 

而不是ODBC,也可以通過COM使用ADO。使用生成的包裝器很容易。然後你可以使用OLE DB連接:

Provider=SQLNCLI10;Server=myServerAddress; 
    Database=myDataBase;Uid=myUsername; Pwd=myPassword; 
+0

將驅動程序更改爲SQL Server Native Client 10.0並不會影響性能。似乎所有時間都花在「SQL Server分析和編譯時間」上,我認爲這是發生在服務器上的操作。我不確定SQL服務器在做什麼,但花費400毫秒來解析和編譯40kb的文本似乎有點長。 – ihamer 2010-09-30 19:11:27

0

你是基準測試的方式,你沒有捕獲編譯時間。這樣做:

SET STATISTICS TIME ON 
GO 
INSERT INTO ...