THE BELL

Есть те, кто прочитали эту новость раньше вас.
Подпишитесь, чтобы получать статьи свежими.
Email
Имя
Фамилия
Как вы хотите читать The Bell
Без спама

Грамотное использование индексов может ускорить запросы не просто в разы, а в сотни, иногда даже в тысячи раз.

Такого ускорения просто невозможно добиться аппаратными средствами. Поэтому данной теме необходимо уделить пристальное внимание.

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

В видеоуроках мы рассмотрим несколько способов создания индекса. Также рассмотрим ситуацию когда индекс необходимого состава невозможно создать штатными средствами платформы и его придется создавать в СУБД .

Настройка индексов штатными средствами платформы

В уроке показано, какие индексы реально создаются для объектов на уровне СУБД.
В этой теме не все так очевидно, как может показаться на первый взгляд. Ведь для ряда объектов есть особенности создания индексов.
Все нюансы рассмотрим в данном видео.

Индексация с дополнительным упорядочиванием

В видео показано отличие варианта построения индекса Индексировать от Индексировать с доп. упорядочиванием .
На примере показано, какой будет построен индекс платформой при использовании дополнительного упорядочивания.

Создание индекса для измерений регистров

Индексация первого измерения регистров имеет несколько нюансов.
В видео показано, какие индексы создаются для измерений регистров. Также рассмотрена ситуация индексации первого измерения регистра.

или

Зачем разработчику 1С «индексировать» измерения регистров и реквизиты?

— Ну у вас и запросы! — сказала база данных и повисла…

Краткий ответ на вопрос заголовка заключается в том, что это позволит выполнять запросы быстро и уменьшать негативное влияние блокировок на .

Что такое индекс?

Оптимизация размещения индексов

При объеме таблиц не позволяющем им «разместиться» в оперативной памяти сервера, на первое место выходит скорость дисковой подсистемы (I/O). И здесь можно обратить внимание возможность размещать индексы в отдельных файлах расположенных на разных жестких дисках .

Подробное описание действий http ://technet .microsoft .com /ru -ru /library /ms 175905.aspx
Использование индекса из другой файловой группы повышает производительность некластерных индексов в связи с параллельностью выполнения процессов ввода/вывода и работы с самим индексом.
Для определения размеров можно использовать выше упомянутую обработку.

Влияние индексов на блокировки

Отсутствие необходимого индекса для запроса означает перебор всех записей таблицы, что в свою очередь приводит к избыточным блокировкам, т.е. блокируются лишние записи. Кроме того, чем дольше выполняется запрос из-за отсутствующих индексов, тем больше время удержания блокировок.
Другая причина блокировок — малое количество записей в таблицах. В связи с этим SQL Server, при выборе плана выполнения запроса, не использует индексы, а обходит всю таблицу(Table Scan), блокируя целиком. Для того, чтобы избежать подобных блокировок, необходимо увеличить количество записей в таблицах до 1500-2000. В этом случае сканирование таблицы становится долее дорогостоящей операцией и SQL Server начинает использовать индексы. Конечно это можно сделать не всегда, ряд справочников как «Организации», «Склады», «Подразделения» и т.п. обычно имеют мало записей. В этих случаях индексирование не будет улучшать работу.

Эффективность индексов

Мы уже отметили в заголовке статьи, что нас интересуют влияние индексов на быстродействие запросов. Итак, индексы наиболее подходят для задач следующего типа:

  • Запросы, которые указывают «узкие» критерии поиска. Такие запросы должны считывать лишь небольшое число строк, отвечающих определенным критериям.
  • Запросы, которые указывают диапазон значений. Эти запросы также должны считывать небольшое количество строк.
  • Поиск, который используется в операциях связывания. Колонки, которые часто используются как ключи связывания, прекрасно подходят для индексов.
  • Поиск, при котором данные считываются в определенном порядке. Если результирующий набор данных должен быть отсортирован в порядке кластеризованного индекса, то сортировка не нужна, поскольку результирующий набор данных уже заранее отсортирован. Например, если кластеризованный индекс создан по колонкам lastname (фамилия), firstname (имя), а для приложения требуется сортировка по фамилии и затем по имени, то здесь нет необходимости добавлять инструкцию ORDER BY.

