2016-07-18 4 views
0

これは有効な質問でもわかりません。しかし、私は自分の状況を説明し、あなたのような専門家から答えを得るだろう。DB /テーブルレベルでロックを適用することは可能ですか?

MS Dynamicsがインストールされています。私たちは非常に遅いパフォーマンスを観察しています。 GoogleではAPPログサーバーを検討しています。我々はここで

を「10.secondsしきい値を超えクエリ実行時間」について第二あたり4-5警告メッセージに気付いているはエラーと関連するクエリの例です。 クエリーの実行時間が27.7秒で、しきい値が10秒を超えました。スレッド:109;データベース:Main_MSCRM;私はSQLレベルでこのクエリを実行すると

select 
top 5001 "systemuser0".QueueId as "queueid" 
, "systemuser0".CreatedBy as "createdby" 
, "systemuser0".Address1_Latitude as "address1_latitude" 
, "systemuser0".Address2_StateOrProvince as "address2_stateorprovince" 
, "systemuser0".Address1_County as "address1_county" 
, "systemuser0".Address2_Country as "address2_country" 
, "systemuser0".Address2_PostOfficeBox as "address2_postofficebox" 
, "systemuser0".PreferredPhoneCode as "preferredphonecode" 
, "systemuser0".new_RegistrationNumer as "new_registrationnumer" 
, "systemuser0".YammerUserId as "yammeruserid" 
, "systemuser0".Title as "title" 
, "systemuser0".SetupUser as "setupuser" 
, "systemuser0".FirstName as "firstname" 
, "systemuser0".EmployeeId as "employeeid" 
, "systemuser0".Address1_Line2 as "address1_line2" 
, "systemuser0".Address1_City as "address1_city" 
, "systemuser0".YomiFirstName as "yomifirstname" 
, "systemuser0".ExchangeRate as "exchangerate" 
, "systemuser0".Address1_ShippingMethodCode as "address1_shippingmethodcode" 
, "systemuser0".YomiMiddleName as "yomimiddlename" 
, "systemuser0".Address2_Line2 as "address2_line2" 
, "systemuser0".DefaultFiltersPopulated as "defaultfilterspopulated" 
, "systemuser0".ModifiedOnBehalfBy as "modifiedonbehalfby" 
, "systemuser0".Address2_Line3 as "address2_line3" 
, "systemuser0".DefaultMailboxName as "defaultmailboxname" 
from 
SystemUser as "systemuser0" 
where 
(("systemuser0".IsDisabled = 0)) order by 
"systemuser0".SystemUserId asc 

さて、結果は2秒未満で思い付きました。 私の混乱はなぜCRMフロントエンド側に時間がかかるのですか? CRMフロントエンドでのデータレンダリングに要する時間以外に、私は何も考えられません。

私の2番目の混乱は、このクエリを実行するときと、クエリ自体にロックを持たない警告メッセージを受け取っていたときの両方です。

私が考えているのは、DBレベルで適用されるロジックと、DBがデフォルトで保持するクエリヒットを書き込むことです。

でも可能ですか?これらの警告メッセージを取り除く方法を教えてください。

ありがとうございました。

+0

すべてにノーロックを適用するのは悪い考えです。データベースをプロファイリングして、ロックを特定し、高価なクエリが何であるかを確認し、敷物の下でそれを磨くのではなく、問題の根に到達する方が良いでしょう。 – Tanner

+0

これは意味があります、私はその特定のDBでデータプロファイリングをしました。私は何千もの "Lock Acquired"と "Lock Released"を1分間だけ得た。それを分析するというあなたの考えに基づいて、私の次のステップになるはずです! – user2040021

+0

これにはREAD UNCOMMITTEDの分離レベルを使用できますが、そうしないことを強くお勧めします。もちろん、重複した行や行が見つからない場合は無作為に選択してください。言い換えれば、ほとんどの場合、大部分が正確な結果を得てクールであれば大丈夫かもしれません。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

答えて

0

クエリを実行すると、at SQL level SQL Serverコンソールから直接実行するかどうかわかりませんが、on CRM Front end sideを実行すると時間がかかるように見える理由についていくつかの洞察を提供できると思います。 SQL Serverから直接クエリを実行すると、ほとんどの場合、データベースへのアクティブな接続が既に確立されています。つまり、接続を確立するまで待つ必要はなく、2人の大量の人がクエリの実行を待っていて、結果セットを受け取るのを待っていることを意味します。

ただし、CRMフロントエンドからクエリを実行すると、クエリを開始する前に接続を確立する必要があると考えられます。接続の設定には、思ったより長くかかることがあります。

これで良いテストを実行できます。CRMフロントエンドからクエリを2回連続して実行し、それぞれの実行時間を計時します。 2番目のクエリがはるかに高速で実行されている場合、SQL Serverとの接続を確立するコストを発見した可能性があります。

+0

不正なクエリプランもあります – Tanner

+0

あなたは絶対に正しいですが、あなたにはダイナミクスに現在住んでいる300人以上のユーザーがいます。今私は上記の投稿したクエリのユーザーを探して、そのユーザーに移動し、再度全体のプロセスを繰り返す方法があります。 Appログでは、ユーザーに関する情報は読み込まれません。 – user2040021

+0

この警告メッセージを特定のユーザーに関連付ける方法はありますか?そのユーザーには、Timが言及したとおり正確に彼が検索していたものを見つけて、2つの異なるブラウザから同じことを要求することができます。 – user2040021

0

おそらく、私たちは通常、ado.netでコマンドがタイムアウトしたときに私たちが得るのと同じ有名な問題ですが、Management Studioでうまく動作します。私はそこにいくつかの修正があると思いますが、あなたは、クエリの上にコントロールを持っていないので、私は強くクエリ実行プランを実行している推薦する質問

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 
+0

これを試してみましょう。 – user2040021

0

にDB上のこれらの2つのコマンドを試してみてください、それはよなるようにインデックスを追加してクエリを改善できるかどうかを教えてください。

また、なぜ5kレコードを一度に取得しようとしていますか?それはカスタムコードなどから生成されますか? CRMビューはそれよりも少ない、つまり50-200のレコードです。非常に多くのレコードを一度に取り出すことで、データベースロックの可能性が高まります。

+0

あなたはその場でジョーディの右です。それはカスタムコードです。 SQL Serverでクエリを実行すると、わずか27行しか得られません。このクエリは常にTOP 5001を持つCRMから生成されていますが、私はその理由についてもわかりません。私はそれを行う方法を知らないCRMの人ではないので、私はそれを取るしたいと思います。 – user2040021

関連する問題