Удаление больших данных без журналов транзакций в SQL Azure - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу удалить большой объем данных из таблицы Azure SQL, часто используя приведенный ниже код, но при удалении записей будут создаваться журналы транзакций, которые будут использовать хранилище данных базы данных, как мы можем выполнить удаление без журналов транзакций и использования базы данных хранение данных?

                  Task.Run(async () =>
                {
                    long maxId = crumbManager.GetMaxId(fromDate,tenantId);
                    var startingTime = DateTime.UtcNow;
                    while (!cancellationToken.IsCancellationRequested && maxId > 0 && startingTime.AddHours(2) > DateTime.UtcNow)
                    {
                        try
                        {
                            var query = $@"delete top(10000)  from Crumbs  where CrumbId <= @maxId and TenantId =@tenantId ";
                            using (var con = new SqlConnection(connection))
                            {
                                con.Open();
                                using (var cmd = new SqlCommand(query, con))
                                {
                                    cmd.Parameters.AddWithValue("@maxId", maxId);                                       
                                    cmd.Parameters.AddWithValue("@tenantId", tenantId);
                                    cmd.CommandTimeout = 200;
                                    var affected = cmd.ExecuteNonQuery();
                                    if (affected == 0)
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {

                        }
                        finally
                        {
                            await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken.Token);
                        }
                    }
                });

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Вы не можете.Базы данных вносят изменения, используя журнал транзакций, чтобы он мог обрабатывать сбои в середине транзакции.Таким образом, даже операции удаления используют пространство в журнале транзакций.Теперь журнал транзакций занимает только место (при использовании полного восстановления, как SQL Azure для пользовательских баз данных) до следующей операции резервного копирования.Это происходит каждые несколько минут, поэтому время, в течение которого на диске требуется место для журнала, минимально.

Некоторые операции заносятся в журнал минимально и занимают меньше места, чем построчное удаление,Например, если вы делаете усеченную таблицу или меняете раздел из многораздельной таблицы (а затем удаляете его), то вы генерируете гораздо меньше журналов, чем построчно.Вам нужно было бы рассмотреть некоторые конструктивные изменения в вашей схеме, чтобы включить этот шаблон, поскольку сейчас вы не просто удаляете все строки.

В конечном счете, вам следует просто сосредоточиться на том, чтобы убедиться, что операция, которую вы выполняете в SQL Azure,эффективный.если вы перебираете кучу и удаляете K строк снова и снова, это может алгоритмически выполнять много сканирований таблицы вместо сканирования диапазона.Если вы сделаете это, даже не прибегая к каким-либо изощренным подходам к усечению / разбиению, вы сможете улучшить производительность системы по сравнению с тем, что у вас сейчас есть.

Надеюсь, это поможет объяснить, как работает SQL.

0 голосов
/ 03 апреля 2019

Попробуйте использовать методы пакетной обработки , чтобы минимизировать использование журнала.

declare 
       @batch_size int,
       @del_rowcount int = 1

set @batch_size = 100
set nocount on;

while @del_rowcount > 0
       begin
              begin tran
                     delete top (@batch_size)
                     from dbo.LargeDeleteTest

                     set @del_rowcount = @@rowcount

                     print 'Delete row count: ' + cast(@del_rowcount as nvarchar(32))

              commit tran
       end

Удаление любых внешних ключей, удаление строк, а затем воссоздание внешних ключей также может ускорить процесс.

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