powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поиск по полю типа varchar
22 сообщений из 22, страница 1 из 1
Поиск по полю типа varchar
    #32256061
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, All.
Появилась у меня необходимость сделать что то типа поисковой оболочки для множества баз. Т.е. пользователь вводит в поле символы (поле он не выбирает, нужные поля жестко заданы) и потом информация ищется. Пользователю разрешается вводить символы подстановки.
Поля необходимые проиндексированы. Операций вставки-редактирования практически не происходит. Проблема в тома, что поисковые поля типа varchar и записей в базе достаточно много - порядка 5-10 млн. При условии: WHERE [pole] like @Condition выборка происхдит довольно таки медленно (от 2 до 10 мин). Подозреваю, что у меня недостаточно опыта решения таких вопросов и хотелось бы услышать о возможных путях ускорения поиска.
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256070
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос. Пока крутится процедура выборки пользователь отдыхает.
Как можно сделать кнопку "Отменить" действие?
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256141
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSSQL:

у меня есть база в ней целые трактаты в полях ntext содержатся и довольно шустро все ищет ....

полнотекстовый индекс, MSsearch
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256157
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На кнопку можно нажимать только если запрос выполняется асинхронно иначе только CTRL+ BREAK отменит запрос
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256207
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To АлексейК.
1. А возможен ли такой поиск по полям char-varchar?
Я не могу слить все в поля ntext. (Да а какой объем базы у тебя?)

2. А как запустить этот самый асинхронный режим?
У меня данные выбирает ХП, а при открытии формы ей подставляется рекордсет на ее основе.

Я уже ограничил кол-во возвращаемых записей 1000, но все равно работает долго. Если искать по оператору =, то ищет быстро, но мне необходимы символы подстановки типа %,? и другого пути кроме LIKE я не знаю. Но при этом наступают тормоза.

Кстати смотрел тут базы под оболочкой CRONOS, там они пишут сетевая модель данных и там поиск на порядки быстрее происходит.
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256217
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял используется ADP+MS SQL (версии хорошо бы указывать когда задается вопрос).

А если запустить процедуру в QueryAnalyzer сколько она там выполняется?

В зависимости от этого и нужно оптимизировать либо сервер (тогда этот вопрос лучше задать соседям , либо клиента (что маловероятно, но возможно).
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256230
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все верно связка Adp+Ms SQL.
В анализатоте запросов выполняется долго.
Соседям вопрос тоже задал.
Но тут тема смежная потому отсюда не снимаю.
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256242
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно.
Значит нужно оптимизировать сервер и ХП.
По-моему нужны стандартные методы:
- посмотреть план выполнения запроса (запустить на него мастер построения индексов, может он предложит более эффективный индекс)
- где-то среди статей на этом сервере была статья по оптимизации там основные способы описаны.
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256249
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> 1. А возможен ли такой поиск по полям char-varchar?

нет никаких ограничений относительно этих типов данных.

есть (для меня) некоторые непонятки как использовать поиск если используется несколько национальных алфавитов...
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256265
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
принцип такой это код формы.
источник данных в форму перезагружается по нажатию кнопки асинхронно.

Код: 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.
Option Compare Database
Public WithEvents Rs As ADODB.Recordset
Public bound As Boolean
 
Private Sub Rs_FetchComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
'можно подключать рекордсет к форме после окончания загрузки всех записей'
'Set Me.Recordset = Rs'
'здесь уже можно вставить код для поиска'



End Sub

Private Sub Rs_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
Call SysCmd(acSysCmdSetStatus,  "receive from "  & Progress &  " to "  & MaxProgress)
If Not bound Then
'можно подключать рекордсет к форме после полчения первых записей, но запомнить что уже подключение сделано'
    Set Me.Recordset = Rs
    bound = True
End If
End Sub

Private Sub Кнопка2_Click() ' у меня в демопримере повешено на кнопку, но разумнее делать на загрузку '
Set Rs = New ADODB.Recordset
bound = False
    Rs.CursorLocation = adUseClient
    'вместо PROGRESS_PROC нужно указать имя большой таблицы, процедуры или вьюва  '
    Rs.Open  "PROGRESS_PROC" , CurrentProject.Connection, adOpenDynamic, adLockReadOnly, adAsyncExecute + adAsyncFetchNonBlocking
'On Error Resume Next 'пока рекордсет не получил записей его нельзя биндить к форме
'Set Me.Recordset = Rs
End Sub
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256300
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To АлексейК: Спасибо. Сегодня уже не успею попробовать, завтра сделаю, потом расскажу, что вышло.
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32256568
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот что настораживает: При условии: WHERE [pole] like @Condition

а каким образом ты формируешь запрос ?

для оптимизации быстродействия надо запрос сохранить как хранимую процедуру а критерии передавать как параметр и не использовать динамический SQL иначе для процедуры строится каждый раз перед запуском новый план выполнения и скорость выполнения снижается от 3 раз и более ...

кстати вот интересная статья в которой анализируется проблема быстродействия, аналогичная твоей.
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32257041
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To АлексейК. Попробовал вставить твой код. Сделат тоже пока на кнопке для отработки.
Как я понял должны наступить два события: Rs_FetchProgressи Rs_FetchComplete . Но они не наступают.
Где то это нужно описать?
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32257329
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в начале модуля формы должно быть объявлено

Option Compare Database
Public WithEvents Rs As ADODB.Recordset
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32257367
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я сделал. Все работает, события не наступают.
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32258000
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверь как выполняется строка

Код: plaintext
    Rs.Open  "PROGRESS_PROC" , CurrentProject.Connection, adOpenDynamic, adLockReadOnly, adAsyncExecute + adAsyncFetchNonBlocking

заполняется ли рекордсет ?

может неверно указан источник записей? в моем случае PROGRESS_PROC - имя хранимки.

это надо делать в модуле формы - не в общем модуле.

после объявления Public WithEvents Rs As ADODB.Recordset в списке объектов и их событий (два комбобокса в верхней части редактора VB модуля формы) появляется rs как объект и в списке событий его события - происходит ли это у тебя?
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32258136
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То АлексК:
>> проверь как выполняется строка
>> 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, т. е. время совсем маленькое не поставлю, вылетает.
При этом запуск отдельно процедуры, без привязки к форме, отрабатывает, хоть и долго, но без ошибок таймаута. Как можно вылечить?
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32258145
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот видишь на первый вопрос сам и ответил события получение данных и завершение получения данных не наступает из за таймаута ....
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32258178
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет пока стоят параметры асинхронного рекордсета никаких таймаутов не вылетает. Вообще ничего не происходит. Все мирно спит. Когда я ограничиваю количество записей 50, то тайм аут не наступает. И если при этом возвращаю параметры "асинхронности" то ничего не происходит. Что тут другое. Я сейчас другую ХП попробую подсунуть, попроще, да побыстрее. Посмотрю как сней будет работать.
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32258372
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ToАлексейК: Да, ты был прав. Если ХП простая и быстрая все работает. Буду решать вопрос с таймаутом.
Алексей, а вопрос прекращения считывания записей ты не решал? Т.е. пошли первые записи, ты посмотрел и решил остановить получение остальных? Некоторые мысли на эту тему у меня есть, но может это уже решенная проблема?
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32258395
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет готового решения пока нет.
могу предположить что надо задать форме пустое значение источника данных (или пустую выборку) , выключить обработку ошибок и закрыть соединение / рекордсет
...
Рейтинг: 0 / 0
Поиск по полю типа varchar
    #32258420
Michael Vasilev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, спасибо. Буду думать. Если что выгорит напишу.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поиск по полю типа varchar
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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