Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,Linq2SQL:CommandTimeout应该是多长时间,应该设置在哪里?_C#_Sql Server_Linq To Sql_Timeout_Command - Fatal编程技术网

C#,Linq2SQL:CommandTimeout应该是多长时间,应该设置在哪里?

C#,Linq2SQL:CommandTimeout应该是多长时间,应该设置在哪里?,c#,sql-server,linq-to-sql,timeout,command,C#,Sql Server,Linq To Sql,Timeout,Command,我们正在使用C#和Linq2SQL从数据库中获取一些报表的数据。在某些情况下,这需要一段时间。超过30秒,这似乎是默认的CommandTimeout 因此,我想我必须启动命令超时。但问题是,多少钱?仅仅把它设定得很高是不好的吗?如果一个客户试图做一些事情,只是因为他碰巧在数据库中拥有比普通客户多得多的数据,而他因为超时而无法获得报告,这不是很糟糕吗?但我怎么知道这可能需要多少时间呢?有没有办法把它设为无穷大?还是认为这很糟糕 我应该把它放在哪里?我有一个静态数据库类,它在我需要时为我生成一个新的

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

因此,我想我必须启动
命令超时
。但问题是,多少钱?仅仅把它设定得很高是不好的吗?如果一个客户试图做一些事情,只是因为他碰巧在数据库中拥有比普通客户多得多的数据,而他因为超时而无法获得报告,这不是很糟糕吗?但我怎么知道这可能需要多少时间呢?有没有办法把它设为无穷大?还是认为这很糟糕

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


过高的
ConnectionTimeout
当然会更烦人。但是否存在用户/客户希望某些内容超时的情况?SQL server是否可以冻结,使命令永远无法完成

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

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

我不会把它设为无穷大。。。我不认为写一份报告要花很长时间。选择一个对报告有意义的数字


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

IMHO,用户设置ConnectionTimeout值的高级选项比您确定的任何常量值都要好。

默认情况下,主键上会有一个聚集索引。我发现了以下脚本(我认为它是在msdn上的),它将生成代码来创建SQL server认为有用的任何索引(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
//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;