powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Какая возможна альтернатива Like в VFP OLE DB?
25 сообщений из 27, страница 1 из 2
Какая возможна альтернатива Like в VFP OLE DB?
    #35180745
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица dbf на 1 млн. записей. В одном поле необходимо найти определенное значение. Данные могут быть примерно такого типа 43КМ549812. Мне необходимо организовать поиск по последним 6 цифрам.
Подключаюсь к таблице через .NET Framework Data Provider for OLE DB.
Поиск по принципу

Код: plaintext
1.
select field from table where field like '*549812'
не подходит, насколько я помню, like очень не любит подстановочные символы в начале строки, и запрос выполняет слишком долго (4-6 сек).

Запрос вида where right(field,6) like '549812' тоже выполняется долго.

Возможно ли ускорить процесс поиска по данному критерию?
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35180749
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пишу в VS 2005, C#, NET Framework Data Provider for OLE DB.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35181466
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Mdel" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:5390762@sql.ru...
> Автор: Mdel
> Имеется таблица dbf на 1 млн. записей. В одном поле необходимо найти
> определенное значение. Данные могут быть примерно такого типа 43КМ549812.
> Мне необходимо организовать поиск по последним 6 цифрам.
> Подключаюсь к таблице через .NET Framework Data Provider for OLE DB.
> Поиск по принципу
>
>
> select field from table where field like '*549812'
> не подходит, насколько я помню, like очень не любит подстановочные символы
> в начале строки, и запрос выполняет слишком долго (4-6 сек).
>
> Запрос вида where right(field,6) like '549812' тоже выполняется
> долго.
>
> Возможно ли ускорить процесс поиска по данному критерию?


Не знаю насчет .NET Framework Data Provider for OLE DB, а для самого фокса,
тем более по сети такие скоростные характеристики (4-6 сек) при подобном
запросе довольно таки быстрые.


В фоксе ( как собственно и через нормального провайдера, понимающего
индексы) ускорения можно добится создав индекс по выражению right(field,6),
тогда запрос вида " where right(field,6) == '549812' " подцепит этот индекс,
что приведет к существенному ускорению.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35183659
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в VFP Индекс поможет - рашмор

другое дело если надо проивольный like то шерсить всю таблу придется

а вот в .NET Framework Data Provider for OLE DB. ??
очень даоже интеерсно - по идее должно - ОТПИШИ плз сюда помогло или
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35183815
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select field from table where field like '%549812'
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35184414
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AleksMedselect field from table where field like '%549812'
я понимаю что процент вместо *, суть от этого не меняется :) и кстати процент в SQL server, в DBF и Firebird все таки * :)

Galyamov Rinat
Не знаю насчет .NET Framework Data Provider for OLE DB, а для самого фокса,
тем более по сети такие скоростные характеристики (4-6 сек) при подобном
запросе довольно таки быстрые.

Тогда объясните, почему когда я ищу заведомо НЕСУЩЕСТВУЮЩИЕ данные, то есть вместо 43КМ549812 я ищу ОР99ГОШЛГН, то ответ о том, что таких данных нет приходит МОМЕНТАЛЬНО? с like без Like, по барабану.
Galyamov Rinat
ускорения можно добится создав индекс по выражению right(field,6),

Индекс я не могу сделать, программа пишется для сторонней организации, менять структуры таблиц мне не позволят.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35184579
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MdelТогда объясните, почему когда я ищу заведомо НЕСУЩЕСТВУЮЩИЕ данные, то есть вместо 43КМ549812 я ищу ОР99ГОШЛГН, то ответ о том, что таких данных нет приходит МОМЕНТАЛЬНО? с like без Like, по барабану.
Странно, попробуй поискать похожее на нормальное, но не существующее, что-то типа 43КМ439873
Mdel Galyamov Rinat
ускорения можно добится создав индекс по выражению right(field,6),

