C #, Linq2SQL: как долго должен быть CommandTimeout и где он должен быть установлен? - PullRequest
2 голосов
/ 14 мая 2009

Мы используем C # и Linq2SQL для получения данных из базы данных для некоторых отчетов. В некоторых случаях это занимает некоторое время. Более 30 секунд, что по умолчанию CommandTimeout.

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

А где мне его установить? У меня есть статический класс базы данных, который генерирует новый текстовый текст для меня, когда мне это нужно. Могу ли я просто создать константу и установить ее каждый раз, когда создаю новый текстовый текст? Или следует установить разные значения в зависимости от варианта использования? Разве плохо иметь тайм-аут для чего-то, что вообще не займет много времени? Или это не имеет значения?

Слишком высокий ConnectionTimeout, конечно, может быть более раздражающим. Но есть ли случай, когда пользователь / клиент хотел бы, чтобы время ожидания истекло? Может ли SQL-сервер зависнуть, чтобы команда никогда не заканчивалась?

Ответы [ 4 ]

4 голосов
/ 14 мая 2009

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

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

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

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

0 голосов
/ 06 июня 2013
//If you have an AseCommand object instance....
AseCommand _AseCommand = new AseCommand("procedure_test");

//You can set up the timeout infinite as follows
_AseCommand.CommandTimeout = System.Threading.Timeout.Infinite;
0 голосов
/ 20 мая 2009

Первичные ключи будут иметь кластерный индекс по умолчанию. Я нашел следующий скрипт (я думаю, что он был на MSDN), который будет генерировать код для создания любых индексов, которые SQL-сервер считает полезными (def работает на SQL2008, я думаю, что он был введен в 2005 году):

SELECT 

  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure, 

  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) 

  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'

  + ' ON ' + mid.statement 

  + ' (' + ISNULL (mid.equality_columns,'') 

    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END 

    + ISNULL (mid.inequality_columns, '')

  + ')' 

  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement, 

  migs.*, mid.database_id, mid.[object_id]

FROM sys.dm_db_missing_index_groups mig

INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle

INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle

WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10

ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC
0 голосов
/ 14 мая 2009

ИМХО, расширенный вариант для вашего пользователя, чтобы установить значение ConnectionTimeout было бы лучше, чем любое постоянное значение, которое вы определяете.

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