Правда при всей полезности индексов, есть одно очень важное НО – индекс должен быть «эффективно используемым» и должен позволять находить данные с использованием меньшего числа операций ввода-вывода и объема системных ресурсов. И наоборот, неиспользуемые (редко используемые) индексы скорее ухудшают скорость записи данных (поскольку каждая операция, изменяющая данные, должна также обновлять страницы индексов) и создают избыточный объем базы.

Покрывающим (для данного запроса), называется индекс в котором есть все необходимые поля для этого запроса. Например, если индекс создан по колонкам a, b и c, а оператор SELECT запрашивает данные только из этих колонок, то требуется доступ только к индексу.

Для того, что бы определить эффективность индекса, мы можем приблизительно оценить с помощью бесплатного онлайн-сервиса показывающий «план исполнения запроса» и используемые индексы.

Vandalsvq 1114 08.11.14 17:00 Сейчас в теме

() CheBurator, группировка условий есть, в версии 5+. Но она только на 1С++ - http://www.1cpp.ru/forum/YaBB.pl?num=1273512019 .
Были планы сделать условное оформление, а также группировку, но увы. Причина тому одна - я не занимаюсь 7-кой на коммерческой основе и поэтому не дорабатываю эти инструменты. Тестировать даже элементарно не на чем. Раньше и sql-ные базы были и файловые и разных конфигураций навалом. Сейчас вроде как только одна на которой была разработка и ту открывал очень давно.

А вообще вот последние изменения:
5.0.1 от 15.04.12 г.
- Изменена система отборов в динамических расширениях (Справочник, Документ, Журнал, Регистр, Операции, Проводки). Добавлена возможность произвольного построения условий с иерархией.
- В связи с изменением системы отборов внесены изменения в объекты-расширения «ПоставщикДанных.Журнал», «ПоставщикДанных.Проводки» «ПоставщикДанных.Документы», «ПоставщикДанных.Справочник», «ПоставщикДанных.Операции», «ПоставщикДанных.Регистр».
- Исправлено поведение кнопки «Отбор по текущей колонке». При нажатии не отключаются остальные отборы. Также если отбор включен, то он выключается.
- При активизации колонки изменяется отображение кнопки «Отбор по текущей колонке».
- Оптимизировано построение условия отборов по реквизитам.
- Исправлена ошибка потери текущей строки при изменении иерархического просмотра у объекта-расширения «ПоставщикДанных.Справочник».
- Отключено использование параметра «ВыводитьПиктограммуОтбора». Параметр оставлен для обратной совместимости.
- Объект «ПоставщикДанных.ОписаниеТипов» и «ПоставщикДанных.ВидыСравнения» выведены из состава поставщика данных. Вместо них используются общие объекты «ОписаниеТипов» и «ВидыСравнения» соответственно. Подробнее см. документацию по классам «Объекты_v8».
- Исправлено падение 1С при изменении типа значения объекта «ПоставщикДанных».

5.0.2 от 24.04.12 г.
- Исправлена ошибка при укладке списков со строковыми значениями для отбора.
- Исправлена ошибка формирования запроса для объекта-расширения «ПоставщикДанных.Регистр» если у регистра стоит признак «Быстрая обработка движений»
- Исправлены выявленные ошибки.

5.0.3 от 22.05.13 г.
- Объект «ПоставщикДанных.ПрямойЗапрос» обновлен до версии 1.8.6 от 22.05.13 г.
- все классы собраны вместе в один архив + примеры

5.0.4 от 25.10.13 г.
- Исправлены выявленные ошибки