Индекс я не могу сделать, программа пишется для сторонней организации, менять структуры таблиц мне не позволят.
При отсутствии индекса поиск будет идти перебором всех записей. Оптимизация возможна только при наличии индекса.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35186758
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Тогда объясните, почему когда я ищу заведомо НЕСУЩЕСТВУЮЩИЕ данные,
> то есть вместо 43КМ549812 я ищу ОР99ГОШЛГН, то ответ о том, что таких
> данных нет приходит МОМЕНТАЛЬНО? с like без Like, по барабану.

Пара вопросов: 1 len(field) = ??? не 10 случаем (=len('ОР99ГОШЛГН'))???
2 индекс по field есть?

> Galyamov Rinat
> ускорения можно добится создав индекс по выражению
> right(field,6),
> Индекс я не могу сделать, программа пишется для сторонней
> организации, менять структуры таблиц мне не позволят.

Наличие индекса никак не повлияет на работоспособность других программ.
Разве что чуть замедлит внесение данных и изменение поля по которому есть
индекс.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35186759
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ответ на первый вопрос положителен, то как минимум не нужно производить
поиск вхождений!!! Достаточно прямого сравнения строк - что намного быстрее.

Если при этом ответ на второй вопрос положительный - тогда все ускоряется
еще в несколько (десятков) раз.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35186762
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> > Тогда объясните, почему когда я ищу заведомо НЕСУЩЕСТВУЮЩИЕ данные,
> > то есть вместо 43КМ549812 я ищу ОР99ГОШЛГН, то ответ о том, что
> таких
> > данных нет приходит МОМЕНТАЛЬНО? с like без Like, по барабану.


А если поискать заведомо существующее???

Т.е. не like "*549812", а =="43КМ549812", тоже скорость 4-6 секунд???


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35187003
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
короче, объясняю как есть :)
есть база ГАИ, в ней постановления о штрафах.
номер постановления 27ВВ155675 - точно есть(мой номер :) )
1. Индекс по полю есть.
2. Если я ищу прямое вхождение 27ВВ155675, то поиск по СЕТИ идет около 10-12 сек.
Если я ищу по like '27%155675', т.е 27% я добавляю в коде, а пользователь, чтобы не вводить буквы(для ускорения работы), вводит только цифры, то поиск идет около минуты.
3. если я ищу НЕСУЩЕСТВУЮЩИЕ данные, то есть по прямому вхождению ищу 27ВВ999999 - ответ что записей нет приходит моментом.

А длина поля, как вы можете видеть, равна 10. А что, это на что то влияет? именно 10?
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35187006
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если хотите, я вам даже видео выложу как он моментом ищет левые данные и как долго существующие.. :) я прям в прострации :)
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35187090
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MdelЕсли хотите, я вам даже видео выложу как он моментом ищет левые данные и как долго существующие.. :) я прям в прострации :)
Видео не надо. Надо изначально корректно описывать задачу. Ясновидящих тут нет.
Было так:
MdelМне необходимо организовать поиск по последним 6 цифрам. Вот на это тебе и отвечали.

Давай рассмотрим как есть:
Mdelкороче, объясняю как есть :)
есть база ГАИ, в ней постановления о штрафах.
номер постановления 27ВВ155675 - точно есть(мой номер :) )
1. Индекс по полю есть.
2. Если я ищу прямое вхождение 27ВВ155675, то поиск по СЕТИ идет около 10-12 сек.
Полностью оптимизированный поиск по индексу + выборка результата по сети. Такая скорость тоже не устраивает?

MdelЕсли я ищу по like '27%155675', т.е 27% я добавляю в коде, а пользователь, чтобы не вводить буквы(для ускорения работы), вводит только цифры, то поиск идет около минуты.
Частично оптимизированный поиск. ищутся все записи начинающиеся на "27" и потом сравниваются на соответствие шаблону. Т.к. записей много (27 это регион или серия как я понимаю) и физически могут быть в разных концах DBF то это тормозить и без сетки будет.

Mdel3. если я ищу НЕСУЩЕСТВУЮЩИЕ данные, то есть по прямому вхождению ищу 27ВВ999999 - ответ что записей нет приходит моментом.
Полностью оптимизированный поиск по индексу, а т.к. в индексе нет, то выборки результата не происходит.

