Вход | Регистрация
 

Почему выборка из запроса передаётся целиком на клиент?

Почему выборка из запроса передаётся целиком на клиент?
Я
   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)
 
 
   Tonik992
 
1 - 18.12.18 - 17:11
"А 1С без разбора всё отдаёт на клиент.." как вы пришли к такому выводу?
   Волшебник
 
2 - 18.12.18 - 17:12
(0) 1С тоже выдаёт порциями
   DTX 4th
 
3 - 18.12.18 - 17:14
(1) (2) Написал вот такую обработку:
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    РН.Регистратор
    |ИЗ
    |    РегистрНакопления.Регистр КАК РН";
    РезультатЗапроса = Запрос.Выполнить();
    
    Выборка = РезультатЗапроса.Выбрать();
    Возврат; 
КонецПроцедуры

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

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

Примечание:

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


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

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

 КонецЦикла;

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

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

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

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

// Обход порции результата запроса

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

  // ...

 КонецЦикла;

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует