Шаблон Резюме В Таблице

  Несоотетстие индексо и услоий запросо   соей статье посященной индексом мы сказали что что нас интересуют лияние индексо на быстродейстие запросо Индексы наиболее подходят для задач следующего типа: Серер СУБД с трудом оптимизирует такие конструкции как Если тексте стречаются конструкции ида: ЫБРАТЬ ИЗ <запрос1> ЛЕОЕ СОЕДИНЕНИЕ ( ЫБРАТЬ ИЗ <подзапрос1> ) ПО … Как решать такую проблему: место использоания соединений с ложенными подзапросами следует использоать ременные таблицы. Особенно если <запрос1> или <подзапрос1> содержат не физические таблицы а также ложенные запросы потому что: Напоминаю чтобы получить соотетстие имен таблиц базы данных объектам метаданным используйте.

С помощью обработки (тоже с диска ИТС) «Настройка технологического журнала» я создаю файл который будет логироать запросы к субд Содержимое файла у меня. Для того чтобы устранять проблемы произодительности необходимо понять причины Причины по которым СУБД может ыбирать неоптимальный план (наиболее изестные) Рассмотрим более подробно суть проблемы Соединение цикле На ыполнение соединения цикле указыает наличие плане запроса операции: Другой момент – это озможные ошибки сложных ложенных запросах (на момент написания характерны для ЗУП) Если запрос ыполняет неопраданно долго упростите его с помощью ременных таблиц. Почему так происходит? Предлагаю ыполнить несколько примеро Сначала займемся практикой а потом сделаем ыоды из наблюдений и познакомимся с теорией. Прежде сего не пугайтесь :) Расшифрую рисунок (он хоть и немного устарел но суть сохранилась) Мы — это «пользоатель» на рисунке консоли запросо я нажимаю кнопку «ыполнить».   Ыполните (например консоли запросо) такой запрос использующий отбор «ГДЕ»: 2 состае трассироки обязательно должны быть и ыполненные запросы и планы запросо 3 Сохранить трассироку файл <?xml version=»1.0″?> <config xmlns=» .ru/v8/tech-log»> <dump create=»false» location=»» type=»0″/> <log history=»1″ location=»E:\Common\logs»> <event> <eq property=»name» value=»dbmssql»/> </event> <property name=»all»/> </log> </config> Операция сканироания указыает на неоптимальную работу запроса но не сегда а только при ыполнении следующих услоий: Очень желательно создаать индексы не средстами СУБД но если ы решите се таки использоать скрипт соетую продумыать отслежиание эффектиности подобных индексо. Ы можете также прочить янарьском номере 2008 года статью Яна Стерка «Открытие скрытых данных для оптимизации произодительности приложений». 2 Разбиайте запрос на несколько частей Старайтесь как можно большее количесто участко запроса ыносить приилегироанный модуль Под «RLS» должна остаться только та таблица и кусок запроса без которой потеряется смысл проерки доступа к записи. Далее используя SQL Server Profiler и приложенный здесь ключите «трассироку» для ашей базы данных.   Что из сего этого следует: Перед ыполнением запроса формируется его ПЛАН ыполнения. При этом озникает ероятность что по-настоящему оптимальный ариант остался даже не рассмотренным Поэтому чтобы помочь оптимизатору СУБД ыборе оптимального арианта ыполнения нашего запроса рекомендуется придержиаться следующих праил: Некоторых случаях данный симптом может так же указыать на отсутстие подходящего индекса   Сохраняем скрипт файл и с помощью уже ыше озученой обработку смотрим на содержимое колонок индексо. Приожу для спраки работу оператора сканироания (перебора) кластерного индекса: Clustered Index Scan – логический и физический оператор сканирует кластеризоанный индекс определенный колонке Argument.   Имеется озможность атоматизироать ранжироание групп запросо Для этого следует сохранить трассироку таблицу SQL и ыполнить например следующий запрос:   select substring(TextData 1 100) SUM(Duration) from MySQLTrace group by substring(TextData 1 100) order by SUM(Duration) desc   Но прежде чем перейдем к разбору софтерных нюансо хочется ОБРАТИТЬ НИМАНИЕ что сильная загруженность ресурсо серера на ыбор плана лияет НЕПРЕДСКАЗУЕМО! Для знакомых с языком SQL команда «ЫБРАТЬ» — это переод на русский язык команды SELECT (кстати если писать 1С на английском языке то запросы 1С станоятся еще больше похожими на запросы SQL) Даайте проследим путь ыполнения этого запроса. Озьмем пример запроса 1С и проследим за путем его исполнения оспользуюсь обработкой «Консоль запросо» с диска ИТС и ыполню простенький запрос: 4 ыполнить анализ файла с помощью DTA указа сохранять структуру сущестующих таблиц и индексо После старта анализа мастер будет некоторое ремя оцениать данные нагрузки и ыдаст рекомендации. Данная операция аналогична сканироанию таблицы или индекса но при ее ыполнении сканируется не ся таблица а только ее часть Операция поиска по неполному услоию указыает на неоптимальную работу запроса не сегда а только при ыполнении следующих услоий: Пододными камнями яляется «мягкая» приязка структуры информационной базы к именам таблиц базе данных MS SQL Server Именя таблиц генерируются платформой атоматически и нет гарантий постоянном соотетстии метаданных к именам таблиц. План ыполнения запроса — это такая перестанока сех исходных ыбираемых таблиц реляционное соединение которых ыбранной последоательности предсталенное процедурном иде может быть ыполнено за минимальное число операций. Даайте «посмотрим» план ыполнения нашего запроса Страшно и непонятно если не знать английского 🙂 Даайте разберемся этой схеме плана запроса. Нашем примере будем ыполнять один и тот же запрос к регистру накопления Менеджерт = Ноый МенеджерременныхТаблиц; Подзапрос = Ноый Запрос; ерременныхТаблиц = МенеджерТ; = « | ЫБРАТЬ … | ПОМЕСТИТЬ МояременнаяТаблица | ИЗ <подзапрос1> | ГДЕ… | ИНДЕКСИРОАТЬ ПО… «; Для моего запроса консоли запросо логе пояились такие строчки: 45 -1,DBMSSQL,3,process=rphost,p:processName=bi,t:clientID=15,t:applicationName=1CV8,t:computerName=TESTCENTER,t:connectID=10,Usr=Тест,Trans=0,dbpid=52,Sql= Этой статье сконцентрируемся на подробностях исполнения запроса серером субд так как язык SQL предназначен для формулироания запросо терминах СУБД (таблицы и поля) При ыполнении запроса:

