5

背景: Red Gate の SQLPrompt と組み合わせてリリースされて以来、SSMS 2012 内でこのメモリ例外が発生しています (この例外は、同じラップトップの SSMS 2008R2 では発生しません)。

私はもともとこれらの例外 (SSMS2012 および SQLPrompt) に毎日遭遇していたため、SSMS を閉じて再度開く必要がありました (私が取り組んでいたすべてのことと共に)。数か月前、アドオンの可能性が原因であると指摘するサポート スレッドに出くわしたので唯一のアドオン (SQL プロンプト、ただし開発者のバンドルの残りの部分はアンインストールしませんでした) をアンインストールしました。 System.OutOfMemoryException 例外を減らします。

2012 年の SP1 がリリースされたら、それを適用し、SQL Prompt (最新バージョン) を再インストールして、問題が解決されたかどうかを確認しました。開発時間の 7 時間以内に、悪名高い System.OutOfMemoryException が再び発生しました。

このすべてを通して、私は Red Gate でチケットを開き、例外が表示されたデバッグ ログを送信しましたが、メモリ例外には SQLPrompt が明示的にリストされていないため、開発チームに問題をエスカレートしません。ただし、この特定の例外の前に、SQL プロンプトは SSMS 2012 IDE (Visual Studio 2010) 内で多数の例外 (以下にリストされている) をスローしています。メモリ例外は、SQL Prompt がキャッシュされたデータを管理し、結果として最終的に例外をスローする SSMS の使用可能なメモリを消費する方法に関する問題の兆候であると思います。

この問題を延期する方法と再現する方法を学びました。これは 2 つの変数に直接関係しています。

  1. SSMS で複数のインスタンスに接続して作業する (オブジェクト エクスプローラーとクエリ ウィンドウ)。つまり、7 つのインスタンスに接続すると、2 ~ 3 時間以内に例外が発生しました。
  2. 複数のインスタンスから結果セットを返す。これには、IDE に情報を返すために SSMS によって使用されるクエリと、個々のクエリ ウィンドウに返される結果が含まれます。

接続しているインスタンスが多いほど例外が発生し、SQL プロンプトがインスタンスごとにすべてのオブジェクト情報をキャッシュするようになります。メモリ例外が発生すると、SSMS が完全にクラッシュするまで状況が悪化します (最初に閉じない限り)。

私が求めているのは、この問題を修正するために Red Gate に提出するためのより多くの/より良い情報を収集する方法です。ここであなたの助けが必要です。

ラップトップ: HP Elite book 8440 RAM: 6GB

現在の OS: Win 7 Enterprise Ed Sp1

以下は、SQL プロンプトによって発生する例外の一部です。

System.ArgumentOutOfRangeException "Specified argument was out of the range of valid values."   

Microsoft.VisualStudio.Text.Implementation.BinaryStringRebuilder.GetLineNumberFromPosition(N/A,N/A)
Microsoft.VisualStudio.Text.Implementation.TextSnapshot.GetLineFromPosition(Microsoft.VisualStudio.Text.Implementation.TextSnapshot,N/A)
Microsoft.VisualStudio.Editor.Implementation.VsTextBufferAdapter.GetLineIndexOfPosition(N/A,System.Int32,System.Int32&,System.Int32&)
RedGate.SQLPrompt.CommonVS.Editor.VSScriptProvider.PositionFromIndex(RedGate.SQLPrompt.CommonVS.Editor.VSScriptProvider,System.Int32)
RedGate.SqlPrompt.Metadata.Script.ScriptProviderBase.GetText(RedGate.SQLPrompt.CommonVS.Editor.VSScriptProvider,System.Int32,System.Int32)
RedGate.SqlPrompt.Engine.NewEngine.SqlPromptEngine.GetCandidates(RedGate.SqlPrompt.Engine.NewEngine.SqlPromptEngine,System.Int32)
RedGate.SqlPrompt.Engine.PromptEngineEmulator.get_GetSuggestions(RedGate.SqlPrompt.Engine.PromptEngineEmulator)
RedGate.SqlPrompt.Engine.AutoCompleter.m_FilterChanged(RedGate.SqlPrompt.Engine.AutoCompleter,RedGate.SqlPrompt.Engine.PromptEngineEmulator,System.EventArgs)
RedGate.SqlPrompt.Engine.PromptEngineEmulator.OnFilterChanged(RedGate.SqlPrompt.Engine.PromptEngineEmulator)
RedGate.SqlPrompt.Engine.PromptEngineEmulator.set_Index(RedGate.SqlPrompt.Engine.PromptEngineEmulator,System.Int32)
RedGate.SqlPrompt.Engine.PromptEngineEmulator.set_CaretPosition(RedGate.SqlPrompt.Engine.PromptEngineEmulator,N/A)
RedGate.SQLPrompt.CommonUI.Editor.EditorWindowBase.SetEngineCaretPosition(RedGate.SQLPrompt.SSMSUI.SSMSEditorWindow,N/A)
RedGate.SQLPrompt.CommonUI.Editor.EditorWindowBase.UpdateUIPrompts(RedGate.SQLPrompt.SSMSUI.SSMSEditorWindow)
RedGate.SQLPrompt.CommonVS.Editor.VSEditorWindow.OnTextViewCommandExec(RedGate.SQLPrompt.SSMSUI.SSMSEditorWindow,RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor,RedGate.SQLPrompt.CommonVS.Editor.CommandExecEventArgs)
RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor.AfterCommandExecute(RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor,RedGate.SQLPrompt.CommonVS.Editor.CommandExecEventArgs)
RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor..(RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor.)
RedGate.SQLPrompt.CommonUI.Utils.ErrorDialog.Do(System.Action)
RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor.(RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor,System.Guid&,System.Uint32,System.Uint32,System.IntPtr,System.IntPtr)
RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor..(RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor.,System.Guid&,System.Uint32,System.Uint32,System.IntPtr,System.IntPtr)
Microsoft.VisualStudio.Editor.Implementation.CommandChainNode.Exec(N/A,N/A,N/A,N/A,N/A,N/A)

