Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
Имеется таблица 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' тоже выполняется долго.

Возможно ли ускорить процесс поиска по данному критерию?
10 мар 08, 16:51    [5390762]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
пишу в VS 2005, C#, NET Framework Data Provider for OLE DB.
10 мар 08, 16:55    [5390772]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658


"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

11 мар 08, 05:40    [5391848]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1273
в VFP Индекс поможет - рашмор

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

а вот в .NET Framework Data Provider for OLE DB. ??
очень даоже интеерсно - по идее должно - ОТПИШИ плз сюда помогло или
11 мар 08, 20:21    [5396483]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
select field from table where field like '%549812'
11 мар 08, 22:51    [5396803]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
AleksMed
select 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),

Индекс я не могу сделать, программа пишется для сторонней организации, менять структуры таблиц мне не позволят.
12 мар 08, 11:10    [5397984]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Mdel
Тогда объясните, почему когда я ищу заведомо НЕСУЩЕСТВУЮЩИЕ данные, то есть вместо 43КМ549812 я ищу ОР99ГОШЛГН, то ответ о том, что таких данных нет приходит МОМЕНТАЛЬНО? с like без Like, по барабану.

Странно, попробуй поискать похожее на нормальное, но не существующее, что-то типа 43КМ439873
Mdel
Galyamov Rinat

ускорения можно добится создав индекс по выражению right(field,6),

Индекс я не могу сделать, программа пишется для сторонней организации, менять структуры таблиц мне не позволят.

При отсутствии индекса поиск будет идти перебором всех записей. Оптимизация возможна только при наличии индекса.
12 мар 08, 12:06    [5398462]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658



> Тогда объясните, почему когда я ищу заведомо НЕСУЩЕСТВУЮЩИЕ данные,
> то есть вместо 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

13 мар 08, 05:31    [5403332]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658

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

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


Posted via ActualForum NNTP Server 1.4

13 мар 08, 05:34    [5403335]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658

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


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

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


Posted via ActualForum NNTP Server 1.4

13 мар 08, 05:36    [5403339]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
короче, объясняю как есть :)
есть база ГАИ, в ней постановления о штрафах.
номер постановления 27ВВ155675 - точно есть(мой номер :) )
1. Индекс по полю есть.
2. Если я ищу прямое вхождение 27ВВ155675, то поиск по СЕТИ идет около 10-12 сек.
Если я ищу по like '27%155675', т.е 27% я добавляю в коде, а пользователь, чтобы не вводить буквы(для ускорения работы), вводит только цифры, то поиск идет около минуты.
3. если я ищу НЕСУЩЕСТВУЮЩИЕ данные, то есть по прямому вхождению ищу 27ВВ999999 - ответ что записей нет приходит моментом.

А длина поля, как вы можете видеть, равна 10. А что, это на что то влияет? именно 10?
13 мар 08, 09:53    [5403657]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
Если хотите, я вам даже видео выложу как он моментом ищет левые данные и как долго существующие.. :) я прям в прострации :)
13 мар 08, 09:56    [5403667]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Mdel
Если хотите, я вам даже видео выложу как он моментом ищет левые данные и как долго существующие.. :) я прям в прострации :)

Видео не надо. Надо изначально корректно описывать задачу. Ясновидящих тут нет.
Было так:
Mdel
Мне необходимо организовать поиск по последним 6 цифрам.
Вот на это тебе и отвечали.

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

Полностью оптимизированный поиск по индексу + выборка результата по сети. Такая скорость тоже не устраивает?

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

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

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

Полностью оптимизированный поиск по индексу, а т.к. в индексе нет, то выборки результата не происходит.

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

Что еще можно попробовать:
1. Шаблон заменить на '27??155675'. Хотя думаю это не сильно ускорит
2. Использовать монопольный доступ к таблице, тогда издержек на блокировки не будет и клиент кэшировать будет. Как вариант иметь обновляемую копию на клиенте, возможно только поля с номером и Id записи, тут индексы какие угодно можешь создать, делать выборки списка Id, а по Id запрос к основной базе.
13 мар 08, 10:24    [5403796]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
Монопольный не получится, т.к. в гаи все таки народ тоже работает с базой :) копию тоже бессмысленно заводить, все должно быть в живой базе...

Остановился все таки на полностью оптимизированном запросе. Пусть уж лучше оператор наберет буквы с номером и подождет 10 сек, чем наберет только номер и будет ждать минуту.
13 мар 08, 10:44    [5403925]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Используйте функцию SYS(3054,11), чтобы понять, какие индексы используются и есть ли оптимизация

=SYS(3054,11)
SELECT ... FROM ... WHERE
=SYS(3054,0)

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


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

Field LIKE 'XXX%'

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

Field = 'XXX'