5.0.5 от 23.05.14 г.
- Исправлены выявленные ошибки при добавлении колонок данных
- Добавлена возможность построения древовидных структуры в доступных полях при добавлении колонок данных (фактически теперь можно объект "Отбор" использовать для построения отборов вроде СКД в 8-ке, но напильник must have)

Вопрос: Индексированная Таблица значений


Вопрос такой, можно ли сделать Таблицу Значений на форме диалога индексированной и далее работать с ней, как с индексированной таблицей?
Или лучше работать отдельно с ИТЗ а потом итоги выгружать в видимую на форме Таблицу значений?
И второй вопрос, как сделать так, чтобы при выгрузке ИТЗ в Таблицу значений, не слетал формат колонок?
ПыСы -компонента 1с ++ стоит, если чо.

Ответ: () после кулдауна натахауза пряника нигде не достать, если это конечно не просто сабж из анекдота

Вопрос: Работа с таблицей значений


Доброго Вам дня, уважаемые программисты. Прошу помощи в решении задачи в 1С, сама, извините, в этом не бум-бум
Пыталась сделать сама, но даже не хватило ума скомпилировать пример

1. В форму диалога поместите таблицу значений.
2. В модуле формы опишите колонки таблицы: Товар, Количество, Цена, Сумма.
3. Поместите на форму диалога реквизиты диалога "Товар", "Цена", "Коли¬чество" и кнопку Добавить строку, которая добавляет новую строку в таблицу значений и заполняет ее значениями соответствующих реквизи¬тов. Сумма должна вычисляться как произведение цены на количество.
4. Добавьте кнопку Удалить строку, которая удаляет текущую строку таб¬лицы значений. Предусмотрите ситуацию пустой таблицы значений.
5. Добавьте кнопку Свернуть, которая должна суммировать по товарам сумму и количество, в колонке Цена должна вычисляться средняя цена товара.
6. Добавьте кнопку Развернуть, которая восстанавливает состояние табли¬цы значений до свертки.
7. Добавьте кнопку Сортировка для упорядочивания строк по товарам.

Заранее спасибо!

Ответ: платформа? Управляемый или обычный режим?
В синт.поме "Таблица значений"

Вопрос: 8.2 - Получить данные из вычисляемого поля таблицы значений


Не знаю как толком объяснить.
На форме есть табличное поле. В процедуре ПриПолученииДанных(Элемент, ОформленияСтрок) в отдельную
колонку вычисляю значение:

Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл.... ОформлениеСтроки.Ячейки.Отгружено.Значение = Тут формула.... КонецЦикла

Так вот как мне пройти по строкам в таблице значений и получить данные из этой ячейки?

Ответ:

ты путаешь понятия. табличное поле и есть табличное поле -ТЗ тут не пахнет. так же как и рассчитываешь та же и обходи

Вопрос: СКД: Иерархию из таблицы значений


Здравствуйте!
Подскажите как создать иерархию из таблицы значений типа такой

ПолеСтрока | ПолеСтрокаРодитель
________________________________
Основной каталог | Основной каталог
Васильев И.А. | Основной каталог
Аренда имущества | Васильев
Разные документы | Васильев
Иванов | Основной каталог
Аренда имущества | Иванов
Разные документы | Иванов

Нужно как-то получить дерево из этого. Пока работает программно, но думаю, что такое дерево можно вполне в скд построить.

Ответ: Ну программно ты создаешь объект ДеревоЗначений и тулишь туда ручками владельца (узлы) и подчиненные элементы (строки).

А эти данные только в виде таблицы значений, а ен элементы иерархического справочника? Если это иерархический справочник, то это проще простого.

А если надо именно из таблицы значений, создавая ее как угодно, то делать так:

Определяешь в запросе временную таблицу, куда помещаешь свою ТЗ.
Потом делаешь выборку по ней с соединением строки с родителем.

Вопрос: Вынос Таблицы значений в общий модуль


