powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / Проблема с импортом из Oracle
18 сообщений из 18, страница 1 из 1
Проблема с импортом из Oracle
    #36520455
Kembreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Проблема такова:

На MS SQL развернута база 1С 8.2. Старая учетная система живет на Oracle, по ораклу спец в конфронтации, соотвественно за помощью к нему не обратиться. Да и нужно-то всего пара таблиц. НО
Таблица здоровенная (ну, по моим понятиям). Миллионов 100 записей там точно есть. Поэтому попытка создать Recordset проваливается

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Соединение = Новый COMОбъект    ("OracleInProcServer.XOraSession");
	
	Попытка
		МоеСоединение=Соединение.OpenDatabase("MyBaseName","Login/Pass", 0  );
		Сообщить( "Соединение с базой данных Oracle установленно" );
		ТекстЗапроса="select  * from BONDS where FULLBONDNUM like 'FB%'";
		НаборЗаписей=МоеСоединение.CreateDynaset(ТекстЗапроса, 0 );
		Сообщить("Получен набор записей "+ТекущаяДата());
		Сообщить("Всего записей "+НаборЗаписей.RecordCount());

Если в запросе указать доп. условие ROWNUM <= 4000000 то все живет и работает. 4кк установлено опытным путем, при пяти миллионах уже падает с мотивацией "Сервер разорвал соединение". Соответственно понятно что его не устраивает либо количество строк в результирующей таблице, либо размер ее же в памяти.

Из 15 полей мне нужно 13, поэтому перечислять поля смысла не вижу. Можно конечно запомнить ID последней строки в запросе и в следующем переборе плясать от него, но меня учили что "запрос в цикле выполнять нехорошо" и все естество этому противится.

Если какие либо приемлемые варианты решения моей проблемы? В ответах прошу учесть что мое знание Оракла ограничено "запускаем Toad и смотрим нужные таблички и поля". Всем заранее спасибо :)
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36520470
Господин ПЖ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по идее - обход через курсор, но как это будет в реалии выглядеть в ado - хз
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36520475
Господин ПЖ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще вариант - порезать данные порциями во временные таблицы и читать оттуда - если конечно права есть
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36520571
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KembregМожно конечно запомнить ID последней строки в запросе и в следующем переборе плясать от него,
но меня учили что "запрос в цикле выполнять нехорошо" и все естество этому противится.Вот именно так и надо сделать, вас учили неправильно.
Нужно хорошо подумать, перед написанием запроса в цикле, но иногда писать такие запросы очень хорошо.

См. FAQ Постраничная выборка данных
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36520773
Нет реги
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы попробовал поиграть со вторым парамтром в CreateDynaset. Например так:
Код: plaintext
1.
НаборЗаписей=МоеСоединение.CreateDynaset(ТекстЗапроса, 8 );
Ну и наверное read-only флаг тоже улучшит ситуацию. Почитать о методе CreateDynaset можно здесь: http://download.oracle.com/docs/cd/B14117_01/win.101/b10118/o4o00318.htm
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36520886
KuzEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я когда-то воспользовался статьей:
http://www.oracle.com/global/ru/oramag/mayjune2007/w_dev_asktom56.html. Очень помогло.
В вашем случае рекомендую обратить внимание на часть статьи с заголовком Разбивка на страницы с использованием столбца ROWNUM .
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521017
Нет реги
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зачем извращения со страницами? Автору нужны ВСЕ строки, а не какой-то кусочек для отображения в интерфейсе.
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521033
KuzEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет реги,

не путайте Автора, читайте всю статью :-)
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521038
KuzEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы еще с таймаутом запроса поиграл.
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521061
KuzEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kembreg, а что мешает написать так?
select count(s.BONDS) from
(select * from BONDS as "c" where FULLBONDNUM like 'FB%') s
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521111
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет региЗачем извращения со страницами? Автору нужны ВСЕ строки, а не какой-то кусочек для отображения в интерфейсе. А если вам нужно скопировать ВЕСЬ ЦЕЛИКОМ файл размером 100 Гб,
вы его сначала весь прочитаете в оперативную память размером 2 Гб, а только потом запишете на жесткий диск??? Интересно, как вы это сделаете...
Или все-таки будете копировать по кусочкам?
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521183
Нет реги
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какие интересные у вас представления о работе СУБД Oracle с курсорами. Значит по-вашему результат любого запроса всегда целиком хранится в ОЗУ сервера? То есть даже отсортировать таблицу, которая не помещается в ОЗУ невозможно? А может и клиенту нельзя результат запроса построчно отдавать, а только сразу ВСЕ ЦЕЛИКОМ 100 Гб?
Клиент и так получает данные построчно. Какие еще страницы? Зачем? Нам нужны все строки и мы получаем их по одной, точка. Все что нужно сделать это отключить ненужные фичи рекордсета типа кэширования на клиенте и возможности апдейтов.
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521542
Kembreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KuzEvKembreg, а что мешает написать так?
select count(s.BONDS) from
(select * from BONDS as "c" where FULLBONDNUM like 'FB%') s

