在一個簡單的測試程序中,我啓動一個事務,創建一個#temp表和兩個索引,在表中插入一堆行,並提交。爲什麼每個插入一個I/O到臨時表中? sql server
看着任務管理器I/O寫入Sql Server,我發現每個表插入有1個磁盤寫入。這令我感到驚訝,因爲#temp表格不可恢復,所以除非存在內存壓力,否則不需要編寫或日誌記錄,即使需要記錄日誌,我也希望進行最少量的日誌寫入操作,而不是每次插入1次。相反,使用20,000個插入,我可以獲得20,000個I/O。
引擎有很多內存,沒有來自其他應用程序的壓力。
這裏可以減少I/O數量嗎?
下面的代碼的(處置等爲簡潔移除)主旨
var conn = new SqlConnection("my connection string");
conn.Open();
tran = conn.BeginTransaction();
var cmd = new SqlCommand("create table #sqltt(Context int, intValue int, stringValue varchar(100))", conn, tran))
cmd.ExecuteNonQuery();
// repeat the above sqlcmd pattern to create two indexes on the table
// then
cmd = new SqlCommand("INSERT INTO #sqltt (Context, intValue) VALUES ('-1', @intValue)", conn, tran))
var parm = cmd.CreateParameter();
parm.DbType = DbType.Int32;
parm.Direction = ParameterDirection.Input;
parm.ParameterName = "intValue";
for (var i = 0; i < HOWMANY; i++)
{
parm.Value = i;
cmd.ExecuteNonQuery();
}
tran.Commit();
conn.Close();
您究竟確定了寫入次數?事實上,你應該會看到比這裏的查詢少得多的IO。 – usr 2014-10-20 21:02:43
檢查進程監視器或'sys.dm_io_virtual_file_stats' – 2014-10-20 22:09:40
啊,謝謝你,馬丁,揭示了我的錯誤。我使用每個Sql Server的任務管理「I/O Writes」進行測量,但該計數器包含所有I/O,包括網絡。 (我知道這一次!)使用進程監視器,我看到27次寫入日誌文件,總計大約1.4MB,這是每個插入行平均75字節,這似乎是合理的。發佈作爲答案,我會接受它。 – 2014-10-21 02:00:52