Добрый день!
Новичок в 1С. Изучаю версию 3.0 Тонкий клиент. Есть внешняя управляемая форма. Хочу вынести таблицу значений в общие модули. Застопорилась, помогите пожалуйста:
1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 & НаСервере Процедура Выполнить ЗапросНаСервере() З= Новый запрос; З. Текст = "ВЫБРАТЬ | РасходныйКассовыйОрдерРасшифровкаПлатежа.ДоговорКонтрагента, | РасходныйКассовыйОрдерРасшифровкаПлатежа.СуммаПлатежа |ИЗ | Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа" ; Тз= З. Выполнить () . Выгрузить() ; //Вывод результата запроса в таблицу формы ТФ(Тз) ; КонецПроцедуры & НаСервере Процедура ТФ(Тз) ОбщиеФункции. ЗаполнитьТаблицуФормы(Тз) КонецПроцедуры

Общий модуль:

Ошибка:{Форма.Форма.Форма(23)}: Ошибка при вызове метода контекста (ЗаполнитьТаблицуФормы)
ОбщиеФункции.ЗаполнитьТаблицуФормы(Тз)
по причине:
Несоответствие типов (параметр номер "1") (Неверный тип параметра. Допустимы только примитивные типы, ссылки, Структура)
Как передать ТЗ для дальнейшей обработки?

Ответ:

Сообщение от Prsvet

Почему тип число передает, а при передачи ТЗ нужно ставить повторное использование возвращаемых значений не использовать?

Потому что,

Сообщение от Prsvet

повторное использование возвращаемых значений

Кэшируется на клиенте, а таблица значений не сериализуется на клиенте

Добавлено через 32 секунды
с этим параметром нужно работать аккуратно!

Добавлено через 35 секунд
Prsvet , если ты не знаешь как работает этот параметр, то лучше не используй его!

Вопрос: Таблица значений с циклическим заполнением колонок


Всем доброго.
Задача - вывести таблицу прихода/расхода товаров за выбранный период с понедельной разбивкой. Решил реализовать как ТаблицуЗначений (сначала думал сделать отчетом, но не нашел, как). Поскольку количество столбцов заранее неизвестно, таблица генерируется программно:

//*** описание ТЗ как реквизита формы массивТипаВыбора = новый массив; массивТипаВыбора.Добавить(тип("таблицаЗначений")); описаниеТипаВыбора = новый описаниеТипов(массивТипаВыбора); массивРеквизитов = новый массив; массивРеквизитов.Добавить(новый реквизитФормы("ТЗФорма", описаниеТипаВыбора, "", "ТЗформа")); //*** описание типов КЧ = новый КвалификаторыЧисла(10,2); КС = новый КвалификаторыСтроки(100); мас = новый массив; мас.Добавить(тип("Строка")); ТипСтрока = новый ОписаниеТипов(мас, КС); мас.Очистить(); мас = новый массив; мас.Добавить(тип("Число")); ТипЧисло = новый ОписаниеТипов(мас, КЧ); мас.Очистить(); // *** //создаем временную таблицу значений ТЗ = новый ТаблицаЗначений; ТЗ.Колонки.Добавить("товар", ТипСтрока, "товар"); для н=1 по КолвоНедель цикл ТЗ.Колонки.Добавить("приход" + н, ТипЧисло, "приход" + н); ТЗ.Колонки.Добавить("расход" + н, ТипЧисло, "расход" + н); КонецЦикла; для каждого колонка из тз.Колонки цикл массивРеквизитов.Добавить(новый РеквизитФормы(колонка.Имя, колонка.ТипЗначения, "ТЗФорма")); КонецЦикла; изменитьРеквизиты(массивРеквизитов); таблицаПолейВыбора = Элементы.Добавить("ТЗФорма", тип("ТаблицаФормы")); таблицаПолейВыбора.ПутьКДанным = "ТЗФорма"; таблицаПолейВыбора.Отображение = отображениеТаблицы.Список; для каждого колонка из ТЗ.колонки цикл новыйЭлемент = элементы.Добавить(колонка.Имя, тип("ПолеФормы"), таблицаПолейВыбора); новыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; новыйЭлемент.ПутьКДанным = "ТЗФорма." + Колонка.Имя; новыйЭлемент.Ширина = 10; КонецЦикла;

