SQL Удалить одну строку с помощью PK очень медленно - PullRequest
0 голосов
/ 06 ноября 2018

В нашем приложении мы можем отменить создание только что созданной задачи. В качестве примера мы бы выпустили следующее удаление:

delete from task where taskid = 290313

Это очень медленно и может занять до 30 секунд.

Десятки таблиц имеют внешний ключ для Task, и TaskId индексируется во всех них.

Глядя на план выполнения, я вижу много сканирований индекса (без поиска), которые читают все записи в индексе. enter image description here

Почему вместо поиска используется полное сканирование индекса?

Я в последней версии базы данных SQL Azure.

[EDIT]

Индексы в таблице задач:

enter image description here

План запроса здесь: https://www.brentozar.com/pastetheplan/?id=SJtzfNyp7

Вот результат статистики Live Query, мы ясно видим время, потраченное на индексное сканирование: enter image description here

1 Ответ

0 голосов
/ 07 ноября 2018

Я удалил и заново создал все внешние ключи без каскадного удаления. Теперь план выполнения использует эффективный индексный поиск для проверки RI на всех FK.

Не уверен, почему включение каскадного удаления вызвало сканирование индекса ...

...