2

我们正在使用 C# 和 Linq2SQL 从数据库中获取一些报告的数据。在某些情况下,这需要一段时间。超过 30 秒,这似乎是默认的CommandTimeout

所以,我想我必须升级CommandTimeout. 但问题是,多少钱?把它设置得很高是不是很糟糕?如果客户试图做某事,只是因为他的数据库中的数据比普通客户多得多,他因为超时而无法输出报告,这不是很糟糕吗?但是我怎么知道它可能需要多少时间呢?有没有办法将它设置为无穷大?或者这被认为是非常糟糕的?

我应该在哪里设置它?我有一个静态数据库类,它会在我需要时为我生成一个新的数据上下文。我可以创建一个常量并在创建新数据上下文时设置它吗?还是应该根据用例将其设置为不同的值?对于根本不需要太多时间的事情有一个高超时是不是很糟糕?还是真的不重要?

太高ConnectionTimeout当然会更烦人。但是是否存在用户/客户希望某事超时的情况?SQL Server 可以冻结以使命令永远不会完成吗?

4

4 回答 4

4

CommandTimeout等确实应该只在每个特定场景的基础上增加。这可以避免意外的长时间阻塞等情况(或更糟糕的是:未检测到的死锁情况)。至于多高……查询需要多长时间?增加一些空间,你就有答案了。

当然,另一件要做的事情是减少查询所花费的时间。这可能意味着手动优化存储过程中的一些 TSQL,通常与检查索引策略相结合,可能还有更大的更改,例如非规范化或其他模式更改。这可能还涉及数据仓库策略,因此您可以将负载转移到单独的数据库(远离事务数据),并使用针对报告进行优化的模式。也许是星型模式。

我不会将它设置为无穷大......我不希望它需要永远运行报告。选择一个对报告有意义的数字。

是的,SQL Server 可以冻结,因此命令永远不会完成。一个开放的阻塞事务将是最简单的......得到两个,你可以死锁。通常系统会检测到本地死锁——但并非总是如此,尤其是在涉及 DTC 的情况下(即非本地锁)。

于 2009-05-14T07:06:41.400 回答
0

恕我直言,您的用户设置 ConnectionTimeout 值的高级选项将比您确定的任何常量值更好。

于 2009-05-14T07:13:00.373 回答
0

默认情况下,主键上会有一个聚集索引。我发现以下脚本(我认为它在 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
于 2009-05-20T15:19:14.003 回答
0
//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;
于 2013-06-06T16:38:50.227 回答