Потом заполняется колонка наименований:

ЗапрНом = новый запрос; запрНом.Текст = "выбрать ТоварыНаСкладахОбороты.Номенклатура КАК номенклатура | из РегистрНакопления.ТоварыНаСкладах.Обороты() КАК ТоварыНаСкладахОбороты"; ТЗНом = запрНом.Выполнить().Выгрузить(); для каждого стрНом из ТЗНом цикл стрНом = стрНом.номенклатура; //добавить данную номенклатуру во временную ТЗ СтрТЗ = ТЗ.Добавить(); СтрТЗ.товар = стрНом; КонецЦикла;

Наконец, выгружаем товар из временной ТЗ в ТЗ формы:

ЗначениеВРеквизитФормы(ТЗ, "ТЗФорма");

Проблема - циклическое заполнение приходов и расходов. Если я правильно понимаю, каждая строка этих данных заполняется циклом, вложенным в цикл заполнения колонки товаров. То есть на каждой итерации по заполнению строки с товаром делаем запрос на приход и расход, в который передаем наименование товара, даты начала и конца периода. Результат запроса выгружаем в таблицу значений, которая в итоге имеет одну строку. Это работает, когда показываются данные за весь период, то есть когда есть три колонки: товар, приход, расход.

Но в данном случае требуется по две колонки на каждую неделю. Пусть имена этих колонок будут отличаться номером недели, то есть приход1, расход1, приход2, расход2 и тд. Понятно, что при этом организуется цикл, в котором в запросе на приход и расход вместо конца периода передается дата, бывшая на начало итерации + неделя.

Вопрос возникает при передаче сумм прихода и расхода из таблицы значений по результатам запроса во временную таблицу. Как описать, что в каждой итерации при выгрузке данных из таблицы результата запроса во временную ТЗ цифра в имени колонок прихода и расхода увеличивается на 1? Ведь в целом процесс выгрузки выглядит так:

ТЗПрихРасхОбор = ЗапрПрихРасхОбор.Выполнить().выгрузить(); для каждого стрПрихРасхОбор из ТЗПрихРасхОбор цикл стрТЗ.приход = стрПрихоРасхОбор.приход; стрТЗ.расход = стрПрихоРасхОбор.расход; стрТЗ.оборот = стрПрихоРасхОбор.оборот; КонецЦикла;

Ответ:

наконец добрался до кода. спасибо, помогло. получилось так:

ТЗ = ЗапросНоменклатуры(); для н=1 по колвоНедель цикл ТЗ.колонки.добавить("приход" + н, типЧисло, "приход" + н); ТЗ.колонки.добавить("расход" + н, типЧисло, "расход" + н); КонецЦикла; для н = 1 по колвоНедель цикл КолонкаПрих = ТЗ.колонки.найти("приход" + н); КолонкаРасх = ТЗ.колонки.найти("расход" + н); КонецПериода = началоПериода + неделя; ТЗПР = ЗапросОборотов(НачалоПериода, КонецПериода); МПрих = ТЗПР.выгрузитьКолонку(0); МРасх = ТЗПР.выгрузитьКолонку(1); ТЗ.загрузитьКолонку(МПрих, КолонкаПрих); ТЗ.загрузитьКолонку(Мрасх, КолонкаРасх); НачалоПериода = КонецПериода; КонецЦикла;

оптимизировать не стал (например, по поводу запроса в цикле), так как итоговый вид таблицы изначально не устраивал в плане наглядности, хотелось другого решения. вспомнил про макет и табличный документ, пробую через него

Вопрос: Как не зная структуры таблицы значений обработать ее в Запросе