System.ArgumentException    00:05:14.7510000    "The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))"   

#mMc.#JQub.#OQub(#mMc.#JQub,N/A,System.Uint32,#mMc.#k3ub&)
#mMc.#JQub.#z26.#8Di(#mMc.#JQub.#z26)
RedGate.SQLSourceControl.Engine.SmartAssembly.ExceptionReporting.ErrorReporterBase.Do(RedGate.SQLSourceControl.CommonUI.Forms.ErrorDialog,System.Action,System.Predicate`1<System.Exception>,System.Boolean)
RedGate.SQLSourceControl.Engine.SmartAssembly.ExceptionReporting.ErrorReporterBase.Do(RedGate.SQLSourceControl.CommonUI.Forms.ErrorDialog,System.Action)
RedGate.SQLSourceControl.CommonUI.Forms.ErrorDialog.Do(System.Action)

そして、ここにメモリ例外があります:

結果セットでスローされた例外

System.OutOfMemoryException <null>  

System.Text.StringBuilder.set_Capacity(System.Text.StringBuilder,N/A)
Microsoft.SqlServer.Management.QueryExecution.QEDiskStorageView.set_MaxNumBytesToDisplay(N/A,N/A)
Microsoft.SqlServer.Management.QueryExecution.QEDiskDataStorage.GetStorageView(N/A)
Microsoft.SqlServer.Management.QueryExecution.QEResultSet.StartRetrievingData(Microsoft.SqlServer.Management.QueryExecution.QEResultSet,System.Int32,N/A)
Microsoft.SqlServer.Management.QueryExecution.ResultSetAndGridContainer.StartRetrievingData(N/A,N/A,N/A)
Microsoft.SqlServer.Management.QueryExecution.ResultsToGridBatchConsumer.OnNewResultSet(Microsoft.SqlServer.Management.QueryExecution.ResultsToGridBatchConsumer,N/A,N/A)
Microsoft.SqlServer.Management.QueryExecution.QESQLBatch.ProcessResultSet(Microsoft.SqlServer.Management.QueryExecution.QESQLBatch,N/A)
Microsoft.SqlServer.Management.QueryExecution.QESQLBatch.DoBatchExecution(Microsoft.SqlServer.Management.QueryExecution.QESQLBatch,System.Data.SqlClient.SqlConnection,N/A)
Microsoft.SqlServer.Management.QueryExecution.QESQLBatch.Execute(N/A,N/A,N/A)
Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec.DoBatchExecution(Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec,Microsoft.SqlServer.Management.QueryExecution.QESQLBatch)
Microsoft.SqlServer.Management.QueryExecution.QESQLExec.ExecuteBatchCommon(Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec,N/A,N/A,System.Boolean&)
Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec.ExecuteBatchHelper(N/A,N/A,N/A,N/A)
Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec.ProcessBatch(N/A,N/A,N/A)
.BatchParser.ThunkCommandExecuter.ProcessBatch(N/A,N/A,N/A)

繰り返しますが、明確にするために、他の例外が関連しているかどうかはわかりませんが、メモリ例外は SQL Prompt がインストールされている場合にのみ発生します。

ご協力ありがとうございます。

4

3 に答える 3

0

この時点で RedGate は最終的に、SQL Prompt プラグインが 32 ビット SSMS クライアントとインプロセスで動作し、最終的にメモリをチョークしてメモリ不足の例外が発生するという問題を認めました。

これに対する修正に対する彼らの反応は、1年かそこらで「多分」であり、年間サポートにお金を払っているときは、平手打ちです. それ以来、2012 年以来この問題と戦ってきたこの問題について、既存の 2 つの Tool-belt ライセンスの追加サポートに対する支払いを、彼らが修正するまで拒否しました。これがあなたに影響を与えている場合、そして可能であれば、同じことを行い、ウォレットに投票して、この修正をより高い優先度にするよう動機づけてください.

その日が来たら、SSMS.exe の 32 ビット メモリ空間内で動作しなくなった SQL Prompt の修正されたビルドのバージョン情報で、この回答の投稿を更新します。

于 2015-09-09T22:51:08.467 に答える
0

私にとってうまくいくのは、SQLプロンプトでコードの提案を無効にすることです。その後、同じクエリを実行して結果を取得できます。次に、SQL プロンプトでコードの提案を有効にすると、エラーはしばらく表示されなくなります。

于 2015-05-29T02:42:09.377 に答える
-1

この投稿で説明されているように、列の数を制限してみて、それが役立つかどうかを確認できますか? http://redgate.uservoice.com/forums/94413-sql-prompt-feature-suggestions/suggestions/1364757-disable-sql-prompt-on-certain-databases

于 2013-02-08T15:25:53.667 に答える