SSMS 2012 System.OutOfMemoryException(客户端)和SQL提示符(调试信息包含)

时间:2013-02-06 20:49:51

标签: sql ssms redgate ssms-2012 red-gate-sql-prompt

一些背景:我在SSMS 2012中遇到了这个内存异常,因为它与Red Gate的SQLPrompt一起发布(在同一台笔记本电脑上我的SSMS 2008R2中不会发生这种异常)。

我最初每天都遇到这些异常(SSMS2012和SQLPrompt),这迫使我关闭并重新打开SSMS(以及我正在处理的所有事情)。几个月前,我偶然发现一个支持线程,指出可能的附加组件是因为我卸载我唯一的附加组件(SQL提示符,但没有卸载开发人员的其余软件包)并且去了很多个月没有一个例外,更不用说System.OutOfMemoryException异常了。

在2012年发布SP1后,我应用它并重新安装了SQL Prompt(最新版本)以查看问题是否已得到解决,并且在开发时间的7小时内,我再次受到臭名昭着的System.OutOfMemoryException的欢迎。 / p>

通过所有这些,我一直在使用Red Gate打开票证并在他们看到异常的情况下提交调试日志,但由于内存异常没有明确列出SQLPrompt,因此他们不会将问题上报给开发团队。在此特定异常之前,SQL Prompt在SSMS 2012 IDE(Visual Studio 2010)中抛出了许多异常(下面列出了一些异常)。我相信内存异常是SQL Prompt如何管理缓存数据以及为SSMS占用可用内存的问题的症状,最终会导致异常。

我已经学会了如何推迟这个问题以及如何重现它,它与两个变量直接相关:

  1. 连接并处理SSMS中的多个实例(对象资源管理器和查询窗口)。即连接到7个实例在2-3小时内净化了异常。
  2. 从多个实例返回结果集。这包括SSMS用于将信息返回到IDE并将结果返回到各个查询窗口的查询。
  3. 我连接的越多实例越快引发异常,这导致SQL Prompt缓存每个实例的所有对象信息。一旦引发内存异常,情况就会降低,直到SSMS完全崩溃(除非我先关闭它)。

    我所追求的是如何收集更多/更好的信息以提交给Red Gate来纠正这个问题。这是我需要你帮助的地方。

    笔记本电脑:惠普精英版8440 内存:6GB

    目前的操作系统: Win 7 Enterprise Ed Sp1

    以下是SQL Prompt引起的一些异常:

    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)
    

    这是内存异常:

    Exception thrown in result set

    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时会发生内存异常

    感谢您的协助!

2 个答案:

答案 0 :(得分:0)

对我有用的是在SQL提示符中禁用代码建议,然后我可以运行相同的查询然后获取结果。 然后我可以在SQL提示符中启用代码建议,错误会暂时停止。

答案 1 :(得分:-1)

您是否可以尝试按照此文章中的说明限制列数,看看它是否有帮助? http://redgate.uservoice.com/forums/94413-sql-prompt-feature-suggestions/suggestions/1364757-disable-sql-prompt-on-certain-databases