Здравствуйте. Есть таблица значений. Точные имена колонок не известны. Необходимо обработать таблицу значений и добавить к ней одну колонку и заполнить ее. Заполнение осуществляется на основании одной колонки у которой известно имя.
Самый простой вариант - добавить колонку и обработать таблицу в цикле. Но это не совсем хорошо.
Возможно ли это сделать в запросе?
Спасибо.

Ответ:

В первом приближении:

Выбрать * ПОМЕСТИТЬ ВТ_ВнешниеДанные ИЗ &Таблица КАК ВнешниеДанные

Выбрать ВнешниеДанные.*, Таблица.ПОЛЕ1 ИЗ ВТ_ВнешниеДанные КАК ВнешниеДанные ЛЕВОЕ СОЕДИНЕНИЕ <Таблица> КАК Таблица ПО ВнешниеДанные.Поле1 = Таблица.Поле1

Вопрос: Как при выборе значения ячейки таблицы значений на УФ делать отбор по владельцу?


Уважаемые коллеги! Не так давно жизнь вынудила меня столкнуться с управляемыми формами, потому я в них еще не сильно понимаю. Не сочтите вопрос дурацким и помогите кто чем может:) Вопрос следующий. Формирую свою таблицу значений и вывожу ее на форму. Первая колонка - ссылка на справочник номенклатуры, остальные колонки - ссылки на справочник для которого Номенклатура является Владельцем. Как мне сделать так, что бы при начале выбора значения в такой колонке в списке значений уже стоял отбор по владельцу. Пока сделал через событие НачалоВыбора, там открываю список с нужным отбором. Но проблема не понимаю куда полученное значение пихать в обработке подбора? И есть подозрение, что отбор по владельцу можно установить через свойство колонки ПараметрыВыбора. Как быть? Подскажите!

Ответ: и вот у меня есть

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) Если ИсточникВыбора.ИмяФормы = "Справочник.ЗначенияСвойствОбъектов.Форма.ФормаСписка" Тогда И вот ту я не заню что написать
, что бы поместить ВыбранноеЗначение в редактируемую ячейку таблицы!!!

КонецЕсли;
КонецПроцедуры

Вопрос: Группировки и Свернуть() по таблице значений


внимательно, это 7 .7 :)
Итак сабж: выгружаю ТЧ документа в таблицу значений.
ТЧ документа имеет вид
Расх.накл. | Клиент | адрес доставки.

Обрабатываю таблицу значений:
выбратьСтроки();
пока получитьСтроку() = 1 Цикл тбл.НоваяСтрока(); тбл.Клиент = Клиент; тбл.АдресДоставки = АдресДоставки; тбл.НомерДок = Накладная.НомерДок; КонецЦикла ;
Суть в следующем. В макете при печать должно в одной ячейке выходить Клиент, АдресДоставки и номера всех расходных накладных по клиенту, а так же может быть один клиент, но разные адреса доставки. То есть, в случае совпадения Клиента и Адреса, выводить список накладных по этим параметрам.

Ответ: () Используй черный запрос про документам. Группировки: Клиент, Адрес доставки, Реализация (Упорядочивание по номеру). Циклы используешь с учетом группировок. В исходную таблицу выводи строки во второй группировке (Адрес доставки), но после цикла по третьей группировке (Реализация), потому что во второй группировке будешь формировать строку с номерами накладных.
НомераНакладных = "";
Пока Запрос.Группировка(3 ) = 1 Цикл НомераНакладных = НомераНакладных + ?(ПустаяСтрока (НомераНакладных) = 1 , "", ", ") + Запрос.ЗначениеУпорядочивания((СтрокаТаблицы.Данные,ДлинаСтроки)=ЧтоИщем Тогда МассивНайденныхСтрок.Добавить(СтрокаТаблицы); КонецЕсли ; КонецЦикла ;

THE BELL

Есть те, кто прочитали эту новость раньше вас.
Подпишитесь, чтобы получать статьи свежими.
Email
Имя
Фамилия
Как вы хотите читать The Bell
Без спама