SQLServer try catch performance


9

Кто-нибудь нашел повышение производительности/tradoff при использовании BEGIN TRY..END TRY в SQL Server 2008, против старого IF @@ ERROR <> 0? Просто любопытно узнать, есть ли штрафы за производительность или нет.

2

Это старый вопрос, но в 2012 году Аарон Bertrand написал подробную статью Performance impact of different error handling techniques, где он по сравнению несколько подходов к работе с исключениями в SQL Server, и я думал, что это стоит упомянуть об этом здесь.

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

  • Просто дайте двигателю справиться с этим, и пузырь любое исключение обратно вызывающему.
  • Используйте BEGIN TRANSACTION и ROLLBACK, если @@ERROR <> 0.
  • Используйте TRY/CATCH с ROLLBACK в блоке CATCH (SQL Server 2005+).

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

Его выводы:

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

Это карта из статьи:

summary

CheckInsert | Checks `IF EXISTS` first | Simple `INSERT` 
CheckRollback | Checks `IF EXISTS` first | Use `IF @@ERROR <> 0` 
CheckTryCatch | Checks `IF EXISTS` first | Use `TRY CATCH` 
JustInsert  |       | Simple `INSERT` 
JustRollback |       | Use `IF @@ERROR <> 0` 
JustTryCatch |       | Use `TRY CATCH` 
  0

Эй, там. Я не уверен, что вы делаете. Если вы предполагаете, что в дополнение к TRY ... CATCH люди также делают проверки в первую очередь, то это не имеет значения, поскольку оно относится ко всем возможным сценариям, и должно быть очевидно, по крайней мере, профессионалам DB, что выполнение простого чтения - это меньше работы чем писать в журнал, а затем делать больше работы для управления ROLLBACK. Если вы говорите, что делаете чек, а не используете TRY ... CATCH, то это опасное недоразумение теста, который не говорит о том, почему мы используем обработку исключений в первую очередь. 14 фев. 162016-02-14 20:35:54

  0

@srutzky, в этой статье сравниваются различные варианты, а не только те, которые заданы в этом вопросе. Вы можете увидеть на графике производительность 'TRY ... CATCH' против' IF @@ ERROR <> 0'. В случае, если многие откаты «TRY ... CATCH» намного лучше, не хуже, как вы думали. 14 фев. 162016-02-14 22:20:51

  0

Эта статья в основном бессмысленна. Это действительно только сдерживает абсурдный сценарий не делать предварительной проверки. Поэтому игнорируйте тесты «Just *». Сколько операций является действием одной строки? Кто допустил бы ошибку в подходах на основе набора, когда откат может занять несколько минут? И тест не распространяется на реальное использование «TRY ... CATCH», помещая в него 'IF EXISTS'. Сценарий «All Fail» интересен, но непрактичен, потому что этого никогда не произойдет, и он пропускает все 3 варианта, поэтому не сравнивает их. Это показывает, что «TRY ... CATCH» является третьим в 6 тестах, которые здесь касаются. 15 фев. 162016-02-15 17:44:00

  0

И, наконец, при тестировании более вероятного сценария размещения 'IF EXISTS' внутри' TRY ...CATCH') в порядке, поскольку предварительная проверка не является основной причиной обработки ошибок, что является проблемой в этой статье. Мы используем обработку ошибок, потому что мы не можем предварительно проверить все возможные ошибки. Могут быть ошибки разрешений, взаимоблокировки и т. Д. Мы используем TRY ... CATCH, потому что это лучший способ контролировать процесс, когда происходят непредсказуемые ошибки, особенно в рамках вложенных сценариев. Пожалуйста, см. Мой ответ здесь, чтобы посмотреть, что я имею в виду: http://dba.stackexchange.com/a/93265/30859 15 фев. 162016-02-15 17:54:08


3

С SQL 2005 вы должны попытаться использовать способ TRY CATCH для обработки исключений или регистрации ошибок. Это считается лучшей практикой. Использование этого не должно иметь большой производительности.

BEGIN TRY 
    BEGIN TRANSACTION 
    -- SQL 
    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    ROLLBACK 
    SELECT 
     ERROR_MESSAGE(), 
     ERROR_NUMBER() -- etc 
END CATCH 
  0

Он спросил об относительной производительности ... 22 фев. 092009-02-22 08:26:47


4

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

  0

Производительность 'TRY ... CATCH' и' IF @@ ERROR <> 0' несколько отличается. Но, что более важно, существует значительная разница, если вы пытаетесь предотвратить ошибку в первую очередь. Аарон Бертран показал это в подробной статье [Влияние эффективности различных методов обработки ошибок] (http://sqlperformance.com/2012/08/t-sql-queries/error-handling). Я поставил ответ ниже сводки своих выводов. 13 фев. 162016-02-13 00:05:17


1

Забудьте о производительности, это проклятый взгляд более безопасный, лучше и более предикат.

Однако при использовании @@ ERROR обычно требуется GOTO и/или много операторов IF для правильного управления им, поэтому я предполагаю, что в TRY..CATCH может быть небольшой импульс.

+1

Согласовано. Производительность не является основной задачей здесь, учитывая, насколько лучше построить T-SQL 'TRY' /' CATCH' для тестирования '@@ ERROR' после каждого утверждения. Хотя при использовании 'TRY' /' CATCH 'наблюдается небольшой выигрыш в производительности, это приемлемая цена, учитывая другие преимущества. 05 окт. 152015-10-05 15:34:44

  0

@srutzky. Тем не менее, если вы после исполнения, имейте в виду, что производительность «TRY ... CATCH» и «IF @@ ERROR <> 0' несколько отличается. Но, что более важно, существует значительная разница, если вы пытаетесь предотвратить ошибку в первую очередь. Аарон Бертран показал это в подробной статье [Влияние эффективности различных методов обработки ошибок] (http://sqlperformance.com/2012/08/t-sql-queries/error-handling). Я поставил ответ ниже сводки своих выводов. 13 фев. 162016-02-13 00:06:22

  0

@VladimirBaranov Эта статья не имеет отношения к этому Вопросу. Разумеется, существует значительная экономия во избежание необходимости отката назад. Это предполагается и не нужно указывать. Но вам все равно нужна обработка ошибок, а 'TRY ... CATCH' намного лучше, чем тестирование @ @ ERROR <> 0', даже если' TRY ... CATCH' немного медленнее. 14 фев. 162016-02-14 20:45:18


0

Выполнение TRY ... CATCH, скорее всего, немного больше, когда ошибок нет. С другой стороны, во многих случаях это будет быстрее, если есть ошибка.

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

Кроме того, Try ... Catch делает код немного проще в обслуживании, особенно если ваша команда разработчиков SQL не была вокруг SQL Server очень долго, что, к сожалению, происходит слишком часто. Я полагаю, что это будет более чем через несколько лет.


-3
  0

Он специально спросил о SQL Server; Статьи C# здесь не актуальны. 21 ноя. 132013-11-21 04:36:10