при настройке SET ANSI OFF (эта настройка по умолчанию). И, как следствие, использует индекс. Т.е. есть ускорение.
13 мар 08, 11:21    [5404241]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
Mdel
2. Если я ищу прямое вхождение 27ВВ155675, то поиск по СЕТИ идет около 10-12 сек.

Это не просто много а очень много...

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

Если сервер под Windows, то можно прямо на сервере сделать Web Service (на любимом Вами .NET это делается очень легко и быстро) и уже к нему слать запросы. Если правила не позволяют, то поставить рядом еще сервер, соединить чем-то быстрым навроде 1-2Gb/s сетью и снова "повесить" туда Web Service + использовать его для других задач - заодно всем поможете делать их работу быстрее

Сообщение было отредактировано: 13 мар 08, 12:28
13 мар 08, 12:26    [5404852]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
нет, спасибо конечно за такие советы, только вы забываете что я пишу программу для гос.организации, причем сторонней, сам я там не работаю. :) Поэтому никто не даст мне воткнуть веб-сервис к ним, равно как и поставить другой сервак :) тех.обеспечение ГАИ давно оставляет желать лучшего :)

ВладимирМ

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

Field LIKE 'XXX%'

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

Field = 'XXX'


Да, эквивалентна, но вот конструкции 'XX%XXX', а тем более '%XX', нет.
На локальной базе все ищется намного быстрее, прямой поиск (27ВВ155675) выполняется за 1-2 сек, частичный (27%155675) - около 15 сек. Основная то проблема в сети+железо на котором все это крутится+невозможность поправить индексы в базе. Их базу часто обновляет Москва, заменяя таблицы. Индексация используется однозначно, в ранних версиях программы без индексов поиск вообще шел около 5 минут :)
14 мар 08, 01:01    [5408351]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Mdel
Индексация используется однозначно, в ранних версиях программы без индексов поиск вообще шел около 5 минут :)

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

Причина ускорения может быть другой. Не зависящей от индексов. Вот и убедитесь, что индексы реально используются. И какие именно индексы.
14 мар 08, 11:52    [5409846]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
ВладимирМ

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

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

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

file does not exist

Тогда объясните мне неучу, почему ОБНОВЛЕНИЕ и УДАЛЕНИЕ происходит моментально? запрос тот же самый: update table set sank = 'ОПЛ' where postanov='27ВВ155675'
19 мар 08, 11:18    [5428631]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
Выяснил я точно по индексам. на данное поле postanov стоит 2 индекса, первый - по полной строке postanov, второй вида
SUBSTR(postanov,5,8)
Так вот если я ищу или полностью '27ВВ155675', то идет поиск по первому индексу(~15 сек), если я ищу через запрос
select postanov from bally where substr(postanov,5,8)='1556' 
то поиск также идет около 15 сек. А если ищу примерно так:
select postanov from bally where substr(postanov,5,10)='1556'

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

Отсюда делаю вывод, что индексы все таки используются. Вопрос в том, почему поиск идет так долго? Если открыть таблицу в Visual FoxPro (shared) через сеть и выполнить запрос
select postanov from bally where substr(postanov,5,8)='1556'
то результат придет мгновенно. Неужели проблема скорости в VFP OLE DB ?
20 мар 08, 06:48    [5433555]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Вы опять делаете предположения основываясь не на знаниях, а на так называемом "здравом смысле", т.е. личном опыте. Пока Вы точно не будете знать используется индекс или нет, все Ваши построения так и остануться предположениями и не более того.

Посмотрите описание функции SYS(3054). Там есть вариант сохранения результаты работы в переменную памяти, откуда ее уже можно было бы записать в мемо-поле таблицы и потом посмотреть.
20 мар 08, 11:57    [5435070]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
Володь, sys(3054) в OLEDB не поддерживается.

Автору надо либо в фоксе план запроса посмотреть, либо писать СОМ.
20 мар 08, 12:46    [5435600]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Mdel
... Вопрос в том, почему поиск идет так долго? Если открыть таблицу в Visual FoxPro (shared) через сеть и выполнить запрос то результат придет мгновенно. Неужели проблема скорости в VFP OLE DB ?

Может на фоксе написать? C# по какой причине выбран?
20 мар 08, 13:05    [5435772]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Mdel
Member

Откуда:
Сообщений: 136
Dima T
Mdel
... Вопрос в том, почему поиск идет так долго? Если открыть таблицу в Visual FoxPro (shared) через сеть и выполнить запрос то результат придет мгновенно. Неужели проблема скорости в VFP OLE DB ?

Может на фоксе написать? C# по какой причине выбран?


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

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

Вот здесь я описал в чем проблема такого длительного поиска.
21 мар 08, 02:16    [5439632]     Ответить | Цитировать Сообщить модератору
 Re: Какая возможна альтернатива Like в VFP OLE DB?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
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
21 мар 08, 17:26    [5443696]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить