Удаление отдельной записи занимает много минут в SQL - PullRequest
0 голосов
/ 06 августа 2020

У меня есть 1 модульный тест, который вводит пользователя в систему через пользовательский интерфейс, но перед этим он удаляет существующую запись для этого пользователя

У меня есть 3 набора запросов, и каждый набор имеет только 1 запись, которую я хочу delete, но в моем модульном тесте он не выполняет запрос на удаление и возвращает ошибку тайм-аута

Я не знаю, как я могу оптимизировать запрос, если кто-то может помочь в этом

delete from CustomerRoles where RegisteredCustomerId = (select Id from RegisteredCustomers where Email = 'boltestsignupseller@yahoo.com')

 delete from SellerInfos where RegisteredCustomerId = (select Id from RegisteredCustomers where Email = 'boltestsignupseller@yahoo.com')
           
DELETE FROM RegisteredCustomers where Email = 'boltestsignupseller@yahoo.com'

Второй и третий запросы почти занимают более 2 минут и в конечном итоге время ожидания

1 Ответ

1 голос
/ 06 августа 2020

без знания базы данных, это невозможно прокомментировать, но общие причины могут включать:

  • отсутствующий индекс в столбце, который используется для фильтрации (или неиспользуемый индекс - возможно, из-за varchar vs nvarchar, et c)
  • блокировки из-за конфликтующих операций
  • наличия триггеров, выполняющих неограниченное количество дополнительной скрытой работы

Поскольку запросы, похоже, ожидают единственной RegisteredCustomers записи, вы можете , возможно, уменьшить некоторые накладные расходы, захватив найденный Id в локальную переменную в начале и используя этот локальный во всех трех удалениях, но это не волшебная палочка c палочка:

declare @id int = (
    select Id from RegisteredCustomers where Email = 'boltestsignupseller@yahoo.com');
delete from CustomerRoles where RegisteredCustomerId = @id;
delete from SellerInfos where RegisteredCustomerId = @id;
delete from RegisteredCustomers where Id = @id;

Тем не менее, скорее всего, вам нужно будет на самом деле исследовать, что происходит план запроса, посмотрите статистику ввода-вывода, посмотрите на индексирование et c).

Если в таблицах много внешних ключей, и эти внешние ключи плохо проиндексированы, может потребоваться не- тривиальный время для выполнения удаления просто потому, что он должен проделать большую работу, чтобы гарантировать, что удаления не нарушают ссылочную целостность. В некоторых случаях предпочтительнее выполнить логическое удаление , а не физическое удаление, чтобы избежать этой работы - т.е. иметь столбец, который означает удаление, и просто выполнить update ... set DeletionDate = GETUTCDATE() ... where ... вместо delete (но: вам нужно помнить о фильтрации по этому столбцу в ваших запросах).

...