powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / Запрос .Выбрать() или .Выгрузить() ?
25 сообщений из 25, страница 1 из 1
Запрос .Выбрать() или .Выгрузить() ?
    #37382777
Какая разница в этих методах применительно к операции выгрузки результата запроса "на сторону" (на др. сервер или в файл)?
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #37382820
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выгрузить() - быстрее.
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #37382928
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос.Выполнить.Пустой() Быстрее
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #37383983
Программист 1сЗапрос.Выполнить.Пустой() Быстрее

Ну теперь совсем меня запулали своими аллегориями :-)

А данные из запроса возаращаются в одинаковом формате?
Например, везде у чисел будет разделитель разрядов...
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #37384488
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод .Выгрузить() выгружает в ТабличныйДокумент весь запрос ( с сервера на клиент перетаскивается весь результат запроса ), а .Выбрать() открывает типа курсора на сверере, на сколько я понимаю выполнив запрос ( данные остаются на сервере ). А вот метод .Следующий() возвращает результат по одной записи (это типа ADO Recordset).
Код: plaintext
Запрос.Выполнить.Пустой() Быстрее
не думаю что он будет быстрее .Выбрать(), хотя и такое возможно реализовать.
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #37384512
SashaMМетод .Выгрузить() выгружает в ТабличныйДокумент весь запрос ( с сервера на клиент перетаскивается весь результат запроса ), а .Выбрать() открывает типа курсора на сверере, на сколько я понимаю выполнив запрос ( данные остаются на сервере ). А вот метод .Следующий() возвращает результат по одной записи (это типа ADO Recordset).
Код: plaintext
Запрос.Выполнить.Пустой() Быстрее
не думаю что он будет быстрее .Выбрать(), хотя и такое возможно реализовать.

Ага, видимо так и есть
http://pro1c.org.ua/index.php?showtopic=466

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

Технологические особенности

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

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

В процессе обхода динамической выборки система считывает данные блоками по 25 записей. Для объектных данных (Справочников, Документов и т.д.) каждая запись является объектом, включающим все ее табличные части.

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

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

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

Особенности использования

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

Это объясняется описанными выше технологическими особенностями работы динамической выборки. Например, после считывания первого блока записей выполнено изменение одного из объектов и в результате значения полей по которым упорядочена выборка изменились. Тогда эта запись может попасть в выборку повторно, если в результате изменения она стала в порядке следования позже, чем была раньше. Если в процессе выборки выполняемой одной сессией в другой сессии объект изменился и в результате изменений в порядке выборки он стал раньше, чем был до изменения, то при определенном совпадении по времени этих процессов, объект вообще не попадет в выборку. Например, пока выборка обходила товары на букву "А", товар "Бета" переименовали в "Альфа". В этом случае, он может не "успеть" попасть в часть выборки на букву "Б" и "опоздать" попасть в часть выборки на букву "А".

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

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

Эти особенности требуют обдуманного подхода к задачам, решаемым с помощью динамических выборок. Можно рекомендовать применять выборки либо для задач, не требующих ответственного чтения множества записей, либо для регламентных задач, допускающих использование монопольного режима. В любых случаях следует внимательно относится к изменению объектов в процессе обхода динамической выборки, так как это может повлиять на порядок их включения в выборку.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Запрос .Выбрать() или .Выгрузить() ?
    #38577783
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмирий РомановскийАга, видимо так и есть
http://pro1c.org.ua/index.php?showtopic=466

Основной особенностью динамических выборок является то, что они не считывают данные целиком в память, а получают их блоками по мере обхода выборки методом Следующий(). таки отвечу спустя 3 года
здесь речь идет не про запросы, а про динамичекские выборки из прикладных объектов. Из Справочников, Документов и т.п.
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38577811
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0, а разница то? принцип от этого не меняется
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38577949
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckervi0, а разница то? принцип от этого не меняетсяможет быть нет разницы, а может и есть
сам я не пока нашел описания, как работает выборка запроса

Если посмотреть профайлером MS SQL выборку из справочника Справочник.Склады.Выбрать() то можно увидеть то что описано в статье: запросы по 25 записей.

Но запрос показывает свою работу только для метода Запрос.Выполнить() напрямую транслируя запрос, без порций по 25.
И для метода Выборка.Следующий() профайлер молчит
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38578260
Фотография Владимир Лазурко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0И для метода Выборка.Следующий() профайлер молчитПотому что данные уже на сервере 1С
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38578435
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Лазуркоvi0И для метода Выборка.Следующий() профайлер молчитПотому что данные уже на сервере 1Ссогласен. поэтому и говорю, что статья не про запросы
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38594651
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://its.1c.ru/db/v8std#content:-2145782922:1

1. Не следует разрабатывать решения исходя из неограниченного объема оперативной памяти. Для многопользовательских систем любое неэффективное использование памяти может катастрофически сказаться на работоспособности.

Следует избегать формирования больших структур данных в памяти. Если объём данных, с которыми работает бизнес-логика, сам по себе ничем не ограничен, его нужно ограничивать искусственно, обрабатывая данные порциями и сохраняя результаты в базу или файлы.

2. При потенциально неограниченных выборках данных из ИБ следует получать данные из базы порциями фиксированного размера.
Например, неправильно:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";

// Выгрузка всего справочника в таблицу значений
Номенклатура = Запрос.Выполнить().Выгрузить();
Для каждого ПозицияНоменклатуры Из Номенклатура Цикл
// Обработка элемента справочника
// ...
КонецЦикла;

поскольку весь результат запроса сразу помещается в память, в таблицу значений.
Также неправильно:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";


