|
|
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
Добрый день, All. Появилась у меня необходимость сделать что то типа поисковой оболочки для множества баз. Т.е. пользователь вводит в поле символы (поле он не выбирает, нужные поля жестко заданы) и потом информация ищется. Пользователю разрешается вводить символы подстановки. Поля необходимые проиндексированы. Операций вставки-редактирования практически не происходит. Проблема в тома, что поисковые поля типа varchar и записей в базе достаточно много - порядка 5-10 млн. При условии: WHERE [pole] like @Condition выборка происхдит довольно таки медленно (от 2 до 10 мин). Подозреваю, что у меня недостаточно опыта решения таких вопросов и хотелось бы услышать о возможных путях ускорения поиска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 16:03 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
Еще вопрос. Пока крутится процедура выборки пользователь отдыхает. Как можно сделать кнопку "Отменить" действие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 16:05 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
MSSQL: у меня есть база в ней целые трактаты в полях ntext содержатся и довольно шустро все ищет .... полнотекстовый индекс, MSsearch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 16:34 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
На кнопку можно нажимать только если запрос выполняется асинхронно иначе только CTRL+ BREAK отменит запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 16:39 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
To АлексейК. 1. А возможен ли такой поиск по полям char-varchar? Я не могу слить все в поля ntext. (Да а какой объем базы у тебя?) 2. А как запустить этот самый асинхронный режим? У меня данные выбирает ХП, а при открытии формы ей подставляется рекордсет на ее основе. Я уже ограничил кол-во возвращаемых записей 1000, но все равно работает долго. Если искать по оператору =, то ищет быстро, но мне необходимы символы подстановки типа %,? и другого пути кроме LIKE я не знаю. Но при этом наступают тормоза. Кстати смотрел тут базы под оболочкой CRONOS, там они пишут сетевая модель данных и там поиск на порядки быстрее происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 16:59 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
Как я понял используется ADP+MS SQL (версии хорошо бы указывать когда задается вопрос). А если запустить процедуру в QueryAnalyzer сколько она там выполняется? В зависимости от этого и нужно оптимизировать либо сервер (тогда этот вопрос лучше задать соседям , либо клиента (что маловероятно, но возможно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 17:09 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
Все верно связка Adp+Ms SQL. В анализатоте запросов выполняется долго. Соседям вопрос тоже задал. Но тут тема смежная потому отсюда не снимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 17:14 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
Ясно. Значит нужно оптимизировать сервер и ХП. По-моему нужны стандартные методы: - посмотреть план выполнения запроса (запустить на него мастер построения индексов, может он предложит более эффективный индекс) - где-то среди статей на этом сервере была статья по оптимизации там основные способы описаны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 17:22 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
> 1. А возможен ли такой поиск по полям char-varchar? нет никаких ограничений относительно этих типов данных. есть (для меня) некоторые непонятки как использовать поиск если используется несколько национальных алфавитов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 17:31 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
принцип такой это код формы. источник данных в форму перезагружается по нажатию кнопки асинхронно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 17:46 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
To АлексейК: Спасибо. Сегодня уже не успею попробовать, завтра сделаю, потом расскажу, что вышло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2003, 18:10 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
вот что настораживает: При условии: WHERE [pole] like @Condition а каким образом ты формируешь запрос ? для оптимизации быстродействия надо запрос сохранить как хранимую процедуру а критерии передавать как параметр и не использовать динамический SQL иначе для процедуры строится каждый раз перед запуском новый план выполнения и скорость выполнения снижается от 3 раз и более ... кстати вот интересная статья в которой анализируется проблема быстродействия, аналогичная твоей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2003, 09:16 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
To АлексейК. Попробовал вставить твой код. Сделат тоже пока на кнопке для отработки. Как я понял должны наступить два события: Rs_FetchProgressи Rs_FetchComplete . Но они не наступают. Где то это нужно описать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2003, 14:17 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
в начале модуля формы должно быть объявлено Option Compare Database Public WithEvents Rs As ADODB.Recordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2003, 17:06 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
Это я сделал. Все работает, события не наступают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2003, 17:46 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
проверь как выполняется строка Код: plaintext заполняется ли рекордсет ? может неверно указан источник записей? в моем случае PROGRESS_PROC - имя хранимки. это надо делать в модуле формы - не в общем модуле. после объявления Public WithEvents Rs As ADODB.Recordset в списке объектов и их событий (два комбобокса в верхней части редактора VB модуля формы) появляется rs как объект и в списке событий его события - происходит ли это у тебя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 09:54 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
То АлексК: >> проверь как выполняется строка >> Rs.Open "PROGRESS_PROC", CurrentProject.Connection, adOpenDynamic, >> adLockReadOnly, adAsyncExecute + adAsyncFetchNonBlocking Что то выполняется, сообщений никаких не вылетает. Только вот с ним делать я ничего не могу пока параметры: adAsyncExecute + adAsyncFetchNonBlocking присутствуют. >> заполняется ли рекордсет ? Как проверить в данном случае? >> может неверно указан источник записей? в моем случае >> PROGRESS_PROC - имя хранимки. Это понятно, вместо нее я свою написал. >> это надо делать в модуле формы - не в общем модуле. Это тоже понятно. Так я делаю. >> после объявления Public WithEvents Rs As ADODB.Recordset в списке >> объектов и их событий (два комбобокса в верхней части редактора VB >> модуля формы) появляется rs как объект и в списке событий его события - >> происходит ли это у тебя? Все это происходит. Только события не срабатывают. Кстати, еще вопрос. Если я убираю параметры: adAsyncExecute + adAsyncFetchNonBlocking то у меня по Таймауту ошибка вылетает. Я уже в опциях 0 выставил и пробовал на коннекшине выставить таймаут команды и конекшина поставить 0. Все равно вылетает. Пока не ограничу количество записей 50, т. е. время совсем маленькое не поставлю, вылетает. При этом запуск отдельно процедуры, без привязки к форме, отрабатывает, хоть и долго, но без ошибок таймаута. Как можно вылечить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 11:19 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
вот видишь на первый вопрос сам и ответил события получение данных и завершение получения данных не наступает из за таймаута .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 11:23 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
Да нет пока стоят параметры асинхронного рекордсета никаких таймаутов не вылетает. Вообще ничего не происходит. Все мирно спит. Когда я ограничиваю количество записей 50, то тайм аут не наступает. И если при этом возвращаю параметры "асинхронности" то ничего не происходит. Что тут другое. Я сейчас другую ХП попробую подсунуть, попроще, да побыстрее. Посмотрю как сней будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 11:38 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
ToАлексейК: Да, ты был прав. Если ХП простая и быстрая все работает. Буду решать вопрос с таймаутом. Алексей, а вопрос прекращения считывания записей ты не решал? Т.е. пошли первые записи, ты посмотрел и решил остановить получение остальных? Некоторые мысли на эту тему у меня есть, но может это уже решенная проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 13:03 |
|
||
|
Поиск по полю типа varchar
|
|||
|---|---|---|---|
|
#18+
нет готового решения пока нет. могу предположить что надо задать форме пустое значение источника данных (или пустую выборку) , выключить обработку ошибок и закрыть соединение / рекордсет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 13:18 |
|
||
|
|

start [/forum/topic.php?fid=45&fpage=1753&tid=1679546]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 227ms |
| total: | 390ms |

| 0 / 0 |
