SQL Server - есть ли лучшая альтернатива для повышения производительности длительной транзакции с большим количеством вставок? - PullRequest
3 голосов
/ 22 марта 2012

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

Сказав это, очевидная проблема заключается в том, что операторы вставки (вместе с некоторыми дополнительными операторами манипуляции) находятся внутри транзакции, что делает ее действительно длительной транзакцией. Это выполняется в течение 30 секунд и часто приводит к тайм-ауту или блокирует другие запросы.

Транзакция требуется для атомарности. Есть ли лучший способ разделить транзакцию и при этом сохранить последовательность? Или какие-то другие способы улучшить текущую ситуацию?

Ответы [ 2 ]

5 голосов
/ 22 марта 2012

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

Вам следует рассмотреть возможность использования уровня изоляции на основе версий ака.SNAPSHOT, потому что при уровнях изоляции на основе версий строк чтения не блокируют записи, а записи не блокируют чтения.Я бы начал с включения READ_COMMITTED_SNAPSHOT и протестировал его:

ALTER DATABASE [...] SET READ_COMMITTED_SNAPSHOT ON;

Я рекомендую прочитать статью, на которую даны ссылки для объяснения последствий и компромиссов, подразумеваемых версионированием строк.

1 голос
/ 22 марта 2012

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

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

  2. Добавление индексов покрытия. Эти индексы содержат дополнительные столбцы в дополнение к столбцам поиска, и они позволяют определенному запросу вообще избегать поездки в таблицу. Это особенно эффективно, когда таблица широкая, а индекс покрытия узкий, но ее также можно использовать, чтобы избежать проблем блокировки между UPDATE и SELECT для разных столбцов одних и тех же строк.

  3. Денормализация. Например, переключение некоторых запросов для доступа к индексированным представлениям в отличие от физических таблиц или вторичных таблиц, снабженных триггерами при обновлении первичных таблиц. Это дорогостоящие и обоюдоострые методы, и их следует рассматривать только для устранения проверенных узких мест.

Вносите только те изменения, когда измеренное ускорение очень велико, поскольку ни один из этих методов не предоставляется бесплатно с точки зрения производительности. Никогда не оптимизируйте, не проводя измерения производительности на каждом этапе.

Это следующее тривиально, но давайте упомянем это для полноты - обновляйте статистику (ANALYZE, UPDATE STATISTICS, ... согласно вашему движку базы данных), как во время анализа планов выполнения, так и в производственное использование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...