Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.18;
Скачать: CL | DM;

Вниз

Быстрый поиск в ораклиной базе...   Найти похожие ветки 

 
Андрусь ©   (2002-10-21 21:43) [0]

Привет всем! У меня такая проблема.Есть база, где большие таблицы(сотни тысяч). Нужно организовать быстрый поиск по конкретным полям в таблицах. Что-то вроде как в блокноте Ctrl+F - окошко, вводишь условия поиска... Когда все данные на клиенте всё очень просто - Locate().
В моём случае всё намного хуже. Сразу отметаем идею закачки всего на клиента и обработки там - долго грузится,да и громоздко всё качать. Нужно создавать для юзвера видимость работы с полным набором на клиенте, маскируя обработку на серевере.
Как вариант такое решение. В запрос включаю параметр,вокруг которого формирую набор данных. На событие Before Scroll на DataSet вешаю обработчик обновляющий набор данных,вокрух 1-й либо последней записи при достижении таковой. Неясно что делать со сколингом на гриде.Он будет показывать чушь.
Может кто занимался чем либо подобным буду очень благодарен за полезные советы и подсказки.


 
Sergey13 ©   (2002-10-22 09:02) [1]

Ничего не понял. Тебе надо закачивать набор данных порциями? Так обычно компоненты доступа так и делают автоматом. Для быстрого поиска ограничивай сам набор данных более конкретным запросом. Вытаскивать больше 100 строк не резонно, не удобно работать.

>На событие Before Scroll на DataSet вешаю обработчик обновляющий набор данных
И получишь на одном и том же наборе затык полный. 8-)


 
Bis   (2002-10-22 09:29) [2]

У нас поиск реализован через пакеты.
Все функции возвращают ссылки на динамические или временные таблицы.
Чем точнее поиск, тем быстрее вернет результаты. А когда много, то результат лучше фечить. И лучше загнать это в отдельный поток, который понемногу скачивает данные и отображает их


 
Johnny Smith ©   (2002-10-22 09:37) [3]

2Андрусь © (21.10.02 21:43)
Старая проблема.
Если говорить о возможностях OCI, то на их уровне такое возможно (двунаправленный курсор называется - при исполнении запроса можно фетчить строки как вперед так и назад), но вряд ли Вы будете с ними заморачиваться - APIшки они и в Африке APIшки.
Так что лучше все-таки фильтровать на сервере.


 
sen   (2002-10-22 09:46) [4]

BIS
Зачем загонять в отдельный поток-то?
Подумай хорошенько.


 
Андрусь ©   (2002-10-22 10:19) [5]

>Sergey13 ©
Что конкретно неясно - набор данных закачиваю порциями, т.к.закачка полноо набора - слишком дорогое по времени. Для быстрого поиска ограничиваю набор данных запросом+ограничение объёма данных - (-50,+50)записей от перевой записи удовлетворяющей условиям поиска. Этим пытаюсь создать у пользователя иллюзию работы со всеми данными на своей машине.

>Johnny Smith ©
Вот как раз фетчить через апишки,наверное,будет наиболее оптимально. Стоит позаморачиваться с ними,хотябы попробывать. Буду весьма признателен за подсказку.


 
Johnny Smith ©   (2002-10-22 10:39) [6]

2Андрусь © (22.10.02 10:19)
Вот как раз фетчить через апишки,наверное,будет наиболее оптимально. Стоит позаморачиваться с ними,хотябы попробывать. Буду весьма признателен за подсказку.
Ну тогда ловите подсказку:
1) Примеры из директории %ORA_HOME%/OCI/Samples
Все примеры - на чистом С. Обратите внимание главным образом на примеры с простым селектом (особенно cdemo82.c). Там юзается функция OCIStmtFetch, у нее есть параметр orientation, который может принимать значения OCI_FETCH_NEXT или OCI_FETCH_PRIOR (последний - начиная с 8i). Вот этот orientation и будет помощничком.
2) Ну и документация:
http://download-west.oracle.com/otndoc/oracle9i/901_doc/appdev.901/a89857/toc.htm
В Ворде это страниц 800 текста :)) Я скачал. Не пожалел.

О том, как это портировать с С на дельфя, смотри исходники любой библиотеки прямого доступа (рекомендую NC OCI)


 
Sergey13 ©   (2002-10-22 10:42) [7]

