Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не могу заставить SSMS отразить план запроса  [new]
Paklich
Member

Откуда:
Сообщений: 29
Добрый день господа,

Уже не первую неделю бьюсь над странной ситуацией с планом запроса в SSMS.
А требуется всего-то для достаточно большого запроса посмотреть его план выполнения. Запрос представляет собой выборку из достаточно жирной табличной функции, которая возвращает около 300 столбцов, внутри этой функции в соединении участвует полтора десятка таблиц. Но я предполагаю, что это все таки не повод отказать себе в удовольствии посмотреть план?

Ситуация следующая: при просьбе отразить предполагаемый план запроса (Ctr+L), возвращается (1 row(s) affected) И ВСЁ.

Не сдаемся, пишем SET SHOWPLAN_XML ON;

получаем ссылку на XML, радостно тыкаем в нее и..получаем ошибку.

"Error loading execution plan XML file C:\Users\....\ExecutionPlan1.sqlplan. (SQLEditors)

------------------------------
ADDITIONAL INFORMATION:

Exception of type 'System.OutOfMemoryException' was thrown. (mscorlib)"

Если сходить по пути и посмотреть на файлик, то видно, что он весит около 90 Mb. Ну не ахти какие объемы все-таки.

И снова не сдаемся, пытаемся посмотреть актуальный план, тыкаем в соответствующую кнопку и запускаем запрос.
Запрос исправно выполняется, но вместо плана на закладке Messages получаю скупую надпись (1 row(s) affected) или Выдано исключение типа "System.OutOfMemoryException".
Самое интересное, что ИНОГДА все же случается чудо, и удается посмотреть этот самый план, но это случается крайне редко, и как правило после перезапуска SSMS. Но это буквально 1 раз из 10.

Вот и возник у меня вопрос, не сталкивался ли кто нибудь с таким же безобразием?
Гуление просторов интернета, особых результатов не дало, такое ощущение, что эта проблем а у меня одного. Но что то мне в это не верится.

Параметры сервака:
Windows Server 2008 R2 Enterprise установлена на виртуалке VmWare.
Оперативки 40 Gb.
Microsoft SQL Server 2012 (SP1) - 11.0.3393.0 (X64)

Все вышеописанные манипуляции осуществляю с клиента. Windows 7, 12 Gb оперативки.
Впрочем, если выполнять манипуляции на сервере там ровно та же картина.

Буду крайне благодарен за какие нибудь идеи или советы.

P.S Кстати, в те редкие моменты когда все же удавалось получить план сего запроса, я его сохранял и пытался открыть в SQL Centry Plan Explorer (7.5.88.0)? но фиг, сия прога просто вылетает с ошибкой.
P.P.S Если загадать студии запросить от функции не все столбцы,которые она способна вернуть, а перечислить десяток другой, то все прекрасно. Но хочется-то лицезреть все в комплексе.
10 фев 14, 18:42    [15547871]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а если попробовать выудить план из системных представлений ? Хотя 90 мб плана.... не разу не пробовал
кстате ,40 мб xmla студией не открываеться тоже
10 фев 14, 18:48    [15547891]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
Paklich
Member

Откуда:
Сообщений: 29
Maxx,
пробовал, безрезультатно. выполнил нехитрый запрос
SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)

так вот для интересующих меня запросов в колонке query_plan стоит NULL. Что в принципе меня повергает в недоумение, запрос то выполнился успешно, а как мы знаем, без плана запросы не выполняются.
10 фев 14, 19:04    [15547939]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Можно попробовать
а) получить текстовый план
б) вытащить план профайлером
10 фев 14, 19:14    [15547975]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
NickAlex66
Member

Откуда:
Сообщений: 319
Paklich,

Да, без планов никуда. А вот до кеша они могут и не добраться.
10 фев 14, 19:23    [15547996]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
Paklich
Member

Откуда:
Сообщений: 29
invm,
я текстовый если честно не пробовал, но план сего запроса даже в графике трудно объять здоровым мозгом, я даже не хочу представлять что там будет в тексте. Про профайлер мысль хорошая, но боюсь, что если я его из кэша не извлек, то и профайлеру он не дастся? но в любом случае попробую, спасибо.
Меня все таки смущает необходимость таких плясок с бубнами ради стандартной в общем-то процедуры. Или механизм просмотра планов расчитан только на запросы типа select top 100 * from table1?
10 фев 14, 19:32    [15548021]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
Paklich
Member

Откуда:
Сообщений: 29
NickAlex66,
типа оптимизатор подумал, что проще посчитать его еще разок чем забивать кэш такой большой фигней?
10 фев 14, 19:35    [15548027]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
NickAlex66
Member

