|
Функция Найти() в таблицах и запрос в цикле | ☑ | ||
---|---|---|---|---|
0
Dmitry_333
02.02.19
✎
21:49
|
Всем здрасьте.
Вот какие думы обуяли меня субботним вечером:) Как я понимаю, в основе метода Найти() лежит тот же запрос. Так вот если я, допустим, перебираю элементы массива и делаю сравнение на совпадение значения элемента значению в какой-либо таблице данным методом является ли это, формально, запросом в цикле?:) |
|||
1
ДенисЧ
02.02.19
✎
21:57
|
Нет.
Найти() работает в памяти и никак не лезет к скулю. |
|||
2
Гобсек
02.02.19
✎
22:29
|
Выгрузить данные в таблицу и обращаться через Найти() и НайтиСтроки() в цикле - это один из способов избежать тормозов. Я не уверен, что это приветствуется методистами от фирмы 1С, но это работает.
|
|||
3
nicxxx
02.02.19
✎
22:31
|
(2) Таблицу не забыть проиндексировать
|
|||
4
exwill
02.02.19
✎
23:49
|
(0) "Вот придет запрос в цикле и съест тебя."
Сказка для маленьких одинесят. |
|||
5
youalex
03.02.19
✎
00:32
|
(0) Формально нет. Ссылка она и есть ссылка. Но если ты будешь искать, например, наименовние, как Найти(ссылка.Наименование) - то это будет хуже запроса в цикле.
|
|||
6
Dmitry_333
03.02.19
✎
01:16
|
Благодарю всех за разъяснения.
(1) если не затруднит, объясните, пожалуйста, что значит - "работает в памяти". |
|||
7
France
03.02.19
✎
01:33
|
(0) не мучай себя, друг.. вот тебя от разрабов бсп. https://its.1c.ru/db/v8std
|
|||
8
France
03.02.19
✎
01:34
|
(6) не верь.. работать в памяти или на диске решает не 1С а винда..
|
|||
9
France
03.02.19
✎
01:34
|
или, иже с ним
|
|||
10
Мимохожий Однако
03.02.19
✎
09:46
|
(1) Когда много цикличных операций Найти() в цикле, то есть смысл подумать о получении нужных данных через запрос к таблицам , т.к. замеры показывают неэффективность.
|
|||
11
Лефмихалыч
03.02.19
✎
10:25
|
(0) Найти() в таблице - это не запрос к БД. Но все равно Найти() в цикле по неиндексированному полю делают только мудаки
|
|||
12
exwill
03.02.19
✎
11:44
|
(11) А если поиск идет в 4-х записях?
|
|||
13
Лефмихалыч
03.02.19
✎
13:33
|
(12) тогда таблица вообще не нужна
|
|||
14
exwill
03.02.19
✎
14:15
|
(13) Можно написать 4 "если"?
А если в 14 записях? 14 раз будете писать "если"? |
|||
15
hhhh
03.02.19
✎
14:18
|
(14) сделать еще одно поле, как сумму 14 полей. По нему и искать. Это же элементарно.
|
|||
16
NorthWind
03.02.19
✎
14:19
|
С (11) не очень согласен. Экспериментально делал НайтиСтроки () по индексированному и неиндексированному полю в ТЗ размером примерно 20 000 - 40 000 тыс строк, и да, как раз в цикле. Выигрыша за счет индексации на таких выборках почти нет. 30 секунд и 33.
|
|||
17
NorthWind
03.02.19
✎
14:19
|
так что все очень "если"...
|
|||
18
Гобсек
04.02.19
✎
01:51
|
(16) Только что провел на файловой базе аналогичный эксперимент. Количество записей в таблицах 20-30 тыс. При использовании индекса отчет формируется быстрее всего на несколько секунд. 1 мин 30 сек против 1 мин 35 сек.
|
|||
19
Гобсек
04.02.19
✎
01:52
|
(18) + функция НайтиСтроки()
|
|||
20
H A D G E H O G s
04.02.19
✎
02:31
|
(18) Иногда проще сделать merge
|
|||
21
NorthWind
04.02.19
✎
22:49
|
(18) а какая разница, какая база? ТЗ же в памяти. И ее индексы тоже. Возможно, выигрыш будет на реально больших ТЗ в миллионы строк, где потребуется подгрузка страниц с диска, если 1С вообще это позволит сделать. Тут не знаю. Но на мелких НайтиСтроки работает хорошо и без индексации.
|
|||
22
NorthWind
04.02.19
✎
22:53
|
А так 1С очень своеобразно иногда реализует работу с ТЗ... Вот: http://catalog.mista.ru/public/617455/
|
|||
23
palsergeich
04.02.19
✎
22:57
|
(16) А индекс точно корректен?
Пол года делал: 30+ К строк - не индексировано = 30 сек, индексировано - меньше секунды. |
|||
24
NorthWind
04.02.19
✎
23:09
|
(23) индекс даёт прирост, но несущественный. Судить о его корректности сложно, потому что там нет никаких настроек, если я верно помню. Он, индекс, либо есть по этой колонке, либо его нет. И всегда можно поэкспериментировать. Я уверен, что могут быть случаи когда он полезен.
|
|||
25
NorthWind
04.02.19
✎
23:11
|
Кстати, ещё момент - если в таблицу идёт добавление в этом же цикле, можем получить накладные расходы на перестройку индекса. И опять же итог неоднозначен.
|
|||
26
palsergeich
04.02.19
✎
23:12
|
(24) Если он был по 1 колонке то странно.
Там в теле обработки нигде неявно не могло идти получение представления? |
|||
27
palsergeich
04.02.19
✎
23:13
|
Просто ну очнь странный результат
|
|||
28
pavig
04.02.19
✎
23:21
|
Индекс даёт существенный прирост, в разы или даже десятки раз. Проверял не раз на больших таблицах при поиске в цикле.
в (16) какая-то ошибка. Может, индекс был неправильный, или еще чего. |
|||
29
Конструктор1С
05.02.19
✎
03:01
|
(16) тут всё очень зависит от селективности индекса и количества повторений поиска. Если ищешь пять раз по полю, записи которого заведомо уникальны, то индекс не рулит. А если ищешь значения, которые повторяются по 10-50 раз на 10000, и многократно повторяешь поиск, то индекс рулит. Сама фирма 1С рекомендует обязательно индексировать колонки ТЗ, в которых многократно выполняется поиск:
https://its.1c.ru/db/v8std#content:2149184101:hdoc |
|||
30
Конструктор1С
05.02.19
✎
03:03
|
+(29) а если используется НайтиСтроки(), и проиндексированы поля под поиск, то выигрыш обязан быть.
|
|||
31
Гобсек
05.02.19
✎
04:22
|
(29) в статье по ссылке ответы из первых рук на все вопросы. Индексацию полагается делать. Хуже от этого не будет.
|
|||
32
Гобсек
05.02.19
✎
04:37
|
(21) в моем примере указаны размеры таблиц значений. Как я для себя сделал вывод, основная работа заключается в формировании табличных документов а не в операциях поиска.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |