Форум: "Базы";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизБыстрый поиск в ораклиной базе... Найти похожие ветки
← →
Андрусь (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c