Имя: Пароль:
1C
 
Почему выборка из запроса передаётся целиком на клиент?
0 DTX 4th
 
18.12.18
17:08
Насколько мне известно, скуль, например, передаёт пачку строк на клиент, клиент построчно их читает и просит ещё одну порцию. А 1С без разбора всё отдаёт на клиент...
Вот пруф для скуля:
https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms187602(v=sql.105)
1 Tonik992
 
18.12.18
17:11
"А 1С без разбора всё отдаёт на клиент.." как вы пришли к такому выводу?
2 Волшебник
 
18.12.18
17:12
(0) 1С тоже выдаёт порциями
3 DTX 4th
 
18.12.18
17:14
(1) (2) Написал вот такую обработку:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    РН.Регистратор
    |ИЗ
    |    РегистрНакопления.Регистр КАК РН";
    РезультатЗапроса = Запрос.Выполнить();
    
    Выборка = РезультатЗапроса.Выбрать();
    Возврат;
КонецПроцедуры

Дальше в диспетчере я вижу как оперативка растёт на 200мб, а потом сразу же уменьшается до первоначального значения.
4 Alexandr_U1982
 
18.12.18
17:17
(3) А зачем ты старье-то рассматриваешь? Ты в тонком клиенте на управляемых формах протестируй.
5 timurhv
 
18.12.18
17:17
(3) Обычные формы?
6 Волшебник
 
18.12.18
17:19
(3) Может там порции по 200 Мб?
7 DTX 4th
 
18.12.18
17:27
(5) Да

В УФ вроде такого нет. Хотя в СП всё равно предупреждают о выборках "очень большого размера (64мб)"...

Примечание:

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


ОФ т.е. не поддерживают подобное?
8 Tonik992
 
18.12.18
17:29
(3) Оперативка растет.
Еще не факт, что это пространство занято 1Ской. Или вы точно в этом убеждены?
9 Tonik992
 
18.12.18
17:32
(8) а, ну да. Там же явно видно, что 1Ска.
10 Tonik992
 
18.12.18
17:35
Нашел здесь вот что:
https://its.1c.ru/db/v8std/content/2149184374/hdoc

Также неправильно:
.....
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

КонецЦикла;

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

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

Даже не думай сравнивать. Это разные программы. И предназначены для целей.
12 Alexandr_U1982
 
18.12.18
17:43
(10)Читай дальше, там написано, как получать данные порциями.
ВсеОбработано = Ложь;
Пока Истина Цикл
Запрос = Новый Запрос;
Запрос.Текст =
  "ВЫБРАТЬ ПЕРВЫЕ 1000
  | Номенклатура.Ссылка,
  | Номенклатура.Наименование,
  | Номенклатура.ВидНоменклатуры
  |ИЗ
  | Справочник.Номенклатура КАК Номенклатура
  |ГДЕ
  | <условие выборки необработанных записей>";

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

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

КонецЦикла;
13 Tonik992
 
18.12.18
18:33
(12) Мы тут об ms sql
14 Alexandr_U1982
 
18.12.18
18:38
(13) Ну вы нашли что сравнить: ms sql и 1С )))
15 Eiffil123
 
18.12.18
18:40
А собственно, почему оно должно отдаваться порциями? Скуль отдает серверу 1С все данные. Если они более 64Мб - они помещаются во временный файл, если менее - держатся в памяти (из-за этого кстати не рекомендуется выгружать результат запроса в ТЗ).
16 Alexandr_U1982
 
18.12.18
18:42
(0)(13) У 1С есть средства, чтобы получать данные порциями, либо одним большим куском. И разработчик решает, в каком случае как ему получать данные. В статье из (10) об этом собственно и написано.
17 Eiffil123
 
18.12.18
18:42
(12) запрос в цикле. Несите миксер для глаз
18 timurhv
 
18.12.18
18:44
Самое узкое место в 1С - оперативная память, все остальное уже поправили.
В 99.9% - пренебрегаю рекомендацией, не такие объемы.
19 Tonik992
 
18.12.18
18:46
(17) Раз уж мы тут собрались.

Что будет эффективнее (быстродействие и производительность), вытаскивать из справочника Номенклатура миллион записей одним запросом (5-10 полей), или же в цикле каким-то порциями?
20 Alexandr_U1982
 
18.12.18
18:46
(17) И? Здесь цикл используется для разделения данных на порции.
Кстати, этот кусок кода из статьи на ИТС.
https://its.1c.ru/db/v8std/content/2149184374/hdoc
21 Eiffil123
 
18.12.18
19:14
(19) я бы сказал, что одним запросом, если он конечно поместится в оперативку или на диск. Честно говоря, таких случаев еще не было у меня, чтобы в выборке было столько записей, чтобы рушился сервер (ну разве что один из сотрудников соединил хозрасчетный регистр с хозрасчетным вообще без отборов, но это ошибка запроса).