Итак, я пытаюсь получить сравнительный тест между CosmosDB и SQL Server.В настоящее время я перегружен базой данных SQL Server, перекачивая таблицу, заполненную тестовыми записями, всего 250 ГБ (да, id является первичным ключом и имеет кластеризованный индекс).Теперь я пытаюсь удалить миллионы записей как можно быстрее, даже сотни миллионов, если смогу (до сих пор мне удавалось делать около 10 миллионов часов в час, используя один поток).
Сначала я создал пул соединений, например:
List<SqlConnection> connectionPool = new List<SqlConnection>();
for (int i = 0; i < connectionPoolSize; i++)
connectionPool.Add(new SqlConnection(myConnString));
Позже я создал список задач и дал каждому из них соединение.Я попытался обойти блокировку таблицы, сохранив количество записей, которые каждая из них удалит, на уровне 4999. Здесь мы приступаем к выполнению задач (я отлаживал другой код, надеюсь, что я даю действительный диапазон идентификаторов строк и отдельный диапазон длякаждая задача - я пропустил этот код):
for (int i = 0; i < connectionPool.Count; i++)
{
Task task = new Task(() => DeleteRows(lowId, highId, dbConnection));
task.Start();
myTaskList.Add(task);
}
Позже я попытался дождаться каких-либо исключений.Тем не менее, каждая задача отображается как выполненная до завершения, ниже не запускается обработчик:
try {
Task.WaitAll( taskList.ToArray());
foreach (Task task in myTaskList)
{
var result = task.Status;
}
}
catch (AggregateException e)
{
Console.WriteLine(e.ToString());
}
А вот метод удаления, который я вызываю в каждой задаче.Он работает, когда я однопоточен, и единственное исключение, которое я когда-либо видел, это тайм-ауты:
static void DeleteRows(long lowId, long highId, SqlConnection connection)
{
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
SqlTransaction transaction = connection.BeginTransaction("Transaction");
var cmd = new SqlCommand(
"delete from myTable where id > " + lowId + " and id < " + highId,
connection,
transaction)
{
CommandTimeout = connection.ConnectionTimeout
};
cmd.CommandTimeout = 300;
cmd.ExecuteNonQuery();
transaction.Commit();
}
Добавление транзакции к вышеупомянутому является новым.Я был вокруг в этой точке.В любом случае, это не работает.