|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
Привет всем. Есть код, смысл его в том, что есть архивные файлы с оплатой, они находятся в папках для каждого месяца, а месяца разбиты по годам (но это не важно). дерево такое: 2008 _01\oplata.dbf _02\oplata.dbf _03\oplata.dbf _NN\oplata.dbf 2009 _01\oplata.dbf _02\oplata.dbf _03\oplata.dbf _NN\oplata.dbf Задача в курсор выбрать из всех таблиц записи по лицевому счету. Написал цикл выборки, работает отлично, но во многопользовательском режиме тормозит. Использую SET KEY на каждой таблице, а потом перебором записей вставляю их в курсор. APPEND FROM добавляет намного медленней. SELECT * - тоже не вариант - вообще глохнет надолго. Можно ли еще ускорить этот процесс, может есть способы это делать быстрее, чем в приведенном коде? автор Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 09:57 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
А. С., Как получивший подобное наследство заявляю: если есть хоть какая-то возможность, спихни все эти файлы оплат в одну табличку на sql-сервер (только добавь поле "дата" :) ), добавь индекс по ЛС, и выбирай с хорошей скоростью и без этих ублюдочных циклов... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 10:24 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
sql сервер не вариант, спихнуть в одну таблицу хорошая идея, только таблица разрастется. Как вариант можно одну таблицу вести для каждого года. Я хотел спросить можно ли сделать выборку быстрее при данных обстоятельствах? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 10:32 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
1. Какая версия фокса? В VFP9 запросы стали работать намного быстрее. 2. Приведи пример запроса, который "глохнет надолго". Наверняка его можно оптимизировать, и добавлять данные не построчно, а "пачкой" 3. Вместо конструкции "Append Blank + Gather From" можно добавлять данные одной командой Insert from memvar 4. Обработка одной большой таблицы будет быстрее, чем нескольких маленьких. Если данные архивные, то нет проблем создать слить все в одну таблицу ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 11:58 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
karly™1. Какая версия фокса? В VFP9 запросы стали работать намного быстрее. Простите, 9-ка karly™2. Приведи пример запроса, который "глохнет надолго". Наверняка его можно оптимизировать, и добавлять данные не построчно, а "пачкой" Если в цикле на каждой таблице делать SELEST * FROM tmp INTO CURSOR ttt а после из курсора вставлять APPEND FROM DBF('ttt') karly™3. Вместо конструкции "Append Blank + Gather From" можно добавлять данные одной командой Insert from memvar Спасибо, попробую, только думаю что это вряд-ли ускорит процесс. Я понимаю что у меня загвоздка с открытием самих таблиц, потому что быстрее чем SET KEY TO в моем случае вряд-ли что-то будет работать.... karly™4. Обработка одной большой таблицы будет быстрее, чем нескольких маленьких. Если данные архивные, то нет проблем создать слить все в одну таблицу Просто у меня в программе все выборки и отчеты интерфейсно заточены под такое дерево. Придется много переделывать. Вот я и спрашваю как еще можно сделать именно для данного представления таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 12:15 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
А. С.Если в цикле на каждой таблице делать SELEST * FROM tmp INTO CURSOR ttt а после из курсора вставлять APPEND FROM DBF('ttt')Условия запроса какие пишете? И какие есть индексы у таблиц? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 12:17 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
nlsz=555 SELEST * FROM tmp WHERE id_ls=nlsz INTO CURSOR ttt Индексы в таблицах *.CDX по id_ls присутствуют, но не вижу связи между SELECT * и индексами ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 12:51 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
А. С.не вижу связи между SELECT * и индексамиВот это и плохо ибо связь самая прямая. Наличие правильных индексов очень сильно ускоряет select. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 12:54 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
Посмотрел на код внимательнее 1. Вместо макроподстановки USE &cFile ALIAS tmp SHARED лучше использовать именное выражение USE (cFile) ALIAS tmp SHARED 2. Связка Код: plaintext 1. 2. 3.
Код: plaintext
3. Если индекс простой, то запрос в девятке должен работать с той же скоростью, что и поиск по индексу. Если это не так - переписывайте условие запроса, чтобы оно точно совпадало с индексным выражением, и сравнивайте Set("collate") и IDXCOLLATE(). Сделав через запрос, вы получите выигрыш в обработке сразу нескольких записей. Ну и теоретически неявное открытие таблиц запросом должно работать чуть быстрее, чем Use (cTable) 4. Медленное открытие таблиц на сервере можно побороть правильной настройкой сети. Кроме того, можно открывать таблицы заранее, при старте приложения, и держать их открытыми. Вы получите единовременное замедление в самом начале, которое окупится при многократном обращении к ним. Для подстаховки можно открывать их только на чтение - USE (cTable) Shared noupdate ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 13:06 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
Любой SELECT быстрее выборки SET KEY TO он не будет работать все равно. А таблицы при этом естесственно проиндексирваны. А вот "Наличие правильных индексов очень сильно ускоряет select" - для меня откровение, нигде не встречал, почитаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 13:06 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
При соблюдении следующих условий 1. VFP 9 2. Индексное выражение точно совпадает с условием запроса 3. Порядок сортировки индекса idxcollate() совпадает с настройкой set collate 3. Кодовая страница таблицы совпадает с cpCurrent() Select будет работать с той же скоростью, что и поиск по индексу seek или Set key Почитать, и выполнить сравнительные тесты вы можете здесь http://foxclub.ru/articles/art45.php#example Напишите точное выражение индекса таблицы, и текст своего запроса, тогда можно будет найти причину замедления. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 13:23 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
автор2. Связка SET ORDER TO tag id_ls SET KEY TO nlsz SCAN - это медленно. Быстрее (и проще) одной командой Scan for id_ls = nlsz ИМХО, Код: plaintext 1. 2. 3. 4.
ещё быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 13:33 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
ШестипаловIF SEEK(nlsz) DO WHILE id_ls=nlsz SKIP ENDDO ENDIF ещё быстрее.Согласен. Полезный прием, если между Do While и EndDo нужно выполнить несколько команд. Здесь же все можно уложить в один Select ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 13:49 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
karly™Согласен. Полезный прием, если между Do While и EndDo нужно выполнить несколько команд. Здесь же все можно уложить в один Select А с этим согласен я :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 14:00 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
Спасибо за ответы, буду экспериментировать и засекать условия и время выполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 14:25 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
А. С.Привет всем. Есть код, смысл его в том, что есть архивные файлы с оплатой, они находятся в папках для каждого месяца, а месяца разбиты по годам (но это не важно). дерево такое: 2008 _01\oplata.dbf _02\oplata.dbf _03\oplata.dbf _NN\oplata.dbf 2009 _01\oplata.dbf _02\oplata.dbf _03\oplata.dbf _NN\oplata.dbf Задача в курсор выбрать из всех таблиц записи по лицевому счету. Можно ли еще ускорить этот процесс, может есть способы это делать быстрее, чем в приведенном коде? Может сделать табличку в которой отобразить счета и соотв. им название табл оплат, в соответствии с которой тянуть данные с указанных таблиц. Т.е. не открывать те таблички в которых нет данных по указанному счету. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 15:23 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
ШестипаловIF SEEK(nlsz) DO WHILE id_ls=nlsz SKIP ENDDO ENDIF ещё быстрее. Огромное СПАСИБО! Отрабатывает 40 архивных месяцев меньше 2-х секунд. Решение то на поверхности лежало. Век живи - век учись. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2010, 23:19 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
А. С. Век живи - век учисьНаучившегося использовать индексы в запросах так же ждут приятные открытия ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2010, 11:32 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
Да дело в том что программирую на Фоксе достаточно давно, но никогда не думал что в селекте могут использоваться индексы. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2010, 12:03 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
главное найти начало стопки ... иначе для чого индекс то? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2010, 09:42 |
|
Как ускорить этот цикл? (выборка из архивных файлов по условию)
|
|||
---|---|---|---|
#18+
ШестипаловИМХО, IF SEEK(nlsz) DO WHILE id_ls=nlsz SKIP ENDDO ENDIF ещё быстрее. Теоретически: Код: plaintext 1. 2. 3. 4. 5.
А вообще - чтобы покороче, то весь кусок: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Код: plaintext
Да, чуть не забыл, для проверки оптимизируемости SQL выражений (если тормозит SELECT) можно использовать функцию SYS(3054). Т.е. где-то так Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2010, 11:58 |
|
|
start [/forum/topic.php?fid=41&msg=36543892&tid=1585456]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 343ms |
total: | 601ms |
0 / 0 |