2Андрусь © (22.10.02 10:19)
>закачка полноо набора - слишком дорогое по времени
Сколько строк в наборе? Может тут и стоит рыть? Уменьшить попробовать.
>ограничиваю набор данных запросом+ограничение объёма данных - (-50,+50)
Каким образом?
>Этим пытаюсь создать у пользователя иллюзию работы
Вот это в точку, ИМХО. 8-)


 
Андрусь ©   (2002-10-22 11:11) [8]

>Sergey13 ©
Таблица - порядко сотен тыс. записей.
Набор данных (-50,+50) ограничиваю селектом...
Нечего прикалываться,если нет серьёзных мыслей.
>Johnny Smith ©
Работаю с Ораклом ч/з Odac. Он подсасывает OCI. Может проще работать через него. Ничего не посоветуете.


 
Андрусь ©   (2002-10-22 11:24) [9]

Там смотрю - очень интересно.
Есть ф-я TOCICommand.InternalFetch. Но фетч вперёд - видимо про таких извращенце вроде меня не думали. Можно написать наследника,
добавив фетч назад...


 
Sergey13 ©   (2002-10-22 11:31) [10]

2Андрусь © (22.10.02 11:11)
>Таблица - порядко сотен тыс. записей.
Я спрашивал про набор данных возвращающегося селектом (без "ограничителей")
>Набор данных (-50,+50) ограничиваю селектом...
Каким образом? Текст запроса, плиз.
>Нечего прикалываться,если нет серьёзных мыслей.
Да я и не прикалываюсь. Просто, ИМХО, ты неправильно используешь поиск. Ты пытаешься искать в готовом наборе данных, а я думаю, что на таких объемах это неправильно. Надо разделить поиск и набор. Т.е. запрос поиска должен возвращать минимум строк(в идеале 1), с помощью результата поиска и перемещайся по набору(рабочему) данных. Но этот рабочий набор тоже не следует делать шибко большим - пользователь не сможет с ним нормально работать. Лучше сделать несколько маленьких. Как? Разумно ограничивать в запросе. Иногда даже можно специальные столбцы для этого иметь. Но это надо конкретно задачу смотреть.
В общем мой совет пересмотреть логику приложения.


 
ShuraGrp ©   (2002-10-23 11:15) [11]

В ODAC TOraDataSet.FiltrSQL добавляет условие к Where


 
Diana   (2002-10-30 14:07) [12]

Мне регулятно приходится работать с похожем объемом данных с точки зрения пользователя, и лучше настраиваемого фильтра, запускаемого на открытие окна я ничего не видела.
Искать просмотром нужную запись в таком объеме данных - нудно, а оценить количество записей можно, если вывести его в строку состояния.
Думаю стоит пересмортеть логику программы, а не зацикливаться на способах обмана ДБгрида. Это ни к чему.


 
Geka   (2002-10-30 15:38) [13]

Использую DOA.
В TOracleDataSet есть свойство

property QueryAllRecords: Boolean;

Description

When set to True, all records will be retrieved from the database when the dataset is opened. When set to False, records are retrieved when a data-aware component or a program requests it. If a query can return many records, set this property to False if initial response time is important.

Вроде это то что надо.

А поиск можно и запросом с like сделать(будет точно как ctrl-f)


 
EternalWonderer   (2002-10-30 17:16) [14]

Можно сократить объём переносимых на клиента данных не по вертикали, а по горизонтали (например, выводить только один столбец), и делать поиск по этому столбцу. А когда пользователь выбрал запись - тащить выбранную строку полностью.



Страницы: 1 вся ветка

Текущий архив: 2002.11.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
6-59317
Кеплин Сергей
2002-09-15 00:15
2002.11.18
Заполнить INPUT в интернете и нажать програмно SUBMIT...


1-59134
dj_adrian
2002-11-07 22:53
2002.11.18
Непонятный баг...


3-59031
Matvey
2002-10-28 21:18
2002.11.18
DBLookupComboBox программное позиционирование?


14-59332
DiamondShark
2002-10-31 17:08
2002.11.18
Да здравствуют наши программисты!


14-59400
GUID
2002-10-30 19:16
2002.11.18
HELP!!!!! Proxy server for w2k professional