|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Какая разница в этих методах применительно к операции выгрузки результата запроса "на сторону" (на др. сервер или в файл)? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2011, 16:41 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Выгрузить() - быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2011, 17:11 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Запрос.Выполнить.Пустой() Быстрее ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2011, 18:20 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Программист 1сЗапрос.Выполнить.Пустой() Быстрее Ну теперь совсем меня запулали своими аллегориями :-) А данные из запроса возаращаются в одинаковом формате? Например, везде у чисел будет разделитель разрядов... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2011, 12:47 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Метод .Выгрузить() выгружает в ТабличныйДокумент весь запрос ( с сервера на клиент перетаскивается весь результат запроса ), а .Выбрать() открывает типа курсора на сверере, на сколько я понимаю выполнив запрос ( данные остаются на сервере ). А вот метод .Следующий() возвращает результат по одной записи (это типа ADO Recordset). Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2011, 03:48 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
SashaMМетод .Выгрузить() выгружает в ТабличныйДокумент весь запрос ( с сервера на клиент перетаскивается весь результат запроса ), а .Выбрать() открывает типа курсора на сверере, на сколько я понимаю выполнив запрос ( данные остаются на сервере ). А вот метод .Следующий() возвращает результат по одной записи (это типа ADO Recordset). Код: plaintext
Ага, видимо так и есть http://pro1c.org.ua/index.php?showtopic=466 Основной особенностью динамических выборок является то, что они не считывают данные целиком в память, а получают их блоками по мере обхода выборки методом Следующий(). Это позволяет обходить большие объемы данных, не опасаясь, что возникнут проблемы с использованием памяти компьютера. Технологические особенности Выборка всегда считывает данные в некоторой последовательности сортировки (в одном из допустимых порядков). Обход выборки заключается в получении очередных блоков записей в соответствии с порядком и выдачи записей считанных блоков. Очередной блок считывается как множество записей, следующих в выбранном порядке после последней полученной записи предыдущего блока. Для обеспечения эффективной работы динамической выборки задание отбора и сортировки ограничены так, чтобы при обходе выборки мог быть использован один из индексов. В процессе обхода динамической выборки система считывает данные блоками по 25 записей. Для объектных данных (Справочников, Документов и т.д.) каждая запись является объектом, включающим все ее табличные части. При обращении к свойствам выборки выдаются уже считанные данные. Кроме того, при получении из выборки объекта также не происходит его повторного считывания, а используются уже считанные выборкой данные. Следует учитывать, что фактическое считывание очередного блока происходит после того, как получены (методом Следующий()) все записи считанного ранее блока. Таким образом, разработчик конфигурации не имеет контроля над актуальностью считываемой информации, даже если выборка инициирована в транзакции. При получении очередной записи нельзя различить ситуацию, когда она будет физически считана в этот момент или получена из ранее считанного блока. Очевидно, что последних ситуаций будет большинство. Для иерархических данных (Справочников, Планов видов характеристик и Планов счетов) кроме обычной выборки, инициируемой методом Выбрать, существует иерархическая выборка, инициируемая методом ВыбратьИерархически. Она отличается тем, что выдает данные путем обхода записей по уровням. То есть после выдачи элемента выдается подчиненный ему элемент, если он существует. А если подчиненного не существует, то выдается следующий элемент. Каждое считывание подчиненных элементов реализовано как считывание нового блока. Особенности использования Следует учитывать, что если в процессе обхода выборки данные изменяются (в данной сессии, или другими сессиями), то могут возникать такие ситуации, как получение данных удаленного объекта, получение в выборке одного объекта два раза, не попадание некоторых записей в выборку и т.д. Это объясняется описанными выше технологическими особенностями работы динамической выборки. Например, после считывания первого блока записей выполнено изменение одного из объектов и в результате значения полей по которым упорядочена выборка изменились. Тогда эта запись может попасть в выборку повторно, если в результате изменения она стала в порядке следования позже, чем была раньше. Если в процессе выборки выполняемой одной сессией в другой сессии объект изменился и в результате изменений в порядке выборки он стал раньше, чем был до изменения, то при определенном совпадении по времени этих процессов, объект вообще не попадет в выборку. Например, пока выборка обходила товары на букву "А", товар "Бета" переименовали в "Альфа". В этом случае, он может не "успеть" попасть в часть выборки на букву "Б" и "опоздать" попасть в часть выборки на букву "А". При использовании динамических выборок для обхода и удаления иерархических данных следует учитывать тот факт, что при удалении элемента удаляются и все его подчиненные элементы. Соответственно при использовании прямой (неиерархической) выборки в процессе удаления объекта, могут удалиться подчиненные объекты уже считанные в текущем блоке. Соответственно, при попытке выполнить какие-либо действия с полученными из выборки объектами будет выдаваться ошибка, так как в базе данных объекты уже не существуют. При использовании иерархической выборки такой проблемы не возникает, так как в один блок входят только элементы подчиненные одному родителю. Эти особенности требуют обдуманного подхода к задачам, решаемым с помощью динамических выборок. Можно рекомендовать применять выборки либо для задач, не требующих ответственного чтения множества записей, либо для регламентных задач, допускающих использование монопольного режима. В любых случаях следует внимательно относится к изменению объектов в процессе обхода динамической выборки, так как это может повлиять на порядок их включения в выборку. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2011, 07:00 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Дмирий РомановскийАга, видимо так и есть http://pro1c.org.ua/index.php?showtopic=466 Основной особенностью динамических выборок является то, что они не считывают данные целиком в память, а получают их блоками по мере обхода выборки методом Следующий(). таки отвечу спустя 3 года здесь речь идет не про запросы, а про динамичекские выборки из прикладных объектов. Из Справочников, Документов и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2014, 14:12 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
vi0, а разница то? принцип от этого не меняется ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2014, 14:37 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
javapeckervi0, а разница то? принцип от этого не меняетсяможет быть нет разницы, а может и есть сам я не пока нашел описания, как работает выборка запроса Если посмотреть профайлером MS SQL выборку из справочника Справочник.Склады.Выбрать() то можно увидеть то что описано в статье: запросы по 25 записей. Но запрос показывает свою работу только для метода Запрос.Выполнить() напрямую транслируя запрос, без порций по 25. И для метода Выборка.Следующий() профайлер молчит ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2014, 16:19 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
vi0И для метода Выборка.Следующий() профайлер молчитПотому что данные уже на сервере 1С ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2014, 20:07 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Владимир Лазуркоvi0И для метода Выборка.Следующий() профайлер молчитПотому что данные уже на сервере 1Ссогласен. поэтому и говорю, что статья не про запросы ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2014, 08:17 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
http://its.1c.ru/db/v8std#content:-2145782922:1 1. Не следует разрабатывать решения исходя из неограниченного объема оперативной памяти. Для многопользовательских систем любое неэффективное использование памяти может катастрофически сказаться на работоспособности. Следует избегать формирования больших структур данных в памяти. Если объём данных, с которыми работает бизнес-логика, сам по себе ничем не ограничен, его нужно ограничивать искусственно, обрабатывая данные порциями и сохраняя результаты в базу или файлы. 2. При потенциально неограниченных выборках данных из ИБ следует получать данные из базы порциями фиксированного размера. Например, неправильно: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка, | Номенклатура.Наименование, | Номенклатура.ВидНоменклатуры |ИЗ | Справочник.Номенклатура КАК Номенклатура"; // Выгрузка всего справочника в таблицу значений Номенклатура = Запрос.Выполнить().Выгрузить(); Для каждого ПозицияНоменклатуры Из Номенклатура Цикл // Обработка элемента справочника // ... КонецЦикла; поскольку весь результат запроса сразу помещается в память, в таблицу значений. Также неправильно: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка, | Номенклатура.Наименование, | Номенклатура.ВидНоменклатуры |ИЗ | Справочник.Номенклатура КАК Номенклатура"; РезультатЗапроса = Запрос.Выполнить(); // Обход результата запроса ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Обработка элемента выборки // ... КонецЦикла; поскольку и в этом случае при выполнении запроса его результат будет сначала считан в память целиком (*). * Примечание. Если используется 32-битная версия платформы, и размер результата запроса превосходит размер имеющейся памяти, то данные будут записаны на диск, а затем считаны оттуда в процессе вызовов Выборка.Следующий(). Правильно ограничивать результат запроса искусственно: ВсеОбработано = Ложь; Пока Истина Цикл Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1000 | Номенклатура.Ссылка, | Номенклатура.Наименование, | Номенклатура.ВидНоменклатуры |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | <условие выборки необработанных записей>"; РезультатЗапроса = Запрос.Выполнить(); ВсеОбработано = РезультатЗапроса.Пустой(); Если ВсеОбработано Тогда Прервать; КонецЕсли; // Обход порции результата запроса ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Обработка элемента выборки // ... КонецЦикла; КонецЦикла; Также правильно: Выборка = Справочники.Номенклатура.Выбрать(..., Отбор); Пока Выборка.Следующий() Цикл // Обработка элемента выборки // ... КонецЦикла; поскольку в этом случае платформа 1С:Предприятие выполняет курсорный запрос. Кроме того, число элементов выборки автоматически ограничивает платформа 1С:Предприятие в запросах динамических списков. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2014, 14:37 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
авторВыборка = Справочники.Номенклатура.Выбрать(..., Отбор); Пока Выборка.Следующий() Цикл // Обработка элемента выборки // ... КонецЦикла; поскольку в этом случае платформа 1С:Предприятие выполняет курсорный запрос. ога... только выборка будет недостоверной ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2014, 15:23 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
vi0 http://its.1c.ru/db/v8std#content:-2145782922:1 2. При потенциально неограниченных выборках данных из ИБ следует получать данные из базы порциями фиксированного размера. Мдя... vi0Правильно ограничивать результат запроса искусственно: "ВЫБРАТЬ ПЕРВЫЕ 1000 И как мне гарантированно получить остальные данные? vi0Также правильно: Выборка = Справочники.Номенклатура.Выбрать(..., Отбор); Зачем писать запрос, который потом по отбору обходить? Или сервер баз данных у нас резиновый... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2014, 15:44 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
AHDP, ты как разработчик сами должен отвечать на подобные вопросы в реальной ситуации что значит "потом" по отбору обходить? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2014, 15:59 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
vi0, Чем кроме памяти на сервере приложений 1С отличается запрос 1С от выборки? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2014, 17:11 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
AHDP, выборка транслируется в запросы SQL по 25 записей т.е. порциями ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2014, 17:41 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
У меня тут на днях был человек (хотел 150 - а знал маловато....). Так вот он утверждал что: Если а=1 Тогда Продолжить;КонецЕсли; выполняется быстрее чем: Если а=1 Тогда Продолжить; КонецЕсли; На вопрос - на сколько быстрее - не ответил... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2014, 11:12 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Программист 1сУ меня тут на днях был человек (хотел 150 - а знал маловато....). Так вот он утверждал что: Если а=1 Тогда Продолжить;КонецЕсли; выполняется быстрее чем: Если а=1 Тогда Продолжить; КонецЕсли; На вопрос - на сколько быстрее - не ответил... интересно за счет чего быстрее? интерпретатору проще одну строку разобрать чем 3 ? >хотел 150 - а знал маловато... у всех разные критерии что человек должен знать... у одних это ходящий том "Проф. разработка" + "Весник бухгалтера" в одном лице украшенный по периметру УФ, сервисы, УПП/УТ/УНФ/ЗУП 3.0 и еще 4-5 предметных областей на уровне начальника отдела бизнес-подразделения... другие согласны если кандидат сможет одолеть левое соединение к консоли запроса... У вас какие критерии на 150? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2014, 11:30 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Левое то одолел. А вот полное да и в скд уже тонул. Бухгалтерию вообще не знал. Критерии - когда люди хотящие 100-110, знают на среднем уровне, а за 150 знает хуже чем они.... Причем что интересно - в % среди тех кто хотел 150, было гораздо больше тех кому бы и 100 не дал... ps Что-то мне подсказывает, если и есть "выигрыш" то он вполне вписывается в погрешность. Либо надо эту строку 1млн раз вызывать, а в этом случае есть еще очень много мест которые влияют на производительность гораздо больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2014, 13:20 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
>Либо надо эту строку 1млн раз вызывать, а в этом случае есть еще очень много мест которые влияют на производительность гораздо больше. это да... когда цикл дергает одну функцию 1 000 000 раз уже пофиг на то что можно было накопить результат в соответствии и не лопатить базу запросом... все перекрывает трамбовка в базу 800 000 записей в один РН, и 800 000 записей в другой ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2014, 13:43 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Программист 1сТак вот он утверждал что: Если а=1 Тогда Продолжить;КонецЕсли; выполняется быстрее чем: Если а=1 Тогда Продолжить; КонецЕсли; На вопрос - на сколько быстрее - не ответил...где то читал, что это связано с отладкой, отладочной инфомацией ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2014, 17:55 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
Тоесть это быстрее только если в отладчике тестировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2014, 23:06 |
|
Запрос .Выбрать() или .Выгрузить() ?
|
|||
---|---|---|---|
#18+
здесь обсуждается Ускорение выполнения кода за счет расположения всех инструкций в одну строку https://partners.v8.1c.ru/forum/topic/1134075 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2014, 10:08 |
|
|
start [/forum/topic.php?fid=28&fpage=35&tid=1519468]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
95ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 184ms |
0 / 0 |