В простой тестовой программе я запускаю транзакцию, создаю таблицу #temp и два индекса, вставляю в таблицу кучу строк и фиксирую.
Наблюдая за записью ввода-вывода диспетчера задач для Sql Server, я вижу, что для каждой вставки таблицы выполняется 1 запись на диск. Это меня удивляет, потому что таблицы #temp не подлежат восстановлению, поэтому нет необходимости в записи или ведении журнала, если только нет нехватки памяти, и даже если это необходимо зарегистрировать, я ожидаю минимальное количество операций записи в журнал, а не 1 на вставку. . Вместо этого с 20 000 вставок я получаю 20 000 операций ввода-вывода.
У движка много памяти и нет давления со стороны других приложений.
Можно ли здесь уменьшить количество операций ввода-вывода?
Вот суть кода (распоряжается и т. д. удалено для краткости)
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();
sys.dm_io_virtual_file_stats
- person Martin Smith   schedule 21.10.2014