|
Что быстрее? НайтиПоРеквизиту или Запрос? | ☑ | ||
---|---|---|---|---|
0
Кокос
22.02.13
✎
16:15
|
Сабж. Надо подгрузить из экселя один реквизит в мульон договоров БП20.
|
|||
1
Aswed
22.02.13
✎
16:17
|
Запрос
|
|||
2
MSII
22.02.13
✎
16:18
|
Прочитать значения реквизитов из файла, запихать массив и одним запросом выбрать все договоры.
|
|||
3
Ksandr
22.02.13
✎
16:18
|
Только не запрос в цикле :)
|
|||
4
MSII
22.02.13
✎
16:20
|
(3) А НайтиПоРеквизиту - это как раз оно. Так что при всем богатстве выбора запросу альтернативы нет.
|
|||
5
EvgeniuXP
22.02.13
✎
16:23
|
(0) а что быстрее: установить отбор использовать() или установить параметр в динамическом списке? :)
|
|||
6
Кокос
22.02.13
✎
16:26
|
&НаСервере
Процедура ЗагрузитьКодыМакономиНаСервере(КаталогИБ) ИмяФайла=КаталогИБ+"\..\..\..\romix_test1.txt"; fso=Новый COMОбъект("Scripting.FileSystemObject"); file=fso.OpenTextFile(ИмяФайла, 1, 0, 0); //Открываем файл в режиме "только чтение" Запрос = Новый Запрос; ЗАпрос.Текст = "ВЫБРАТЬ | ДоговорыКонтрагентов.Ссылка |ИЗ | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов |ГДЕ | ДоговорыКонтрагентов.Владелец.ВнешнийКод = &ВнКод | И ДоговорыКонтрагентов.Наименование = &Имя"; стр=file.ReadLine(); ВнешнийКод ="";Договор="";КодМакономи=""; Пока file.AtEndOfStream=0 Цикл стр=file.ReadLine(); Поз = найти(Стр,";"); Если Поз >1 Тогда ВнешнийКод = СокрЛП(Лев(Стр,Поз-1)); Иначе Продолжить; КонецЕсли; ОстатокСтр = Сред(Стр,Поз+1); Поз = найти(ОстатокСтр,";"); Если Поз >1 Тогда Договор = СокрЛП(Лев(ОстатокСтр,Поз-1)); Иначе Продолжить; КонецЕсли; ОстатокСтр = Сред(ОстатокСтр,Поз+1); Поз = найти(ОстатокСтр,";"); Если Поз >1 Тогда КодМакономи = СокрЛП(Лев(ОстатокСтр,Поз-1)); Иначе Продолжить; КонецЕсли; Запрос.УстановитьПараметр("ВнКод",ВнешнийКод); Запрос.УстановитьПараметр("Наименование",Договор); ТДог = Запрос.Выполнить().Выгрузить(); Если ТДог.Количество() > 0 Тогда оДок = ТДог[0].ссылка.ПолучитьОбъект(); оДок.КодМакономи = КодМакономи; оДок.Записать(); Иначе сКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ВнешнийКод",ВнешнийКод); оВлад = Неопределено; Если сКонтрагент.Пустая() Тогда Продолжить; КонецЕсли; оДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); оДоговор.Наименование = Договор; оДоговор.Владелец = сКонтрагент; оДоговор.КодМакономи = КодМакономи; оДоговор.Организация = ЭтаФорма.Организация.Ссылка; оДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить().Ссылка; оДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем; оДоговор.Записать(); КонецЕсли; //Сообщить(стр); КонецЦикла; file.Close(); КонецПроцедуры &НаКлиенте Процедура Вып(Команда) ЗагрузитьКодыМакономиНаСервере(НСтр(СтрокаСоединенияИнформационнойБазы(), "File")); КонецПроцедуры щаз буду тестировать на 10 записях. а потом на ночь оставлю... |
|||
7
Кокос
22.02.13
✎
16:27
|
а такое запросом без перебора можно сделать?:)
|
|||
8
Reset
22.02.13
✎
16:30
|
етить, хотя бы
оДоговор.Организация = ЭтаФорма.Организация.Ссылка; оДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить().Ссылка; из цикла вытащи и .ссыка убери tt |
|||
9
Reset
22.02.13
✎
16:31
|
точнее второе вытащить, а первое просто точку убрать
|
|||
10
Кокос
22.02.13
✎
16:31
|
(8) .ссыка у меня это привычка :))
|
|||
11
rs_trade
22.02.13
✎
16:32
|
Стесняюсь спрсить. А НайтиПоРеквизиту это не запрос?
|
|||
12
EvgeniuXP
22.02.13
✎
16:32
|
(0) запрос в 8.1 выполняется за 8 секунд, тот же самый запрос на 8.3 - выполняется минуту :) 8.3 вывод: самая ужасная платформа :)
|
|||
13
Reset
22.02.13
✎
16:32
|
(7) Сначала все "Договор"(где строковое имя) в таблицу вытащить, а потом 1 запрос
|
|||
14
Classic
22.02.13
✎
16:32
|
(0)
Найти по реквизиту - вообще штука стремная при больших наборах данных. Лучше уже извращаться с параллельным обходом |
|||
16
H A D G E H O G s
22.02.13
✎
16:34
|
(12) Байки.
|
|||
17
EvgeniuXP
22.02.13
✎
16:37
|
(15) нет не байки, возьми один документ и выбери у него два реквизита и ссылку, тут же объедини с другим видом документа, выбери те же два реквизита и свою ссылку, потом сгруппируй получившийся результат по двум реквизитам и выведи итог в дерево.
Запрос1 Объединить Запрос 2 ИТОГИ через СКД те же 8 секунд, через консоль - минута, может чуть более. |
|||
18
EvgeniuXP
22.02.13
✎
16:38
|
(17) выведи иерархию всю с итогами.
|
|||
19
ВалераОшкин
22.02.13
✎
16:39
|
(0) НайтиПоРеквизиту быстрее, если ищешь не в цикле.
Если надо искать в цикле, лучше пиши запрос, который обработает весь свод информации без цикла. |
|||
20
Ksandr
22.02.13
✎
16:39
|
Кокос похоже romix, но почему-то Кокос :)
|
|||
21
Кокос
22.02.13
✎
16:39
|
(20) это я из книги знаний мисты взял код :)
|
|||
22
H A D G E H O G s
22.02.13
✎
16:40
|
(17) Делать мне больше нечего, повторяя ваши глупые тесты.
|
|||
23
H A D G E H O G s
22.02.13
✎
16:40
|
Как ни удивительно, но ВалераОшкин сегодня прав, именно в ситуации (19).
|
|||
24
rs_trade
22.02.13
✎
16:41
|
(19) <<НайтиПоРеквизиту быстрее, если ищешь не в цикле.
А почему быстрее? |
|||
25
Кокос
22.02.13
✎
16:41
|
||||
26
Кокос
22.02.13
✎
16:42
|
мне не просто искать нужно. мне еще нужно "если нет то создать" :)
|
|||
27
GANR
22.02.13
✎
16:42
|
(0) Ставим вопрос по другому: план запроса для НайтиПоРеквизиту и Запрос какой? Операция SEEK быстрее SCAN. А вообще можно мини-конфигурашку сделать, рандомом генерировать 20000-50000 элементов справочника и проверить.
|
|||
28
ВалераОшкин
22.02.13
✎
16:44
|
(24) Потому, что НайтиПоРеквизиту это встроенный запрос платформы
|
|||
29
Кокос
22.02.13
✎
16:45
|
(27) = > (6) 500 000 строк :)
|
|||
30
rs_trade
22.02.13
✎
16:46
|
(28) Ого. А чем встроенный запрос лучше не встроенного? Почему он быстрее будет искать?
|
|||
31
GANR
22.02.13
✎
16:47
|
(29) А убрать запрос из цикла нельзя??? Выборка.Сбросить() с Выборка.НайтиСледующий() пошустрее существенно.
|
|||
32
Ksandr
22.02.13
✎
16:47
|
Значение уникально?
|
|||
33
Кокос
22.02.13
✎
16:48
|
(31) а с параметрами как быть?:)
|
|||
34
Кокос
22.02.13
✎
16:50
|
(32) уникален ВнешнийКод и ИмяДоговора. Вообще это номер счета. а у них договор = счет.
|
|||
35
ВалераОшкин
22.02.13
✎
16:52
|
(30) Сам подумай, все тебе разжевывать надо :)
|
|||
36
Кокос
22.02.13
✎
16:52
|
я просто через КД грузил и он у меня при загрузке всех договоров валился. я поставил договора по ссылке. все загрузил. теперь подгружаю левым способом через текстовик сами договора. молюсь чтобы это все влезло в файловую БП30
|
|||
37
ВалераОшкин
22.02.13
✎
16:54
|
(23) Спасибо, я буду гордиться, что сам H A D G E H O G s меня похвалил :0)
|
|||
38
Ksandr
22.02.13
✎
17:02
|
Вот Вам почва для размышлений
https://dl.dropbox.com/u/39913355/Снимок.PNG 1. Поиск по реквизиту 2. Запрос по реквизиту 3. Запрос по массиву значений и поиск по единственному 4. Тоже что и 3, но выгрузка в ТЗ, добавление индекса колонке и поиск |
|||
39
GANR
22.02.13
✎
17:02
|
(33) Вот так:
&НаСервере Процедура ЗагрузитьКодыМакономиНаСервере(КаталогИБ) ИмяФайла=КаталогИБ+"\..\..\..\romix_test1.txt"; fso=Новый COMОбъект("Scripting.FileSystemObject"); file=fso.OpenTextFile(ИмяФайла, 1, 0, 0); //Открываем файл в режиме "только чтение" Запрос = Новый Запрос; ЗАпрос.Текст = "ВЫБРАТЬ | ДоговорыКонтрагентов.Ссылка КАК Ссылка, | ДоговорыКонтрагентов.Владелец.ВнешнийКод КАК ВнешнийКод, | ДоговорыКонтрагентов.Наименование КАК Наименование |ИЗ | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов"; ВыборкаДоговоры = Запрос.Выполнить().Выбрать(); ОтборДоговоры = Новый Структура("ВнешнийКод, Наименование"); Запрос = Новый Запрос; ЗАпрос.Текст = "ВЫБРАТЬ | Контрагенты.Ссылка, | Контрагенты.ВнешнийКод КАК ВнешнийКод |ИЗ | Справочник.Контрагенты КАК Контрагенты"; ВыборкаКонтрагенты = Запрос.Выполнить().Выбрать(); ОтборКонтрагент = Новый Структура("ВнешнийКод"); стр=file.ReadLine(); ВнешнийКод ="";Договор="";КодМакономи=""; Пока file.AtEndOfStream=0 Цикл стр=file.ReadLine(); Поз = найти(Стр,";"); Если Поз >1 Тогда ВнешнийКод = СокрЛП(Лев(Стр,Поз-1)); Иначе Продолжить; КонецЕсли; ОстатокСтр = Сред(Стр,Поз+1); Поз = найти(ОстатокСтр,";"); Если Поз >1 Тогда Договор = СокрЛП(Лев(ОстатокСтр,Поз-1)); Иначе Продолжить; КонецЕсли; ОстатокСтр = Сред(ОстатокСтр,Поз+1); Поз = найти(ОстатокСтр,";"); Если Поз >1 Тогда КодМакономи = СокрЛП(Лев(ОстатокСтр,Поз-1)); Иначе Продолжить; КонецЕсли; ОтборДоговоры.ВнешнийКод = ВнешнийКод; ОтборДоговоры.Наименование = Договор; ВыборкаДоговоры.Сбросить(); Если ВыборкаДоговоры.НайтиСледующий(отборДоговоры) Тогда оДок = ВыборкаДоговоры.ссылка.ПолучитьОбъект(); оДок.КодМакономи = КодМакономи; оДок.Записать(); Иначе ВыборкаКонтрагенты.Сбросить(); ОтборКонтрагент.ВнешнийКод = ВнешнийКод; оВлад = Неопределено; Если Не ВыборкаКонтрагенты.НайтиСледующий(ОтборКонтрагент) Тогда Продолжить; Иначе сКонтрагент = ВыборкаКонтрагенты.Ссылка; КонецЕсли; оДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); оДоговор.Наименование = Договор; оДоговор.Владелец = сКонтрагент; оДоговор.КодМакономи = КодМакономи; оДоговор.Организация = ЭтаФорма.Организация.Ссылка; оДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить().Ссылка; оДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем; оДоговор.Записать(); КонецЕсли; //Сообщить(стр); КонецЦикла; file.Close(); КонецПроцедуры &НаКлиенте Процедура Вып(Команда) ЗагрузитьКодыМакономиНаСервере(НСтр(СтрокаСоединенияИнформационнойБазы(), "File")); КонецПроцедуры |
|||
40
Кокос
22.02.13
✎
17:04
|
(39) спасибо за урок. Буду теперь всегда так делать. :)
|
|||
41
ВалераОшкин
22.02.13
✎
17:04
|
(38) в базе, естественно, никто не работает?
|
|||
42
ВалераОшкин
22.02.13
✎
17:05
|
(39) Это столько буков надо написать, чтобы найти по реквизиту? :)
|
|||
43
Ksandr
22.02.13
✎
17:05
|
(41) Файловый вариант, никто не работает
|
|||
44
ВалераОшкин
22.02.13
✎
17:06
|
(43) А нормальные пацаны про файловый вариант и не знают...
|
|||
45
GANR
22.02.13
✎
17:06
|
(40)+(39) Это Константы.ВалютаРегламентированногоУчета.Получить().Ссылка
и это Перечисления.ВидыДоговоровКонтрагентов.СПокупателем являются скрытыми запросами в цикле (см. замер производительности) - их надо за пределами цикла 1 раз получить и подставлять оДоговор.ВалютаВзаиморасчетов = пВалютаВзаиморасчетов; оДоговор.ВидДоговора = пВидДоговораСПокупателем; |
|||
46
ВалераОшкин
22.02.13
✎
17:08
|
+(44) ты так не смеши больше с файловым вариантом и производительностью. Ладно?
|
|||
47
Ksandr
22.02.13
✎
17:14
|
(46) Расскажи про разницу в относительных измерениях, а я следом выложу скрин клиент-сервер с 20 пользователями онлайн
|
|||
48
Ksandr
22.02.13
✎
17:15
|
Подсказка - существенные отличия только в одной цифре - в какой?
|
|||
49
rs_trade
22.02.13
✎
17:24
|
(35) Подумал. Не придумал. Разжуй пожалуйста.
|
|||
50
Ksandr
22.02.13
✎
17:27
|
в дополнение к (38)
клиент-сервер (32 бита, СУБД MS SQL 2008), 20 пользователей онлайн https://dl.dropbox.com/u/39913355/Снимок2.PNG |
|||
51
EvgeniuXP
22.02.13
✎
21:32
|
(22) тогда не надо утверждать - "Байки" :)
|
|||
52
GANR
23.02.13
✎
11:40
|
(40) И ещё, в отличии от (6) (39) не найдет созданные в цикле элементы, поэтому при создании нового договора и контрагента их нужно добавлять в кэш (массив, соответствие) и искать их там дальше по ключу ВнешниКод для контрагент и ВнешнийКод + СимволКоторыйНеМожетПрисутствоватьВДоговорИНаименование+Наименование для договоров. Это позволит избежать задвоения.
|
|||
53
Кокос
23.02.13
✎
12:04
|
(52) ну в данном случае я думаю этого не произойдет. в исходной таблице по определению нет задвоений. А так всё прошло ок. Часа за два загрузилось.
|
|||
54
Кокос
23.02.13
✎
12:04
|
а новые контрагенты не создаются ибо всё подгрузилось через КД. надо было только договора подгрузить.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |