SSMS 2012 System.OutOfMemoryException (на стороне клиента) и SQL-запрос (отладочная информация, в том числе)

Немного предыстории: я столкнулся с этим исключением памяти в SSMS 2012, так как оно было выпущено вместе с SQLPrompt от Red Gate (это исключение никогда не происходит в моем SSMS 2008R2 на том же ноутбуке).

Первоначально я ежедневно сталкивался с этими исключениями (SSMS2012 и SQLPrompt), что вынуждает меня закрывать и снова открывать SSMS (вместе со всем, над чем я работал). Несколько месяцев назад я наткнулся на поток поддержки, который указал на возможные дополнения как на причину, поэтому я удалил свое единственное дополнение (SQL Prompt, но не удалил оставшуюся часть пакета разработчика) и провел много месяцев без единого исключения. за исключением исключения System.OutOfMemoryException.

После того, как SP1 был выпущен в 2012 году, я применил его и переустановил SQL Prompt (последнюю версию), чтобы посмотреть, была ли проблема решена, и в течение 7 часов после разработки меня снова встретили печально известной исключительной ситуацией System.OutOfMemoryException.

На протяжении всего этого я открывал заявки в Red Gate и отправлял журналы отладки, где они видят исключение, но, поскольку в памяти нет явного списка SQLPrompt, они не передадут проблему команде разработчиков. Перед этим конкретным исключением SQL Prompt, однако, выбрасывает многочисленные исключения (некоторые из них перечислены ниже) в IDE SSMS 2012 (Visual Studio 2010). Я считаю, что исключение памяти является симптомом проблемы, связанной с тем, как SQL Prompt управляет кэшированными данными и расходует доступную память для SSMS, которая в итоге выдает исключение.

Я узнал, как отложить эту проблему и как ее воспроизвести, и это напрямую связано с двумя переменными:

  1. Подключение и работа с несколькими экземплярами в SSMS (Object Explorer и Query Windows). Т.е. подключено 7 экземпляров, за исключением исключения в течение 2-3 часов.
  2. Возврат наборов результатов из нескольких экземпляров. Это включает запросы, используемые SSMS для возврата информации в IDE, и результаты, возвращаемые в отдельные окна запросов.

Чем больше случаев, когда я подключаюсь к быстрому, возникает исключение, которое заставляет меня в SQL Prompt кэшировать всю информацию об объектах для каждого экземпляра. Как только возникает исключение памяти, ситуация ухудшается, пока SSMS полностью не выйдет из строя (если я не закрою его сначала)

Я хочу узнать, как собрать больше / лучше информации, чтобы отправить ее в Red Gate, чтобы исправить эту проблему. Здесь мне нужна твоя помощь.

Ноутбук: HP Elite book 8440 RAM: 6 ГБ

Текущая ОС: 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)

А вот и исключение памяти:

Исключение, выброшенное в наборе результатов

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-подсказкой.

Спасибо за твою помощь!

3 ответа

В этот момент RedGate наконец-то признал, что проблема заключается в том, что плагин SQL Prompt работает в процессе работы с 32-разрядным клиентом SSMS и в итоге забивает память, что приводит к исключению нехватки памяти.

Их ответ на решение этой проблемы будет "возможно" через год или около того, что, когда вы платите за ежегодную поддержку, является пощечиной. С тех пор я отказался платить за дальнейшую поддержку двух существующих лицензий Tool-belt по этой проблеме, с которой я боролся с 2012 года, пока они не исправят это. Если это влияет на вас, то, если вы можете, сделайте то же самое и проголосуйте за свой кошелек, чтобы мотивировать их сделать это исправление более приоритетным.

Если и когда наступит этот день, я обновлю этот пост с информацией о версии исправленной сборки SQL-приглашения, которая больше не работает в 32-разрядном пространстве памяти SSMS.exe.

Что мне подходит, так это отключение подсказок кода в командной строке SQL, затем я могу выполнить тот же запрос и получить результаты. Затем я могу включить подсказки кода в командной строке SQL, и ошибка не будет отображаться некоторое время.

Можете ли вы попробовать ограничить количество столбцов, как описано в этом посте, и посмотреть, поможет ли это? http://redgate.uservoice.com/forums/94413-sql-prompt-feature-suggestions/suggestions/1364757-disable-sql-prompt-on-certain-databases

Другие вопросы по тегам