Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / [игнор отключен] [закрыт для гостей] / Проблема с импортом из Oracle / 18 сообщений из 18, страница 1 из 1
15.03.2010, 11:57
    #36520455
Kembreg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
Доброго времени суток. Проблема такова:

На 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
15.03.2010, 12:01
    #36520470
Господин ПЖ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
по идее - обход через курсор, но как это будет в реалии выглядеть в ado - хз
...
Рейтинг: 0 / 0
15.03.2010, 12:02
    #36520475
Господин ПЖ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
еще вариант - порезать данные порциями во временные таблицы и читать оттуда - если конечно права есть
...
Рейтинг: 0 / 0
15.03.2010, 12:40
    #36520571
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
KembregМожно конечно запомнить ID последней строки в запросе и в следующем переборе плясать от него,
но меня учили что "запрос в цикле выполнять нехорошо" и все естество этому противится.Вот именно так и надо сделать, вас учили неправильно.
Нужно хорошо подумать, перед написанием запроса в цикле, но иногда писать такие запросы очень хорошо.

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

не путайте Автора, читайте всю статью :-)
...
Рейтинг: 0 / 0
15.03.2010, 14:51
    #36521038
KuzEv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
Я бы еще с таймаутом запроса поиграл.
...
Рейтинг: 0 / 0
15.03.2010, 14:58
    #36521061
KuzEv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
Kembreg, а что мешает написать так?
select count(s.BONDS) from
(select * from BONDS as "c" where FULLBONDNUM like 'FB%') s
...
Рейтинг: 0 / 0
15.03.2010, 15:15
    #36521111
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
Нет региЗачем извращения со страницами? Автору нужны ВСЕ строки, а не какой-то кусочек для отображения в интерфейсе. А если вам нужно скопировать ВЕСЬ ЦЕЛИКОМ файл размером 100 Гб,
вы его сначала весь прочитаете в оперативную память размером 2 Гб, а только потом запишете на жесткий диск??? Интересно, как вы это сделаете...
Или все-таки будете копировать по кусочкам?
...
Рейтинг: 0 / 0
15.03.2010, 15:34
    #36521183
Нет реги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
Какие интересные у вас представления о работе СУБД Oracle с курсорами. Значит по-вашему результат любого запроса всегда целиком хранится в ОЗУ сервера? То есть даже отсортировать таблицу, которая не помещается в ОЗУ невозможно? А может и клиенту нельзя результат запроса построчно отдавать, а только сразу ВСЕ ЦЕЛИКОМ 100 Гб?
Клиент и так получает данные построчно. Какие еще страницы? Зачем? Нам нужны все строки и мы получаем их по одной, точка. Все что нужно сделать это отключить ненужные фичи рекордсета типа кэширования на клиенте и возможности апдейтов.
...
Рейтинг: 0 / 0
15.03.2010, 17:18
    #36521542
Kembreg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
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
15.03.2010, 17:18
    #36521543
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
Нет реги,
Я ставил эксперимент с MS SQL Server, один и тот же простой запрос, получал всего 100 000 строк данных,
в одном случае с использованием клиентского курсора, в другом случае - серверного. Серверный курсор оказался в 20 раз медленнее.
Причем пропорция практически не меняется в зависимости от кэширования данных сервером (1-й или последующие запуски запроса),
ни в зависимости от количества данных, 10 000 строк - тоже в 20 раз.
Вывод - серверные курсоры для MS SQL Server вызывают значительное падение производительности, их использование допустимо только в самом крайнем случае.
Мне такие случаи не встречались.
Возможно в Oracle все по-другому, но я бы это как минимум проверил, или вообще не стал бы рисковать.
...
Рейтинг: 0 / 0
15.03.2010, 17:48
    #36521636
Нет реги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
Kembreg8 это ORADYN_NOCACHE (&H8&), я правильно понял?
Да. Пожалуй лучше даже использовать комбинацию ORADYN_NOCACHE и ORADYN_READONLY т. е. 12 (или C в шестнадцатеричной системе).
...
Рейтинг: 0 / 0
18.03.2010, 04:09
    #36527319
valex13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
А что мешает Вам с использованием мастра импорта/экспорт данных перелить таблицу скажем из Oracle в MS SQL? (Выберите базу данных/Tasks/Import data). MS SQL за Вас решит проблему с перекачиванием данных с разбивкой по блокам и транзакциями. А в дальнейшем, хотелось бы знать, зачем под 1С иметь таблицу размером 100 млн. срок. 1С точно не справиться с такой нагрузкой. Я правильно понял, что Вы данные в структуру таблиц 1С закачиваете?
...
Рейтинг: 0 / 0
18.03.2010, 10:48
    #36527696
Last1Cmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
valex13А что мешает Вам с использованием мастра импорта/экспорт данных перелить таблицу скажем из Oracle в MS SQL? (Выберите базу данных/Tasks/Import data). MS SQL за Вас решит проблему с перекачиванием данных с разбивкой по блокам и транзакциями. А в дальнейшем, хотелось бы знать, зачем под 1С иметь таблицу размером 100 млн. срок. 1С точно не справиться с такой нагрузкой. Я правильно понял, что Вы данные в структуру таблиц 1С закачиваете?

да справиться со 100 млн. просто в зависимости от задач производимых над таблицей возможно прийдётся использовать прямой доступ ну и из-за архитектуры это будет не сильно просто и дороговато в поддержке
...
Рейтинг: 0 / 0
20.03.2010, 21:14
    #36532719
Kembreg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с импортом из Oracle
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
Форумы / [игнор отключен] [закрыт для гостей] / Проблема с импортом из Oracle / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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