Производительность удаления строк ядра SQL Server EF - PullRequest
0 голосов
/ 14 марта 2019

У меня есть простая таблица из 3 столбцов для отслеживания ожидающих расчетов.Первый столбец - это целочисленный внешний ключ, связывающий таблицу клиентов.Второе - дата, а третье - флаг приоритета.Первичный ключ для таблицы - это составная часть клиентского FK и даты.

Эта таблица используется для очереди вычислений, поэтому она видит много оттока.Однако я заметил, что работа с этой таблицей иногда медленнее, чем фактические вычисления, для которых это очередь.В частности, когда в нем около 1000 строк, и в вычислениях происходит короткое замыкание, удаление только одной строки из очереди и вызов SaveChanges занимает в среднем три секунды.

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

Я предполагаю, что виноват композитный ключ ...?Но я не уверен, и я новичок в MS SQL и EF Core.Может ли кто-нибудь указать мне правильное направление для профилирования этого, чтобы определить узкое место?

1 Ответ

1 голос
/ 14 марта 2019

Я бы начал с профилирования приложения через Visual Studio (Debug > Performance Profiler), чтобы увидеть, где на самом деле проблема:

  1. Если вы обнаружите, что вызов SQL на самом деле медленный, я быпродолжить проверку того, какие команды фактически отправляются на сервер SQL, а какие из них занимают так много времени.Используйте ExpressProfiler , расширение SQL Server Profiler для Azure Data Studio или SQL Server Management Studio.Это также может привести к снижению производительности SQL из-за пренебрежительного обслуживания, такого как фрагментированные индексы и т. Д.
  2. Вы также можете обнаружить, что проблема на самом деле где-то в логике EF, например, отслеживание изменений, пытающееся выяснить, чтосущности для обновления.В этом случае вам нужно будет найти способ избежать конкретной проблемы (например, не сохранять после каждого удаления, использовать команду SQL для удаления строк вручную, использовать Dapper вместо EF и т. Д.).

Я надеюсь, что эти идеи помогут вам решить проблему.Удачи; -)

...