|
Почему выборка из запроса передаётся целиком на клиент? | ☑ | ||
---|---|---|---|---|
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) я бы сказал, что одним запросом, если он конечно поместится в оперативку или на диск. Честно говоря, таких случаев еще не было у меня, чтобы в выборке было столько записей, чтобы рушился сервер (ну разве что один из сотрудников соединил хозрасчетный регистр с хозрасчетным вообще без отборов, но это ошибка запроса).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |