Запрос к SQL из 1С #429755


#0 by August
В 1С получаю Таблицу Значений, нужно сделать запрос к Ораклу по полученной ТЗ. Раньше было так: Работает, но долго. Вопрос! Можно ли запрос делать не в цикле, а передавать в запрос не каждый код номенклатуры, а целый массив? И как это релизовать?
#0 by August
В 1С получаю Таблицу Значений, нужно сделать запрос к Ораклу по полученной ТЗ. Раньше было так: Работает, но долго. Вопрос! Можно ли запрос делать не в цикле, а передавать в запрос не каждый код номенклатуры, а целый массив? И как это релизовать?
#1 by ДенисЧ
Сложить все коды во временную таблицу и потом использовать условие IN ?
#2 by Господин ПЖ
ппц
#3 by ShoGUN
WHERE <поле> IN ('value1', 'value2', ...)
#4 by ДенисЧ
Знаешь, что ты получишь, если у тебя будет пара тысяч кодов?
#5 by August
, value1, value2 как получить? перебрать в цикле ТЗ? там 40000 позиций...
#6 by ShoGUN
Формирование строки в любом случае будет быстрее, чем 40000 запросов в цикле. Нет?
#7 by August
скорее всего так и будет, но неужели никак больше не передать? скуль понимает только множество? массив, ТЗ не поймет?
#8 by ДенисЧ
Да, в цикле В 8ке сняли ограничения на длину строки?
#9 by H A D G E H O G s
Узнаешь имя ВТ? В SQL.
#10 by ДенисЧ
для "скуля" массив - это таблица, которую ты должен заполни ть сам.
#11 by ShoGUN
>В 8ке сняли ограничения на длину строки? Не сталкивался, скорей всего - да. Возможно COMSafeArray поймет.
#12 by H A D G E H O G s
1С-ка так и делает, если что (насколько я понял).
#13 by shuhard
архитектуру меняй, добавь в таблицу SMCARD поле 1С, один раз пробеги циклом и сделай Update  в True.
#14 by ShoGUN
+ Только тогда надо не вставлять строку в запрос, а делать хранимую процедуру и в нее передавать параметры.
#15 by August
По типу такого? --> СтрокаЗапроса = ""; Для каждого СтрокаТЗ из ТЗ
#16 by ShoGUN
Типа того.
#17 by ДенисЧ
Я его не узнаю, я его сам задам :-)
#18 by ДенисЧ
ты неправильно понял
#19 by Господин ПЖ
для начала надо знать насколько широки полномочия автора в базе оракла... может база не его, а вы тут с апдейтами носитесь... хто ж ему дасть апдейты эти делать...
#20 by ShoGUN
Может еще хитрее :) Он своими апдейтами запустит триггеры, которые полбазы переколбасят :))
#21 by August
да, базу оракла мне точно не дадут ломать))
#22 by shuhard
жаль обратный вариант, выгружаем всё из оракла и фильтруем на стороне 1С в ВТ например ?
#23 by ShoGUN
Как вариант, тоже нормально по скорости будет, хотя ОДИН правильный запрос - всё равно проще и быстрее.
#24 by August
хм, а это мысль)) и почему сам не подумал об этом... будет процентов 20 лишнего, но все равно скорее всего будет быстрее чем строку я думаю
#25 by ShoGUN
Вариант не рассматривается? ХП тебе может кто-то другой вставить...
#26 by August
жаль конечно, что скуль массивы не понимает в IN, насчет 14 не совсем понял
#27 by ShoGUN
Объект COMSafeArray в 1С. Делаешь в оракловой базе хранимую процедуру со своим запросом и передаешь в нее список через COMSafeArray.
#28 by ShoGUN
Хотя врать не буду - не пробовал.
#29 by August
Если не проблвал, ятогда тоже пока не буду, попробую сделать запрос по всей номенклатуре и отсеять в 1С уже не нужное, посмотрю на производительность, если не устроит, буду думать что то другое... всем спасибо за ответы и советы =)
#30 by shuhard
попроси для себя одну таблицу для записи на Оракле, загрузи в неё номенклатуру (код и ARTICLE), получишь максимальную скорость, отсутствие блокировок и проблем с безопасностью
#31 by ShoGUN
Блин, вот объясните мне, зачем для ЧТЕНИЯ базу корячить? А потом тыкают, что 1С кривая и всё в ней через жо...
#32 by shuhard
затем, что данные надо связывать в источнике
#33 by August
, ну допустим я выпросил для себя таблицу в оракле... какую номенклатуру я туда дожен записать? которая в 1С или которая в полной базе оракла?
#34 by ShoGUN
>затем, что данные надо связывать в источнике а запросы тогда на что, если на каждый чих отдельную таблицу плодить?
#35 by shuhard
конечно ту, которая в 1С в запросе ставишь ...
#36 by August
а дополнять мою таблицу новыми элементами, если в 1С появился новый элемент как? и самое главное когда?
#37 by ShoGUN
Извращенец.
#38 by shuhard
один раз синхронизуешь полностью. после этого подкладываешь кусочек кода при записи справочника Номенклатура, у рекордсета есть методы Insert и Update докажи, лучшего способа, чем внешний ключ на сиквеле нет
#39 by Господин ПЖ
>>у рекордсета есть методы Insert и Update угу. Только автор, сначала Update делай, потом Insert
#40 by shuhard
улыбнуло, не я один с базами мудохался
#41 by August
хм, в принципе способ тоже достаточно интересен, немного не радует перспектива внесения изменений в конфу, и действительно ли стоит это делать ради выигрыша в скорости... тем более еще не понятно насколько большой этот выигрыш будет... но способ обязательно запомню, спасибо большое!
#42 by August
учту, пасип =)
#43 by ShoGUN
Это хорошо в смысле скорости, в смысле архитектуры - оторви и выброси. Ответь на .
#44 by shuhard
на данный момент перепиши на выборку всех записей, по сравнению с открытием рекордсета в цикле выигрыш будет более чем достаточный. всё остальное для души.
#45 by August
эхъ, как приятно пообщаться с умными людьми, а то рядом с этими бухами чувствуешь себя прокаженным...
#46 by shuhard
еще раз - докажи, каждый раз перегонять на сторону сервера десятки тысяч идентичных записей - вот это оторви и брось.
#47 by ShoGUN
1С-ники порой не лучше, спроси у ПЖ :)
#48 by shuhard
про нормализацию ведь ты слышал и не раз
#49 by August
да я верю, верю)) сам пару раз встречал неадекватных 1С-ников))
#50 by shuhard
чур тебя, фиксина накличишь
#51 by August
фиксин - это обращение или ник?))
#52 by ShoGUN
Не только слышал, я не против, что _внутри_ базы нужно делать именно так. Когда работаешь с внешними данными, модифицировать их для удобства чтения - подход сомнительный.
#53 by shuhard
это жо..па, кодированием займись, всем интересен выигрыш во времени
#54 by ShoGUN
Это ник, только на форуме он - "Гений 1С"
#55 by shuhard
останемся при своих мнениях, топикстартеру теперь ясны варианты решения
#56 by Господин ПЖ
о чем меня можно спросить? О_о фиксин - это наше фсе...
#57 by ShoGUN
О дятлах, ты их "любишь".
#58 by kipon
Вы же выбираете всю номенклатуру из 8-ки, значит у вас кода идут сплошняком? может тогда запросом в 8-ке определить границы кодов, а в запросе к ораклу поставить условие типа: Хотя это будет правильно, только если кода идут сплошняком, без дырок.
#59 by Господин ПЖ
мне до пита далеко
#60 by ShoGUN
Я в курсе :) Но пита увы, не спросишь уже... По крайней мере здесь...
#61 by Господин ПЖ
если коды буквенные? В зависимости от collation хз чего вернется имхо..
#62 by kipon
В этом случае не прокатит, да.
#63 by shuhard
не прокатит, потому что код мало того что символьный, он еще и вводится принудительно, на самом деле это некий партнамбер производителя.
#64 by August
мда, интересный результат... было: запрос в цикле, номенклатуры пока порядка 10000 в тестовой базе, время выполнения 72,5 с стало: запрос по всей номенклатуре, а затем цикл по временной таблице с поиском номенклатры (есть в базе/нет в базе) теперь выполняется 127 с... причем самое большое время, порядка 70% как раз хавает этот поиск дурацкий
#65 by shuhard
[порядка 70% как раз хавает этот поиск дурацкий] т.е. выборка занимает 30 сек
#66 by Aprobator
интересный у тя запрос. А че в оракле соединений нету что ли?
#67 by РазДва
прямо в этом запросе парочка соединений
#68 by Aprobator
через where работает быстрее чем через Join?
#69 by РазДва
Это просто другой вид записи
#70 by Aprobator
т. е. система сделает те же действия, что и в случае с join?
#71 by August
В общем убрав с формы вывод наименования обрабатываемой в текущий момент времени номенклатры (которое из 120 секунд хавало 18), и сделав поиск в цикле не по справочнику, а предварительно выгрузив весь справочник во временную таблицу и поиск осущевляя по ней, достиг времени в 88 секунд...
#72 by shuhard
зачем искать, когда есть ВТ ?
#73 by August
выполнение запроса теперь занимает вообще доли секунды, всего справочника, остальное время ест обработка полученных результатов... из 88 секунд, поиск по ВТ занимает 51% времени
#74 by shuhard
не надо искать, надо связать налево
#75 by August
я уточнить хочу, ВТ = временная таблица, которая содержит весьсправочник номенклатры С, так?
#76 by ShoGUN
Зачем делать ПОИСК? Запрос к временной таблице!
#77 by shuhard
код выложи
#78 by ShoGUN
Тьфу, к ...
#79 by August
#80 by August
*щас побьют...
#81 by ShoGUN
Пля... Лучше б ты сделал...
#82 by August
))))
#83 by ShoGUN
Перебираешь рекордсет, заполняешь ТаблицуЗначений. Потом: СНАЧАЛА делаешь запрос к Ораклу, а потом уже - запрос вместе к временной таблице с данными из Оракла и к 1С.
#84 by ShoGUN
+ Вместо отдельных запросов и менеджера ВТ можно использовать пакетный запрос, так наглядней.
#85 by August
, спасиба за направление, я ни разу не делал запрос к ВТ, так что разбираться буду долго)
#86 by ShoGUN
О чем я в и сказал...
#87 by August
будет быстрее работать чем сейчас?
#88 by shuhard
угу
#89 by ShoGUN
Поиск в неиндексированной ТЗ очень сильно тормозит процесс.
#90 by August
а почему запрос к временной таблице будет намного быстрее работать нежели запрос к самому справочнику?
#91 by ShoGUN
>а почему запрос к временной таблице будет намного быстрее работать нежели запрос к самому справочнику? Кто тебе такую глупость сказал? Ты вообще понял, о чём я?
#92 by August
дык я же делал в цикле запрос к справочнику для нахождения номенклатуры,  работает еще дольше чем поиск по ТЗ
#93 by shuhard
придется бить и больно. перепиши хотя бы НайденаСтрокаНом =
#94 by ShoGUN
Мля :))) Ты понимаешь разницу между одним запросом и 40000 запросов в цикле?
#95 by ShoGUN
+1, там хотя б индекс есть.
#96 by shuhard
угу, раз не хочет ВТ и пакетный осваивать
#97 by ShoGUN
Песец ваще... Человек не понимает, зачем нужны запросы и как ими пользоваться. Писать - умеет, а пользоваться - нет.
#98 by shuhard
дык наоборот еще хуже, когда умеет, но не может
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С