Откуда:
Сообщений: 319
Paklich,

Тут два варианта:
- вы используете опцию recompile
- давление на RAM настолько велико, что
сиквел выселяет старых квартирантов,
что бы освободить место для новых
ЗЫ: если первое не верно, то проверяйте
настройки инстанса. Возможно ваше железо
не соответствует нагрузке, как вариант.
10 фев 14, 22:54    [15548718]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Paklich,

http://msdn.microsoft.com/ru-ru/library/ms189747(v=sql.105).aspx
При следующих условиях вывод инструкции Showplan не возвращается в столбец query_plan возвращаемой таблицы для функции sys.dm_exec_query_plan.

Если план запроса, определенный использованием аргумента plan_handle, извлекается из кэша планов, столбец query_plan возвращаемой таблицы имеет значение NULL. Например, такое условие может возникнуть при наличии задержки между принятием и использованием дескриптора плана функцией sys.dm_exec_query_plan.

Некоторые инструкции Transact-SQL не кэшируются, к ним относятся инструкции массовых операций, а также инструкции, содержащие строковые литералы размером более 8 КБ. Для таких инструкций нельзя получить представление Showplan в формате XML, используя функцию sys.dm_exec_query_plan, если пакет не выполняется в данный момент, потому что они не существуют в кэше.

Если пакет Transact-SQL или хранимая процедура содержат вызов определяемой пользователем функции или динамической инструкции SQL, например при помощи EXEC (string), скомпилированная инструкция Showplan в формате XML для определяемой пользователем функции не включается в таблицу, возвращаемую функцией sys.dm_exec_query_plan для пакета или хранимой процедуры. Вместо этого необходимо отдельно вызвать функцию sys.dm_exec_query_plan для дескриптора плана, соответствующего определяемой пользователем функции.

Если нерегламентированный запрос использует простую или принудительную параметризацию, столбец query_plan будет содержать только текст инструкции, а не фактический план запроса. Чтобы вернуть план запроса, вызовите функцию sys.dm_exec_query_plan для дескриптора плана подготовленного параметризованного запроса. Можно определить параметризацию запроса посредством ссылки на столбец sql представления sys.syscacheobjects или текстовый столбец динамического административного представления sys.dm_exec_sql_text. Дополнительные сведения о параметризации см. в разделах Простая параметризация и Принудительная параметризация.

По причине ограничения количества уровней вложенности, допустимых в типе данных xml, функция sys.dm_exec_query_plan не может возвратить планы запросов, содержащие 128 и более уровней вложенных элементов. В предыдущих версиях SQL Server это условие предназначалось для предотвращения возврата плана запроса и формирования ошибки 6335. В SQL Server 2005 с пакетом обновления 2 (SP2) и более поздних версиях столбец query_plan возвращает значение NULL. Можно использовать функцию динамического управления sys.dm_exec_text_query_plan для возврата плана запроса в текстовом формате.
10 фев 14, 23:44    [15548864]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
Paklich
Member

Откуда:
Сообщений: 29
invm,
Спасибо, да, это объясняет отсутствие плана в кэш.
11 фев 14, 12:45    [15550615]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
Paklich
Member

Откуда:
Сообщений: 29
Померил память сервака:

Bufer Cashe Hit ratio 100.000
Page life Expectancy 6566.000

Target Server Memory 36 659 776.000
Total Server Memory 36 659 776.000
Не сказать, что бы бы эти цифры вопияли о том, что ему не хватает оперативки.

Так что вопрос как все таки смотреть жирные планы выполнения открыт. Может у кого есть какой-нить гигантский запрос, так что бы план мегов на сто был, что бы посмотреть нормально ли все откроется в SSMS?

Кстати, провел эксперимент с профайлером, безрезультатно. там план не показывается также.
11 фев 14, 18:42    [15553204]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
step_ks
Member

Откуда:
Сообщений: 936
а попробуйте открыть .sqlplan SQL Sentry Plan Explorer-ом или выполнить запрос прямо в нём.
11 фев 14, 20:54    [15553780]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
Paklich
Member

Откуда:
Сообщений: 29
step_ks,

пробовал, Centry вылетает, правда у меня есть подозрение что это бага текущей версии, так как вылетать на больших планах он начал только после обновления. Раньше только ним и спасался. Подожду обновления.
18 фев 14, 12:30    [15581603]     Ответить | Цитировать Сообщить модератору
 Re: Не могу заставить SSMS отразить план запроса  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
У ТС там наверняка вот такая красотень:
http://www.brentozar.com/archive/2012/01/art-of-execution-plan/
18 фев 14, 23:06    [15586067]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить