|
|
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыф автор... для чего озаботиться необходимыми индексами и переменными уровня рекурсивной процедуры для их текущего хранения. Нельзя ли по-подробнее. Я с этого начинал и пришел в тупик. Скорее всего по собственной ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 12:51 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 Владимир Саныч Очевидно так. Но конфликтов у меня не происходило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 12:53 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 Victosha автормодификация - на ado открыь 2 client-side рекордсета, локально их индексировать, дальше и FindFirst (не вижу зачем) и Filter их будут успешно пользовать. Рекурсию придется линеаризировать циклами. С ado не работал. Если не в лом, напиши реализацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 12:59 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Попробуй что-то в этом роде: Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. По поводу "конфликта" саныч неправильно выразился. Там не будет конфликта программного (если не закрывать рекордсеты на уровнях явным образом). Там при возврате из вложенной процедуры будешь иметь совсем не тот рекордсет, который был задан на ЭТОМ уровне рекурсии (он переопределится на другом). Т.е. "конфликт" логический. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 13:20 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
фыыфПо поводу "конфликта" саныч неправильно выразился... Т.е. "конфликт" логический. А я и не говорил, что будет какой-то иной конфликт, кроме логического... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 13:26 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Вот тебе и на!!! Ушёл решать задачку когда шесть постов было, а пришёл - топик на двух страницах уже. Круто!!! Предлагаю свой вариант без использования рекурсии. Прикреплённый файл для Access 2000 Данные из этого поста Самый плодовитый предок под номером 65 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 13:46 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 lobodava На работе экран стоит :( Скачать нельзя. Посмотрю только дома, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 14:24 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Копирую решение lobodava сюда: Код: 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. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 14:25 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Владимир Саныч, весьма признателен! 2 lobodava: авторСамый плодовитый предок под номером 65 61 д.б. таким же - они супруги! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 14:39 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Таблицы: tblFam: Fam, Papa, Mama tblKids: Kid, Fam, ID tblDescendants: Kid, Generation В последнюю таблицу записываются все потомки PersonID и их поколение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 14:39 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
автор61 д.б. таким же - они супруги! :) Понятное дело ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 14:46 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
lobodava, увы... Время работы на больших таблицах осталось прежним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 15:42 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
авторд.б. таким же - они супруги ответ неверный. есть случаи нескольких семей у персоны. гаремы, опять же. и бастарды. :о) и все равно прогонка по индексированному рекордсету (курсору - на сервере) должна работать (в данном случае) быстрее нескольких запросов. А именно - за счет "подготовки" запросов. Да, и в случае разделенных данных/кода вместо set dbs=currentDb, открывай DB данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 15:48 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
авторВремя работы на больших таблицах осталось прежним не мудрено, если таблицы не индексированы по полям, по которым идет поиск (тут, у лободавы, не помешают индексы (Fam,Papa) и (Fam,Mama), причем как будут себя вести индексы при OR в ON в JOIN-е фих его знает. Возможно лучше (для больших таблиц) разбить запросы на 2 запроса - отельно по папам и отдельно по мамам). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 16:00 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыф авторответ неверный Все так. Но в конкретном случае других браков не было :) А по сути предложенного решения - разбираюсь с индексами. Можно по-четче (для меня): у каких полей какие индексы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 16:02 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
для процедуры прогонки по рекордсету индексы (их имена) приведены в коде, состав полей - под ним. для запросов со связями (или со сложным WHERE) индексы должны быть по возможности отсеивающими большую часть таблиц по условию. Для связи по нескольким полям - индексы должны быть составными по всем полям связи (если такая связь не определена как связь с поддержанием целостности на уровне схемы данных - т.к. в последнем случае Аксесом автоматически создаются служебные индексы (вторичные ключи), не отображаемые во вкладке "индексы" таблицы). Причем они должны быть одинаково структурированными для обеих связываемых таблиц.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 16:11 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
почетче в tblFam у полей Fam,Papa,Mama поставь в конструкторе таблиц свойство "индексирован=Да(допускаются совпадения)" в tblKids сделай то же для поля Fam в tblDescendants для поля Kid и сделайте составной индекс (Generation,Kid) PS тип: преобразовав в простой селект, сохраните запрос как стандартный запрос акцесс и натравите на него Сервис->Анализ->Быстродействие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2004, 16:15 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыф Разобрался с индексами в вашем коде. Проверил - начинает работать шустро, но... После найденных одной-двух тысяч потомков работа практически останавливаетя. Что-то переполняется (память, кэш ???). Есть ли какие соображения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 09:28 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
а ты не пробовал перед открытием рекордсета определить что ты будешь сним делать Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 12:23 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 Zenia Проверил. Результат тот же :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 13:06 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
соображения такие: рекурсия приводит к сохранению на каждом уровне переменных уровня рекурсии Dim i As Long, nS As Long, nR As Long, iSx As Long Dim sIn(0 To 1) As String не думаю, что пара тысяч этих переменных убьет процесс. Но вот каждая процедура должна при рекурсии еще и помнить, куда она должна вернуть результат/управление. Что там происходит - а бог его знает. Посему, если грешить на рекурсию и переполнения, а не на банальный баг, который где-то недочищен (и зацикливает процедуру при редком сочетании данных), имеет смысл избавиться от рекурсии. Идея - в решении lobodava (в циклическом переборе по поколениям). Но, видимо, имеет смысл не выполнять запросы, а в предложенном мной цикле выбросить рекурсивный вызов процедурой самой-себя, добавить параметры вызова (вернее - переменные уровня модуля), необходимые для нового вызова процедуры для следующего поколения из внешней процедуры-цикла (видимо - 2 массива: 1. массив потомков данного уровня, 2. массив потомков следующего, и, возможно, номер уровня) а во внешней процедуре вызывать процедуру в двойном цикле - до возврата пустого массива потомков следующего уровня, а во внутреннем цикле (двойного, внешней процедуры) - и осуществлять вызов - по массиву потомков текущего уровня (заполняя одновременно массив следующего). Почему массивы? Потому что иначе придется повторять операции чтения (вытягивать данные запросами, пусть и по индексированным таблицам), что дольше. предполагаемый выигрыш: - освобождение от рекурсий и вместо смены индекса и поиска практически всякий раз Seek-ом, можно после первого Seek делать просто MoveNext (индекс то задан, и не меняется ни он, ни положение текущей записи в рекурсивных вызовах), до выхода по сравнению ключа. Что быстрее. затраты: - 2 массива Long, переменной длинны, объявленные на уровне модуля, приватные; но на потомков только одного уровня (если будем вычислять потомков Адама или Евы, боюсь, памяти простой персоналки не хватит, но и запросы на таких объемах - не фонтан, результаты же их все равно надо куда-то складывать, если только не пытаться открыть рекордсет с последовательным доступом и т.п...). + Минимальная переделка процедуры FindDescendantT (выброска ре-Seek-ов и ре-Index; замена самовызова на блок пополнения массива потомков следующего уровня); и написание процедуры ее вызова как FindDescendantT(Pc(i), iGeneration) в цикле. (первый вызов - как и было). Вот только не найдем ли мы в итоге логический "баг", наподобие ошибки в данных - нахождение кольца по предкам/потомкам? Или еще чего. ___ ЗЫ : ДА, есть теоретический вопрос. Если пипл является потомком другого более чем одного уровня (по паре веток разной длинны), то и его потомки будут дважды считаться в таблице потомков :). Что об этом случае думает генеология? (хорошо, что чел не может быть собственным предком, но база, кстати, об этом не знает - если нет триггеров/правил, отслеживающих кольца). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 13:10 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
1) попробуй поставить DBEngine.Idle перед Next iSx 2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 13:11 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Результат работы кода фыыф'а (самого быстрого): Время Кол-во записей 1 сек. 4500 5 сек. 5500 10 сек. 6000 15 сек. 6100 и далее в той же прогрессии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 13:21 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
и все таки мыслится, что если процедура именно "останавливается", то надо посмотреть на вероятные баги в режиме отладки (уж очень мало). Очень может быть, что чегой-то я недоглядел. Но есть и идейка о том, что задалбливают перечтения индексов, количество которых (перечтений) растет быстрее, чем число потомков (по возвращению из рекурсий со сменой пола - новое перечтение). Одна надежда, что индексы в кеш влезают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 13:22 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32507501&tid=1674665]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
167ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 256ms |
| total: | 519ms |

| 0 / 0 |
