Несчастья с параллельной обработкой, C # и SQL Server - Почему я не удаляю записи? - PullRequest
0 голосов
/ 29 мая 2018

Итак, я пытаюсь получить сравнительный тест между 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();
    }

Добавление транзакции к вышеупомянутому является новым.Я был вокруг в этой точке.В любом случае, это не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...