Удалить несколько строк из Большой таблицы SQL Север 2017 - PullRequest
0 голосов
/ 23 января 2020

У меня есть эта многораздельная таблица (test_table) с 900 000 000 строк. Таблица не имеет ключей. Он имеет только 1 кластеризованный индекс для столбца [p_date and email].

Каждый день один процесс запускается из SP, который пытается удалить из этой таблицы.

Delete from test_table 
where userKey = 1
and convert(date, p_date) in (select distinct convert(date, p_date)
                                from    DB5.dbo.[test_table])

Подзапрос выполняется в другой базе данных но он очень быстрый и возвращает сегодняшнюю дату.

после этого удаления есть оператор вставки, который ежедневно вставляет около 70 000 строк. Это быстрее.

Этот SP запускается ежедневно.

Удаление занимает очень долго.

Когда я проверяю sysprocess, я вижу,

enter image description here

на основе только этой информации я могу найти, какой db_id, какая файловая группа и какая таблица и с каким индексом он работает.

Сейчас он работает с файловой группой. Id = 16 из db_id = 7. У нас есть 32 группы файлов. Есть ли способ ускорить выполнение этого удаления?

Это мощная машина с 128 ГБ ОЗУ. В этот раз другие процессы не выполняются. Спасибо.

Ответы [ 2 ]

1 голос
/ 23 января 2020

Удалите предикат non- sargable для p_date, чтобы включить поиск индекса и исключение раздела.

Попробуйте что-то вроде:

Delete from test_table 
where userKey = 1
and p_date >= @start and p_date < @end
option (recompile)

или

Delete from test_table 
where userKey = 1
and p_date >= @start and p_date < dateadd(day,1,@start)
option (recompile)

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

0 голосов
/ 24 января 2020

Другой подход состоит в том, чтобы

  1. получить все данные во временную таблицу.
  2. удалить записи из главной таблицы.
  3. вставить обратно записи из временной таблицы к основному столу, соответствующему указанному диапазону дат.
...