SQL-сервер Azure удаляет - PullRequest
       7

SQL-сервер Azure удаляет

0 голосов
/ 01 октября 2019

У меня SQL-сервер с 16130000 строками. Мне нужно удалить около 20%. Когда я делаю простое:

delete from items where jobid=12

берет навсегда.

Я остановил запрос через 11 минут. Выбор данных довольно быстрый, почему удаление происходит так медленно? Выбор 850000 строк занимает около 30 секунд.

Это из-за блокировок таблицы? И вы можете что-нибудь с этим сделать? Я ожидаю, что удаление строк должно быть быстрее, потому что вы не передаете данные по проводам?

Best R, Thomas

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Не сообщая нам, какой размер резервирования вы используете, сложно дать отзыв о том, ожидается ли X записей в Y секундах или нет. Тем не менее, я могу рассказать вам о том, как работает система, чтобы вы могли сделать это определение, проведя собственное расследование. Скорость фиксации журнала ограничена размером бронирования, который вы приобретаете. Удаление в основном ограничено возможностью записывать записи журнала (и реплицировать их на несколько машин в случае смерти вашей основной машины). Когда вы выбираете записи, вам не нужно идти по сети на N машин, и вам может даже не потребоваться переходить на локальный диск, если записи сохраняются в памяти, поэтому обычно ожидается, что выбор будет быстрее, чем вставки / обновления/ удаляет из-за необходимости защитить журнал для вас.

Вы можете прочитать о конкретных ограничениях для различных размеров резервирования здесь: DTU Limits и vCore Limits

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

  • Блокировка - если другие пользователи выполняют операции с таблицей, это может заблокировать выполнение оператора удаления. Вы можете убедиться в этом, посмотрев sys.dm_exec_requests, чтобы увидеть, блокирует ли ваш оператор другие блокировки.
  • Выбор плана запроса. Если вам нужно отсканировать много строк, чтобы удалить небольшую часть, вы можете быть заблокированы на IO, чтобы найти их. Здесь поможет анализ формы плана запроса, так как будет установлено время для статистики (я предлагаю вам изменить запрос на ТОП 100 или аналогичный, чтобы понять, выполняете ли вы много операций логического чтения по сравнению с реальными логическими операциями записи). Это может означать, что ваш макет на диске не оптимален для этой проблемы. Общим решением будет либо выбрать лучшую стратегию индексирования, либо использовать разбиение, чтобы помочь вам быстро отбрасывать группы строк вместо того, чтобы явно удалять все строки.
0 голосов
/ 01 октября 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, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...