РезультатЗапроса = Запрос.Выполнить();
// Обход результата запроса
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Обработка элемента выборки
// ...
КонецЦикла;

поскольку и в этом случае при выполнении запроса его результат будет сначала считан в память целиком (*).

* Примечание. Если используется 32-битная версия платформы, и размер результата запроса превосходит размер имеющейся памяти, то данные будут записаны на диск, а затем считаны оттуда в процессе вызовов Выборка.Следующий().

Правильно ограничивать результат запроса искусственно:

ВсеОбработано = Ложь;
Пока Истина Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1000
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| <условие выборки необработанных записей>";


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


// Обход порции результата запроса
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Обработка элемента выборки
// ...
КонецЦикла;


КонецЦикла;

Также правильно:


Выборка = Справочники.Номенклатура.Выбрать(..., Отбор);
Пока Выборка.Следующий() Цикл
// Обработка элемента выборки
// ...
КонецЦикла;

поскольку в этом случае платформа 1С:Предприятие выполняет курсорный запрос.

Кроме того, число элементов выборки автоматически ограничивает платформа 1С:Предприятие в запросах динамических списков.
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38594745
Последний выдох ГПЖ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВыборка = Справочники.Номенклатура.Выбрать(..., Отбор);
Пока Выборка.Следующий() Цикл
// Обработка элемента выборки
// ...
КонецЦикла;

поскольку в этом случае платформа 1С:Предприятие выполняет курсорный запрос.

ога... только выборка будет недостоверной
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38594782
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0 http://its.1c.ru/db/v8std#content:-2145782922:1
2. При потенциально неограниченных выборках данных из ИБ следует получать данные из базы порциями фиксированного размера.

Мдя...

vi0Правильно ограничивать результат запроса искусственно:
"ВЫБРАТЬ ПЕРВЫЕ 1000
И как мне гарантированно получить остальные данные?

vi0Также правильно:
Выборка = Справочники.Номенклатура.Выбрать(..., Отбор);
Зачем писать запрос, который потом по отбору обходить? Или сервер баз данных у нас резиновый...
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38594811
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AHDP,
ты как разработчик сами должен отвечать на подобные вопросы в реальной ситуации
что значит "потом" по отбору обходить?
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38594915
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vi0,

Чем кроме памяти на сервере приложений 1С отличается запрос 1С от выборки?
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38594953
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AHDP,
выборка транслируется в запросы SQL по 25 записей
т.е. порциями
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38595468
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тут на днях был человек (хотел 150 - а знал маловато....). Так вот он утверждал что:

Если а=1 Тогда Продолжить;КонецЕсли;

выполняется быстрее чем:

Если а=1 Тогда
Продолжить;
КонецЕсли;

На вопрос - на сколько быстрее - не ответил...
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38595514
Последний выдох ГПЖ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист 1сУ меня тут на днях был человек (хотел 150 - а знал маловато....). Так вот он утверждал что:

Если а=1 Тогда Продолжить;КонецЕсли;

выполняется быстрее чем:

Если а=1 Тогда
Продолжить;
КонецЕсли;

На вопрос - на сколько быстрее - не ответил...

интересно за счет чего быстрее? интерпретатору проще одну строку разобрать чем 3 ?

>хотел 150 - а знал маловато...

у всех разные критерии что человек должен знать...

у одних это ходящий том "Проф. разработка" + "Весник бухгалтера" в одном лице украшенный по периметру УФ, сервисы, УПП/УТ/УНФ/ЗУП 3.0 и еще 4-5 предметных областей на уровне начальника отдела бизнес-подразделения... другие согласны если кандидат сможет одолеть левое соединение к консоли запроса... У вас какие критерии на 150?
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38595649
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Левое то одолел. А вот полное да и в скд уже тонул. Бухгалтерию вообще не знал.
Критерии - когда люди хотящие 100-110, знают на среднем уровне, а за 150 знает хуже чем они.... Причем что интересно - в % среди тех кто хотел 150, было гораздо больше тех кому бы и 100 не дал...


ps Что-то мне подсказывает, если и есть "выигрыш" то он вполне вписывается в погрешность. Либо надо эту строку 1млн раз вызывать, а в этом случае есть еще очень много мест которые влияют на производительность гораздо больше.
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38595686
Последний выдох ГПЖ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Либо надо эту строку 1млн раз вызывать, а в этом случае есть еще очень много мест которые влияют на производительность гораздо больше.

это да...

когда цикл дергает одну функцию 1 000 000 раз уже пофиг на то что можно было накопить результат в соответствии и не лопатить базу запросом... все перекрывает трамбовка в базу 800 000 записей в один РН, и 800 000 записей в другой
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38597300
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист 1сТак вот он утверждал что:
Если а=1 Тогда Продолжить;КонецЕсли;
выполняется быстрее чем:
Если а=1 Тогда
Продолжить;
КонецЕсли;
На вопрос - на сколько быстрее - не ответил...где то читал, что это связано с отладкой, отладочной инфомацией
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38597522
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоесть это быстрее только если в отладчике тестировать?
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38597732
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь обсуждается
Ускорение выполнения кода за счет расположения всех инструкций в одну строку
https://partners.v8.1c.ru/forum/topic/1134075
...
Рейтинг: 0 / 0
Запрос .Выбрать() или .Выгрузить() ?
    #38602166
vasyak319
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программист 1сНа вопрос - на сколько быстрее - не ответил...

Тем не менее, чувак прав. Другое дело, что трудно представить задачу в которой это будет реально заметно.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / Запрос .Выбрать() или .Выгрузить() ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]