Некорректный тест. попробуй "27%999999" - думаю будет около минуты.

Что еще можно попробовать:
1. Шаблон заменить на '27??155675'. Хотя думаю это не сильно ускорит
2. Использовать монопольный доступ к таблице, тогда издержек на блокировки не будет и клиент кэшировать будет. Как вариант иметь обновляемую копию на клиенте, возможно только поля с номером и Id записи, тут индексы какие угодно можешь создать, делать выборки списка Id, а по Id запрос к основной базе.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35187171
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Монопольный не получится, т.к. в гаи все таки народ тоже работает с базой :) копию тоже бессмысленно заводить, все должно быть в живой базе...

Остановился все таки на полностью оптимизированном запросе. Пусть уж лучше оператор наберет буквы с номером и подождет 10 сек, чем наберет только номер и будет ждать минуту.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35187303
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте функцию SYS(3054,11), чтобы понять, какие индексы используются и есть ли оптимизация

Код: plaintext
1.
2.
3.
=SYS( 3054 , 11 )
SELECT ... FROM ... WHERE
=SYS( 3054 , 0 )

Основа ускорения - использование индексов. Если индекс используется, то ускорение возможно. Если индекс не используется, то запрос будет выполняться напрямую по исходным данным, что, как правило, медленее.


Для справки, конструкция

Field LIKE 'XXX%'

эквивалентна конструкции

Field = 'XXX'

при настройке SET ANSI OFF (эта настройка по умолчанию). И, как следствие, использует индекс. Т.е. есть ускорение.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35187597
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mdel2. Если я ищу прямое вхождение 27ВВ155675, то поиск по СЕТИ идет около 10-12 сек.
Это не просто много а очень много...

А если использовать другой подход - написать прослойку для запросов?

Если сервер под Windows, то можно прямо на сервере сделать Web Service (на любимом Вами .NET это делается очень легко и быстро) и уже к нему слать запросы. Если правила не позволяют, то поставить рядом еще сервер, соединить чем-то быстрым навроде 1-2Gb/s сетью и снова "повесить" туда Web Service + использовать его для других задач - заодно всем поможете делать их работу быстрее
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35189634
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет, спасибо конечно за такие советы, только вы забываете что я пишу программу для гос.организации, причем сторонней, сам я там не работаю. :) Поэтому никто не даст мне воткнуть веб-сервис к ним, равно как и поставить другой сервак :) тех.обеспечение ГАИ давно оставляет желать лучшего :)

ВладимирМ
Для справки, конструкция

Field LIKE 'XXX%'

эквивалентна конструкции

Field = 'XXX'


Да, эквивалентна, но вот конструкции 'XX%XXX', а тем более '%XX', нет.
На локальной базе все ищется намного быстрее, прямой поиск (27ВВ155675) выполняется за 1-2 сек, частичный (27%155675) - около 15 сек. Основная то проблема в сети+железо на котором все это крутится+невозможность поправить индексы в базе. Их базу часто обновляет Москва, заменяя таблицы. Индексация используется однозначно, в ранних версиях программы без индексов поиск вообще шел около 5 минут :)
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35190424
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MdelИндексация используется однозначно, в ранних версиях программы без индексов поиск вообще шел около 5 минут :)
Вы можете думать и предполагать что индексы используются или не используются. Но лучше все-таки убедится на практике. Иначе, так и будем "толочь воду в ступе".

Причина ускорения может быть другой. Не зависящей от индексов. Вот и убедитесь , что индексы реально используются. И какие именно индексы.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35199888
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Вы можете думать и предполагать что индексы используются или не используются. Но лучше все-таки убедится на практике. Иначе, так и будем "толочь воду в ступе".

Причина ускорения может быть другой. Не зависящей от индексов. Вот и убедитесь, что индексы реально используются. И какие именно индексы.

При попытке просмотреть индексы вылетает такая ошибка:

file does not exist

