2

一部のレポートのデータベースからデータを取得するために、C#とLinq2SQLを使用しています。場合によっては、これには時間がかかります。30秒以上。これがデフォルトのようですCommandTimeout

だから、私はアップする必要があると思いCommandTimeoutます。しかし、問題は、いくらですか?非常に高く設定するのは悪いですか?顧客が何かをしようとしていて、タイムアウトのためにレポートを取得できなかった平均的な顧客よりもデータベースに多くのデータがあるという理由だけで、それは悪いことではないでしょうか。しかし、どのくらいの時間がかかる可能性があるかをどうやって知ることができますか?無限大に設定する方法はありますか?それともそれは非常に悪いと考えられていますか?

そして、どこに設定すればよいですか?必要なときに新しいデータコンテキストを生成する静的データベースクラスがあります。新しいデータコンテキストを作成するたびに定数を作成して設定できますか?または、ユースケースに応じて異なる値に設定する必要がありますか?まったく時間がかからないものに対して高いタイムアウトを設定するのは悪いことですか?それとも本当に重要ではありませんか?

もちろん、高すぎるConnectionTimeoutとさらに煩わしくなります。しかし、ユーザー/顧客が何かをタイムアウトさせたい場合はありますか?SQLサーバーをフリーズして、コマンドが終了しないようにすることはできますか?

4

4 に答える 4

4

CommandTimeoutなどは、実際には、特定のシナリオごとにのみ増やす必要があります。これにより、予期しない長いブロッキングなどのシナリオ(またはさらに悪いことに:検出されないデッドロックシナリオ)を回避できます。どのくらいの高さですか...クエリにはどのくらい時間がかかりますか?ヘッドルームを追加すれば、答えが得られます。

もちろん、もう1つ行うことは、クエリにかかる時間を短縮することです。これは、通常はインデックス作成戦略のチェックと組み合わせて、sproc内の一部のTSQLを手動で最適化すること、および非正規化やその他のスキーマ変更などのより大きな変更を意味する場合があります。これにはデータウェアハウス戦略も含まれる場合があるため、レポート用に最適化されたスキーマを使用して、負荷を(トランザクションデータから離れた)別のデータベースにシフトできます。多分スタースキーマ。

私はそれを無限大に設定しません...私はそれがレポートを実行するのに永遠にかかるとは思っていません。レポートに適した番号を選択してください。

はい、SQL Serverはフリーズして、コマンドが終了しないようにすることができます。オープンブロッキングトランザクションが最も簡単です...2つ取得すると、デッドロックが発生する可能性があります。通常、システムはローカルデッドロックを検出しますが、特にDTCが関与している場合(つまり、非ローカルロック)は常にではありません。

于 2009-05-14T07:06:41.400 に答える
0

IMHO、ユーザーがConnectionTimeout値を設定するための高度なオプションは、決定した定数値よりも優れています。

于 2009-05-14T07:13:00.373 に答える
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 に答える
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 に答える