Запрос к неиндексироанной «Номенклатуре» регистра Длительность Duration моем замере состаила. Ариант настройки SQL Server Profiler   Отдельно ыделим операцию поиска по кластеризоанному индексы с услоием   Поиск индексе по неполному услоию На ыполнение поиска по неполному услоию указыает наличие плане запроса операции: Запросах кода конфигурации использоание индексо заисит услоий на которые есть смысл обратить нимание: При решении опросо произодительности MS SQL Server обратите нимание на физические операторы плана запроса: Если системе нет индекса который мог бы эффектино использоаться для данного запроса то необходимо рассмотреть одну из следующих озможностей: На сканироание указыает наличие плане запроса одной из следующих операций: Примечание последних ерсиях MS SQL Server LIKE стал уметь некоторых случаях использоать поиск но это се рано не лучший оператор   Прада при сей полезности индексо есть одно очень ажное НО – индекс должен быть «эффектино используемым» и должен позолять находить данные с использоанием меньшего числа операций ода-ыода и объема системных ресурсо. 1 При использоании у пользоателя большого количеста групп нужно создаать ноую группу которая бы содержала себе экиалент это множеста групп Т.е проерять одну группу значительно лучше чем десяток. Рукоодста плано SQL могут только применяются к инструкциям и пакетам часто ыполняющимся приложением с помощью системной хранимой процедуры sp_executesql (платформа 1С:Предприятие не се запросы генерирует таким способом но многие). Ид операции Table Scan Значок нам как бы подсказыает что происходит перебор сех записей таблицы   ид операции Clustered Index Scan   Серер приложений 1С:Предприятие яляется клиентом для СУБД MS SQL Server и передает исследоанный нами SQL запрос на серер СУБД Запрос ыполняет серер СУБД и затем по обратной цепочки озращает отет. Станьте эту строчку отладчиком конфигуратора и для содержимым будет запрос 1С   Но это мы знаем исходный запрос и поэтому можем догадаться что за «_InfoReg482» таблица на. Если произодительность запроса оказалась недостаточной озможно это гоорит о том что подзапрос по-прежнему слишком сложен То есть необходимо его дальнейшее упрощение еще раз   Use MyDataBase1C GO exec sp_msforeachtable N’UPDATE STATISTICS ? WITH FULLSCAN’ GO DBCC UPDATEUSAGE (MyDataBase1C) GO DBCC FREEPROCCACHE где MyDataBase1C — имя базы данных информационной базы 1С:Предприятие. Что произошло? Тот же самый запрос ыполняясь MS SQL Server этот раз ыполняется другими физическим оператором — Clustered Index Seek А если еще точнее думя операциями Clustered Index Seek и результаты объединяются физической операцией Nested Loops. Теперь запрос с индексированным вариантом:   Интересно что в 1С:Предприятии код запроса мы не трогали более того и в MS SQL Server логический текст запроса тоже остался. Поскольку мы работаем с 1С:Предприятие 8 то SQL-щики могут соблазниться на подобную кажущуюся легкость решения проблемы. После того как подзапрос ыделен отдельный запрос следует ыполнить его и оценить скорость его работы Для того чтобы оптимизироать осноной запрос подзапрос должен работать достаточно быстро сам. Планы ыполнения запроса сраниаются исходя из следующих факторо: После ыполнения запроса кода конфигурации MS SQL Server будет «транслироан» запрос Transact-SQL ыделите событие Showplan XML Statistics Profile и ы уедете картинку плана запроса похожу. [Hkey_Local_Machine\system\currentcontrolset\services\1C:enterprise 8.1 Server Agent] «ImagePath«= по умолчанию «C:\Program Files\1cv81\bin\ » -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d «C:\Program Files\1cv81\server» Текст содержит фильтр dbmssql на сбор сех запросо к MS SQL Server затем открыл файл технологического лога Тут надо дать комментарий почему мы не уидели запроса 1С У нас есть «контекст запроса» — 458 строка модуля — мРезЗапроса = ть(); Ыбрать ИЗ генты ГДЕ Наименоание ПОДОБНО «%СтрокаПоиска%» таком запросе будет ыполнен полный перебор сех записей таблицы Это отрицательно сказыается на произодительности. Нашем примере плана опциональный параметр отсутстует   Операция поиска по неполному услоию так же указыает на отсутстие подходящего индекса   ид операции. Операция соединения цикле указыает на неоптимальную работу запроса не сегда а только том случае если едущий подзапрос озращает значительное количесто записей этом случае следует попытаться упростить запрос: Select 4 AS f_1 FROM _InfoReg482 _InfoReg482_Q_000_T_001 WITH(NOLOCK) WHERE 3RRef = ? мы гоорим что нужно получить « 4» но не гоорим «как это получить»!   Метод хорош тем что скорее сего ам не придется перезапускать серер приложений и не требует дополнительных трат денег поскольку технологический журнал яляется штатным средстом платформы. Большинсто запросо это инструкция «ЫБРАТЬ …» поэтому мне кажется будет праильным дальше опираться на эту инструкцию. См здесь Надо «c:\program Files\1cv81\bin\ » -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -debug -d «C:\Program Files\1cv81\server» Таким образом это самый дешеый и простой способ исследоания медленных запросо Он наиболее изестен 1С специалистам. Результате будет получен список групп запросо (по сопадению перых 100 симоло) отсортироанный по убыанию суммарного ремени ыполнения сех запросо группы то есть по убыанию ранга данного запроса   Ну ообще ы поняли что будет не скучно :)   Используется для аккуратной очистки кэша плано нимание просто так эту процедуру «гонять» не надо Слишком частое использоание да еще при не интенсином оде данных скорее ухудшит работу чем улучшит. Код обработки ыполняется на клиенте (но принципе может и на серере 1С:Предприятие) он проходит по сети и попадает на рабочий серер приложений где транслируется SQL запрос. Так получилось что задача поиска отсутстующих индексо характерна не только 1С-приложениям но и ообще любым клиентам MS SQL Server Задача ообще-то не очень простая как ы уже могли заметить Поэтому для «закоренелых sql-щико» не могу не осетить еще несколько моменто. Но когда исходный запрос неизестен чтобы получить соотетстие имен таблиц базы данных объектам метаданным используете наш серис   озращаемся к нашей схеме прохождения запроса. Также недостатком можно считать дополнительные усилия по разбору собранных данных так как никакого ранжироания по частоте запросо и их длительности нет. Ообщем такой подход решения проблемы методически неерен. Для того чтобы получить неискаженную информацию ыполните запрос Transact-SQL (здесь приложен файл) к базе данных с помощью SQL Server Management Studio: | Ускоряем 1С:Предприятие | +7. А от физические операторы изменились Почему же оптимизатор запросо едет себя по-разному? Для этого надо понимать различия между физическими операторами применяющимися для логических запросо Ниже немного теории. Подробней приемы работы с планом запроса можно посмотреть здесь  /ru-ru/magazine Предлагаю обратить нимание на назание операции физического исполнения логической команды SELECT (ЫБРАТЬ) — Clustered. Это означает что если у ас серер «не тянет» то результат оптимизации кода конечно снизит нагрузку и улучшит произодительность но от ЫПОЛНИТЬ САМУ ОТЛАДКУ и оптимизироать код на таком серере сложно и НЕТ ГАРАНТИЙ! Недостаток — нужно иметь наык работы с технологическим журналом или потратить ремя на его осоения Облегчает работу обработка с диска ИТС «Настройка технологического журнала». Из практических можно отметить уже данные рекомендации моей статьи по обслужианию MS SQL Server ыполнять принудительно или регламентной процедурой команду SQL: exec sp_msforeachtable N’UPDATE STATISTICS ? WITH FULLSCAN’ Даже если не смотреть на колонки Duration (длительность) и Read (чтение с диска) то можно сделать ыод — индексы лияют на способ ыполнения логических операторо ( нашем случаи SELECT) При этом могут применять разные комбинации физических операторо     У нас пояился SQL запрос к «страшному и непонятному» имени таблицы базы данных «_InfoReg482 _InfoReg482_Q_000_T_001» плюс «загадочные» поля таблицы «_Fld484» и «_Fld483RRef».

Сначала ыполним размещения измерения номенклатура последним по порядку и ыключим индексироание этого рекизита ыполним запрос Затем ключим индексироание и поторим запрос Для анализа используем профайлер с такими настройками: Дело том что один и тот же запрос может быть ыполнен множестом разных способо: -Части запроса можно обрабатыать разном порядке -Можно использоать разные индексы Это сязано с механизмом субд — оптимизатором запросо. Теперь изменим у рекизита сойсто Индексироать И после перезапуска конфигуратора (у нас будет создан индекс) поторить наблюдение за планом запроса. Операция сканироания сегда указыает на то что для оптимального ыполнения данного запроса нет подходящего индекса При очень ысокой загруженности СУБД может использоать скомпилироанной запрос с устарешей статистикой или другими неактуальными данными Инструкция DBCC FREEPROCCACHE Создайте спраочник с рекизитом Пусть это будет «Склады» с рекизитом «МОЛ» Заполните спраочник сгенерироа например обработкой несколько тысяч записей с разными значениями рекизита «МОЛ». Часть приемо экспериментально реализоана моей обработке Мегаэкстремальный способ препарироания запросо Есть такой прием — подсказка USE PLAN запросе.