Мешают слабые знания Оракла вообще и SQL в частности, я завуалированно в первом сообщении дал понять :) Ну то есть у меня в голове таблица примерных соответствий 'SQL vs Язык запросов 1С' есть, а вот полноты картины пока увы. Я впитывать знания люблю, но в условиях жесткого дедлайна обычно выясняется что "впитывать" нужно было вчера, а щас нужно делать.

Всех внимательно читаю, ночью натравлю на базу, завтра думаю вопрос закроется

8 это ORADYN_NOCACHE (&H8&), я правильно понял?
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521543
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет реги,
Я ставил эксперимент с MS SQL Server, один и тот же простой запрос, получал всего 100 000 строк данных,
в одном случае с использованием клиентского курсора, в другом случае - серверного. Серверный курсор оказался в 20 раз медленнее.
Причем пропорция практически не меняется в зависимости от кэширования данных сервером (1-й или последующие запуски запроса),
ни в зависимости от количества данных, 10 000 строк - тоже в 20 раз.
Вывод - серверные курсоры для MS SQL Server вызывают значительное падение производительности, их использование допустимо только в самом крайнем случае.
Мне такие случаи не встречались.
Возможно в Oracle все по-другому, но я бы это как минимум проверил, или вообще не стал бы рисковать.
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36521636
Нет реги
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kembreg8 это ORADYN_NOCACHE (&H8&), я правильно понял?
Да. Пожалуй лучше даже использовать комбинацию ORADYN_NOCACHE и ORADYN_READONLY т. е. 12 (или C в шестнадцатеричной системе).
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36527319
Фотография valex13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает Вам с использованием мастра импорта/экспорт данных перелить таблицу скажем из Oracle в MS SQL? (Выберите базу данных/Tasks/Import data). MS SQL за Вас решит проблему с перекачиванием данных с разбивкой по блокам и транзакциями. А в дальнейшем, хотелось бы знать, зачем под 1С иметь таблицу размером 100 млн. срок. 1С точно не справиться с такой нагрузкой. Я правильно понял, что Вы данные в структуру таблиц 1С закачиваете?
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36527696
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valex13А что мешает Вам с использованием мастра импорта/экспорт данных перелить таблицу скажем из Oracle в MS SQL? (Выберите базу данных/Tasks/Import data). MS SQL за Вас решит проблему с перекачиванием данных с разбивкой по блокам и транзакциями. А в дальнейшем, хотелось бы знать, зачем под 1С иметь таблицу размером 100 млн. срок. 1С точно не справиться с такой нагрузкой. Я правильно понял, что Вы данные в структуру таблиц 1С закачиваете?

да справиться со 100 млн. просто в зависимости от задач производимых над таблицей возможно прийдётся использовать прямой доступ ну и из-за архитектуры это будет не сильно просто и дороговато в поддержке
...
Рейтинг: 0 / 0
Проблема с импортом из Oracle
    #36532719
Kembreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
valex13 А в дальнейшем, хотелось бы знать, зачем под 1С иметь таблицу размером 100 млн. срок. 1С точно не справиться с такой нагрузкой. Я правильно понял, что Вы данные в структуру таблиц 1С закачиваете?

Ну есть задача от руководства - "Уходим от самописной конфы который писал гений-самоучка" и которую никто кроме этого гения поддерживать не в состоянии на что-то более приземленное.

От 100 млн записей осталось 10, что пока вполне приемлемо. Сложных кубов по этой табличке (она одна такая) никто разворачивать не будет, используется она не очень интенсивно, но быть должна именно такой, велосипед изобретать не буду..

Задачу решил таким образом... Внимательно прочитав все что мне тут посоветовали увидел ошибку в запросе (у меня Rownum применялся ДО сортировки) и видоизменил его следующим образом

Код: plaintext
ТекстЗапроса="select  * from (Select * From BONDS where FULLBONDNUM like '8%' AND ID_BOND >= "+Формат(Константы.ПоследнийID.Получить(),"ЧГ=0")+" ORDER BY ID_BOND)"+" WHERE ROWNUM <= 4000000" ;

После этого дважды жамкнул на кнопку "выполнить" и получил свои 7кк записей. Тривиально, но действенно, все отписавшимся спасибо
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / Проблема с импортом из Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]