Тогда объясните мне неучу, почему ОБНОВЛЕНИЕ и УДАЛЕНИЕ происходит моментально? запрос тот же самый: update table set sank = 'ОПЛ' where postanov='27ВВ155675'
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35202203
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выяснил я точно по индексам. на данное поле postanov стоит 2 индекса, первый - по полной строке postanov, второй вида
Код: plaintext
SUBSTR(postanov, 5 , 8 )
Так вот если я ищу или полностью '27ВВ155675', то идет поиск по первому индексу(~15 сек), если я ищу через запрос
Код: plaintext
select postanov from bally where substr(postanov, 5 , 8 )='1556' 
то поиск также идет около 15 сек. А если ищу примерно так:
Код: plaintext
select postanov from bally where substr(postanov, 5 , 10 )='1556'

то поиск идет около 2 минут, т.к. подобного индекса нет в таблице.

Отсюда делаю вывод, что индексы все таки используются. Вопрос в том, почему поиск идет так долго? Если открыть таблицу в Visual FoxPro (shared) через сеть и выполнить запрос
Код: plaintext
select postanov from bally where substr(postanov, 5 , 8 )='1556'
то результат придет мгновенно. Неужели проблема скорости в VFP OLE DB ?
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35202944
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы опять делаете предположения основываясь не на знаниях, а на так называемом "здравом смысле", т.е. личном опыте. Пока Вы точно не будете знать используется индекс или нет, все Ваши построения так и остануться предположениями и не более того.

Посмотрите описание функции SYS(3054). Там есть вариант сохранения результаты работы в переменную памяти, откуда ее уже можно было бы записать в мемо-поле таблицы и потом посмотреть.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35203148
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Володь, sys(3054) в OLEDB не поддерживается.

Автору надо либо в фоксе план запроса посмотреть, либо писать СОМ.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35203243
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mdel... Вопрос в том, почему поиск идет так долго? Если открыть таблицу в Visual FoxPro (shared) через сеть и выполнить запрос то результат придет мгновенно. Неужели проблема скорости в VFP OLE DB ?
Может на фоксе написать? C# по какой причине выбран?
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35204950
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T Mdel... Вопрос в том, почему поиск идет так долго? Если открыть таблицу в Visual FoxPro (shared) через сеть и выполнить запрос то результат придет мгновенно. Неужели проблема скорости в VFP OLE DB ?
Может на фоксе написать? C# по какой причине выбран?

По той простой, что на фоксе я не писал уже года 3-4, а в C# пишу постоянно :)

Я запустил фокс, ВЫЯСНИЛ таки, какие индексы используются, и попутно выяснил что проблема была совершенно в другом!
На поле постановления было 2 индекса: 1-по всему полю, второй вида SUBSTR(postanov,5,8) - то есть поиск по номеру постановления без 27ВВ. То есть я теперь утверждаю, что индексы используются, хотя ВладимирМ упорно не хочет это признать :)

Вот здесь я описал в чем проблема такого длительного поиска.
...
Рейтинг: 0 / 0
Какая возможна альтернатива Like в VFP OLE DB?
    #35206745
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mdel Dima TМожет на фоксе написать? C# по какой причине выбран?
По той простой, что на фоксе я не писал уже года 3-4, а в C# пишу постоянно :)
Еще подумай о фоксе, тем более писал раньше.

MdelНа поле постановления было 2 индекса: 1-по всему полю, второй вида SUBSTR(postanov,5,8) - то есть поиск по номеру постановления без 27ВВ. То есть я теперь утверждаю, что индексы используются, хотя ВладимирМ упорно не хочет это признать :)
ВладимирМ вероятно не ознакомился со всеми твоими тестами.
MdelВот здесь я описал в чем проблема такого длительного поиска.
Там ответили, я тоже по твоим тестам на 90% уверен что дело в OLE DB. Так-что выбирай или тормоз с OLE DB, или COM для запросов на фоксе или целиком на фоксе писать.

Как вариант попробуй по OLE DB из фокса. Если тоже 10-12 сек., то это не в пользу OLE DB
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Какая возможна альтернатива Like в VFP OLE DB?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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