|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
Добрый день всем! Есть *.dbf файл содержащий ~250000 записей с множеством полей размером ~700 МБ. Необходимо по значению двух полей найти запись и подставить в Excel значение трех других полей. Использую VFPODBC. Первоначально при каждом поиске создавал Recordset, а в sql-запросе указывал условие поиска. Код: vbnet 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. 31. 32. 33. 34.
Время выполнения запроса на Atom N270 1GB RAM - от 20 до 40 секунд. Сейчас открываю Recordset с SQL запросом без условия при открытии документа. А ищу нужную запись накладыванием фильтра на Recordset. Код: vbnet 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
Документ дольше открывается, занимает больше памяти. Но поиск записи выполняется за ~8 секунд. Есть ещё одна таблица, по объёму в два раза больше, количество записей не знаю. По второй таблице поиск осуществляется за ~15 секунд. Как можно ускорить поиск в *.dbf? Как указать индексный файл при использовании VFPODBC? Наличие файла ускорит поиск в первоначальном варианте? При положительном ответе на предыдущий вопрос, как создать индексный файл VBS-скриптом с использованием VFPODBC драйвера? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 11:57 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
При таком объеме данных стоит подумать об их переносе в более шуструю бд, если условия это позволяют. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 12:00 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
Вообще это больше вопрос по тонкостям dbf, чем VB, вам лучше сюда обратиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 12:03 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
xnik, Есть *.dbf файл содержащий ~250000 записей с множеством полей размером ~700 МБ. это примерно 3000б на запись strsql2 = "select R24, R25, R26 from vxxx.dbf where r55='" & spv & "' and r56='" & npv & "'" а сколько занимают r24-r25-r26 похоже r55+r56 примерно 10 типа 55555-666666 в одной из задач перегоняла DBF в MDB по запросу пользователя(обновление таблицы) поиск и расчеты уже проводились в MDB на фиксированном на дату-время массиве ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 12:37 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
xnik, покажите тип и размерность R55, R56 покажите пример данных в этих полях в таблице покажите пример spv и npv (или Target.Value ) или так: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 22:18 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
To AndreTM: Поле R55 - СНАRACTER длина 4, поле R56 - CHARACTER длина 6. Target.Value - серия и номер документа, например 50АА012345. To ПЕНСИОНЕРКА: Поля R24, R25, R26 - CHARACTER длина 20. Во втором варианте Recordset уже в памяти, загружены только необходимые данные. Время поиска в mdb файле будет меньше, чем выполнение Recordset.Filter? Я думал о таком варианте: перенос по запросу только необходимых данных в дополнительную базу и поиск по новой базе. Буду пробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 08:21 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
для ускорения поиска нужны индексы. они даже есть в ДБФ, но вот как с ними работать через АДО не скажу надо порытся на форуме ДБФ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 08:26 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
xnik, что-то я недопонимаю во фразе If (nLen >= 10) Then ... если Len(npv)=6, то от spv надо искать не более 4 символов, ибо всё равно Len(r55)=4 Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 20:41 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
AndreTM, Правильно будет поставить условие If Len(pv) = 10. Моя ошибка. Защиту от некорректного ввода ещё не делал. Добавлю, следующее: к файлу *.dbf есть одноименный индексный файл *.cdx. Наличие файла в одной директории с таблицей не уменьшает время поиска, по нужным полям. Может они не входят ни в один индекс. Поиск по полю R24 (содержит фамилию, определенно должно быть одним из индексов) занимает примерно одинаковое время без индексного файла и с ним, даже с включением сортировки по этому полю. Я думал, что простое наличие индексного файла определяется VFPODBC. Сама база не открывается редактором DBF, чтобы посмотреть индексы. Как перенести тему в ветку по FoxPro? Может там подскажут? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 21:06 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
Вряд ли наличие индекса поможет - ADO индексы Фокса не пользует. Быстродействие же выборок внутри самого Фокса базируется на Рашморе, - естественно, это внутреннаяя технология. Как вариант - сделать одно суммарное поле "серия+номер" и выбирать только не му, но это вряд ли даст сильный прирост быстродействия. Если вам действительно требуется постоянное соединение со справочником - вариант вам был подсказан Пенсионеркой. Еще вопрос - а зачем каждый раз делать выборку? Во втором варианте вы как бы сначала действуете правильно - одноразово забираете справочник, но затем - зачем именно фильтрация-то? Есть же .Find(), .Seek() (ведь можно и Index для рекордсета создать) На вашем же месте я бы поменял инструмент. Как я понимаю, сейчас вы по реквизитам документа находите в таблице нужные вам данные - и вписываете их. При этом "справочник" персоналий не меняется (или меняется не "на ходу"). Ну так вам прямо подсказано - реализуйте свою задачу на Access. Иначе вам (если вы не надеетесь на быстродействие встроенных методов) для ускорения поиска все равно придется делать в Excel'е что-то вроде индексов - например, преобразовывать таблицу в дерево поиска посимвольно... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 22:36 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
AndreTM, Вы правильно поняли задачу. Find - осуществляет поиск только по одному полю. Filter можно сделать по нескольким полям. Пробовал сделать сначала Find по номеру, а затем перебором найти запись с нужной серией. Find по номеру длится дольше, чем Filter сразу по двум полям. Для функции Seek создать программно индекс не пытался. Буду делать с помощью промежуточной базы Access. Может будет быстрее, чем Filter на Recordset'е. Спасибо, за ответы. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2012, 10:31 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
Попробуйте (не знаю, получится или нет) построить индекс для АДО рекордсета (уже должен быть открыт) по нужному полю, типа: Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2012, 13:16 |
|
Как можно ускорить поиск в dbf файле ~250000 строк
|
|||
---|---|---|---|
#18+
xnikFind - осуществляет поиск только по одному полю...И что? Вы Select-SQL вообще не знаете? Сложно сделать: Код: vbnet 1.
и затем использовать Код: vbnet 1.
Индекс ведь тоже надо делать по нескольким полям... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2012, 20:18 |
|
|
start [/forum/topic.php?fid=60&fpage=79&tid=2157800]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 321ms |
total: | 475ms |
0 / 0 |