Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с большими таблицами / 25 сообщений из 50, страница 1 из 2
04.12.2006, 13:36
    #34174621
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
Здраствуйте!
Подскажите может ктонибудь знает как лутше сделать. При написании программы мне необходимо сделать запрос к БД и выбрать около 500 тыс. строк из таблицы. Запрос выполняется быстро вот только оперативки седается порядка 100-200 Мб. Как сделать что бы он не всю таблицу тянул в память а только кусочек?
Пишу на Builder 6 C++, СУБД Oracle 9i.

На Сишарпе таккаяже ситуация?
...
Рейтинг: 0 / 0
04.12.2006, 13:41
    #34174642
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
mikola1982выбрать около 500 тыс. строк из таблицы
А нафига?
...
Рейтинг: 0 / 0
04.12.2006, 13:43
    #34174655
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
mikola1982не всю таблицу тянул в память а только кусочекэто правильно
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
04.12.2006, 13:45
    #34174670
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
ну просто нужно взять информацию из таблицы и сохранить её в файл с определённой структурой.
Стандартными средствами Оракла сделать не получается.
...
Рейтинг: 0 / 0
04.12.2006, 14:00
    #34174740
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
mikola1982 m> ну просто нужно взять информацию из таблицы и сохранить её
m> в файл с определённой структурой. Стандартными средствами
m> Оракла сделать не получаетсядак а в память грузить зачем ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
04.12.2006, 14:08
    #34174776
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
ну как я делаю ADOQuerry->Activite=true
и он начинает тянуть с БД все данные согласно запросу.
вот и вытягивает на 200 метров.
...
Рейтинг: 0 / 0
04.12.2006, 14:12
    #34174796
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
mikola1982 m> ну как я делаю ADOQuerry->Activite=true
m> и он начинает тянуть с БД все данные согласно запросу.может тип курсора покурить ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
04.12.2006, 14:15
    #34174810
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
А это как? и у курсора может быть 10 полей (ну столбцы в таблице).?
подскажите как ето можно сделать.
...
Рейтинг: 0 / 0
04.12.2006, 14:17
    #34174816
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
mikola1982А это как?клиентский курсор
BCB HelpTCustomADODataSet::CursorType
---
Specifies type of cursor an ADO dataset uses.

__property TCursorType CursorType = {read=GetCursorType, write=SetCursorType, default=2};

Description

Set CursorType to indicate the type of cursor the ADO dataset uses for the recordset when it is opened. CursorType must be set prior to activating the dataset component. Among other cursor aspects, CursorType affects directional scrolling through a recordset and the visibility of changes made by other users.

The default value of CursorType is ctKeyset.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
04.12.2006, 14:19
    #34174823
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
М.б. CursorLocation=clUseServer.
...
Рейтинг: 0 / 0
04.12.2006, 14:26
    #34174856
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
спасибо! попробую!
...
Рейтинг: 0 / 0
04.12.2006, 15:05
    #34175025
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
mikola1982Здраствуйте!
Подскажите может ктонибудь знает как лутше сделать. При написании программы мне необходимо сделать запрос к БД и выбрать около 500 тыс. строк из таблицы. Запрос выполняется быстро вот только оперативки седается порядка 100-200 Мб. Как сделать что бы он не всю таблицу тянул в память а только кусочек?
Пишу на Builder 6 C++, СУБД Oracle 9i.

На Сишарпе таккаяже ситуация?

как тут сказали - мона курсор...
а мона и немного подругому...
если Вам нужно сканировать дейстивтельно в сети (видеть изменения в он-лайн) и наплевать на кол-во записей (хоть мульён, хоть тэра - пофигу)..при этом нормально работать а не задыхаться от нехватка памяти на серваке либо клиенте...то....
логика следующая...
Вводите понятие "опорная запись".
из этой опорной записи Вам нужно данные полей сортировки.
Далее сделать запрос на всё что меньше или равно (но не больше, скажем размер Вашего "окна")
Далее сделать запрос на всё что больше (но не больше размера Вашего "окна")
на клиенте получите желаемые данные, величиной от размера Вашего, до 2 размеров Вашего окна...всё...
алгоритм был успешно опробован на таких движках как Btrieve(фиксированное кол-во индексных полей), Oracle (произвольное кол-во индексных полей)...вообще оракл - вне всяких похвал... на ура такие задачи глотает...

с уважением
(круглый)
Автор методы - Гриценко А.В. год 1996 где то...
...
Рейтинг: 0 / 0
04.12.2006, 15:08
    #34175039
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
Чушь какая-то. Неужели в ADO нет нормального враппера курсора, который фетчит таблицу построчно.

Застрелюсь ей богу, если нету.

C уважением
Lord Mayton
...
Рейтинг: 0 / 0
04.12.2006, 15:19
    #34175096
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
maytonЧушь какая-то. Неужели в ADO нет нормального враппера курсора, который фетчит таблицу построчно.

Застрелюсь ей богу, если нету.

C уважением
Lord Mayton


... and between Date XX.XX.XX and XX.XX.XX
...
Рейтинг: 0 / 0
04.12.2006, 15:19
    #34175097
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
maytonЧушь какая-то. Неужели в ADO нет нормального враппера курсора, который фетчит таблицу построчно.

Застрелюсь ей богу, если нету.

C уважением
Lord Mayton


рекомендую глянуть изернет монитором то, что получает Ваша станция в этом случае..."Радость" админа будет полные штаны...таких клиентов штук 10...и ваши 100 мегабит приказали долго жить...правда нуна сказать, что фитч-фитчу рознь... но при попытки пройтись по полученному курсору - радости даст мало...

если не верите - гляньте сами..
с уважением
(круглый)
...
Рейтинг: 0 / 0
04.12.2006, 15:22
    #34175107
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
JibSkeart... and between Date XX.XX.XX and XX.XX.XX

поля дат не всегда существуют в таблицах...кстати..и кто сказал что нам нужно в порядке сортировки дат ????

с уважением
(круглый)
...
Рейтинг: 0 / 0
04.12.2006, 15:25
    #34175121
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
kolobok0 JibSkeart... and between Date XX.XX.XX and XX.XX.XX

поля дат не всегда существуют в таблицах...кстати..и кто сказал что нам нужно в порядке сортировки дат ????

с уважением
(круглый)

А никто , я предположительно пошутил :)
...
Рейтинг: 0 / 0
04.12.2006, 19:01
    #34175847
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
mikola1982При написании программы мне необходимо сделать запрос к БД и выбрать около 500 тыс. строк из таблицы.Ни в коем случае! Никогда не таскай на клиента такие большие выборки.
...
Рейтинг: 0 / 0
05.12.2006, 06:18
    #34176323
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
мда! написано много но все теория и не одной сылки как ето сделать! все только говорят оооо!!!!!
Я сам понимаю что 500 тыс. много. Думал как сделать что бы "два окна" верх два в низ!
Вот только не придумал скажите как? или где можно про это почитать. Очень прошу мужики помогите.
...
Рейтинг: 0 / 0
05.12.2006, 06:21
    #34176325
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
автор
как тут сказали - мона курсор...
а мона и немного подругому...
если Вам нужно сканировать дейстивтельно в сети (видеть изменения в он-лайн) и наплевать на кол-во записей (хоть мульён, хоть тэра - пофигу)..при этом нормально работать а не задыхаться от нехватка памяти на серваке либо клиенте...то....
логика следующая...
Вводите понятие "опорная запись".
из этой опорной записи Вам нужно данные полей сортировки.
Далее сделать запрос на всё что меньше или равно (но не больше, скажем размер Вашего "окна")
Далее сделать запрос на всё что больше (но не больше размера Вашего "окна")
на клиенте получите желаемые данные, величиной от размера Вашего, до 2 размеров Вашего окна...всё...
алгоритм был успешно опробован на таких движках как Btrieve(фиксированное кол-во индексных полей), Oracle (произвольное кол-во индексных полей)...вообще оракл - вне всяких похвал... на ура такие задачи глотает...

с уважением
(круглый)
Автор методы - Гриценко А.В. год 1996 где то...

тоесть "данные полей сортировки" это уникальный индефикатор записи, ну в Оракле ROWID? или любое другое уникальное поле.
...
Рейтинг: 0 / 0
05.12.2006, 08:53
    #34176460
Алексей3696
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
Не уверен что поможет, так как не работал ADOQuerry, но попробуй
что-то, типа этого (в TIBQuery т TFIBQuery работают корректно, по одной записи фитчат если не установлено свойство FeatchAll(или что то типа этого,не помню точно) )

DBQuery->SQL->Text=" select * ..."
DBQuery->ExecQuery(); // при извлечении запроса DBQuery втаёт на первую запись(если стоит ////..свойство перейти на первую запись при извлечении

while( !DBQuery->Eof)
{

int ABC=DBQuery->FieldByName("<мое поле1>")->AsInteger;
int DEF=DBQuery->FieldByName("<мое поле2>")->AsInteger;
// чё-то делаем и дописываем(сохраняем в) файл
DBQuery->Next();
}
...
Рейтинг: 0 / 0
05.12.2006, 09:09
    #34176481
Алексей3696
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
но по большому счёту лучше не таскать данные с сервера такими большими кусками, это накладно как для сервака так и для клиента, но если уж сильно надо то можно попробовать так:
1) делать селект и сортировать по по индексированному уникальному полю (лучше всего целочисленному, но не обязательно)
например:
select first 1000 frоm MyBigTable order by УникальныйКлюч по возрастанию
2) выбрали всё что нужно, обработали сохранили в файл и запомнили последнее заначение поля УникальныйКлюч в переменной VAR
3) select first 1000 frоm MyBigTable where УникальныйКлюч>VAR order by УникальныйКлюч по возрастанию
4) повторять пока не ко п2 и п3 пока не выполница какое то условие или не кончятся записи в таблице

З.Ы. по моему всё таки этот вопрос больше в сторону SQL или как то к общим алгоритмам нежели к С++
...
Рейтинг: 0 / 0
05.12.2006, 09:20
    #34176494
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
Алексей3696TIBQuery т TFIBQueryэто 2 большие разницы
TIBQuery - обкновенный кэширующий датасет, но его можно перевести в режим UniDirectional, т.е. без кэширования записей.
TFIBQuery - аналог ибэиксовского IBSQL, т.е. грубо говоря обертка над АПИ.

твой же пример - для некэшируюшего датасета, которого в АДО нет (по-моему), в АДО аналогичная функциональность реализуется заданием типа курсора
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
05.12.2006, 09:25
    #34176506
Алексей3696
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
но по большому счёту лучше не таскать данные с сервера такими большими кусками, это накладно как для сервака так и для клиента, но если уж сильно надо то можно попробовать так:
1) делать селект и сортировать по по индексированному уникальному полю (лучше всего целочисленному, но не обязательно)
например:
select first 1000 frоm MyBigTable order by УникальныйКлюч по возрастанию
2) выбрали всё что нужно, обработали сохранили в файл и запомнили последнее заначение поля УникальныйКлюч в переменной VAR
3) select first 1000 frоm MyBigTable where УникальныйКлюч>VAR order by УникальныйКлюч по возрастанию
4) повторять пока не ко п2 и п3 пока не выполница какое то условие или не кончятся записи в таблице

З.Ы. по моему всё таки этот вопрос больше в сторону SQL или как то к общим алгоритмам нежели к С++
...
Рейтинг: 0 / 0
05.12.2006, 09:28
    #34176513
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большими таблицами
А что будет делать человек с таким количеством данных ?
это же запаришся такой список просматривать
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с большими таблицами / 25 сообщений из 50, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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