|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Подобная проблема обсуждалась. У меня следующий случай. База из dbf файлов существует ок. 8-ми лет. Все хорошо работало. На днях после ввода очередной порции информации начались глюки. SELECT из 3-х таблиц, каждая из которых до 15 М, зависает, и пару раз выдавало NOT enough memory for file map. Каждый раз забирает временно 1-2 гига на диске. Имеется: Visual Foxpro 5.0 RAM – 1 Gb и на винте больше 20 гигов. Сам Фокс выбирает SYS(3050, 1)=722000000 SYS(3050, 2)=180000000 Разные значения функции SYS(3050) результата не дали. Временный перенос на комп с оперативкой в 512 также проблемы не решило. Помогите, пожалуйста. Что это может быть? Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2008, 16:02 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
А размер DBF случайне не 2 Гб? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2008, 16:23 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Не пользуйтесь джойнами с большими объемами, особенно Left Join. Подзапросы позволяют сэкономить память и время. Иногда такое бывает, если в таблице, из которой идет связь один-ко-многим поле для связи не уникально. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2008, 16:45 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Возможно, повреждены индексы. В подобной ситуации FoxPro не ругается, но перестает их использовать, что и может привести к прямому сканированию таблиц. Попробуйте переиндексировать базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2008, 17:52 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Что-то есть подозрение, что идет декартово произведение всех таблиц. Запрос в студию! Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2008, 11:27 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Galyamov Rinat Что-то есть подозрение, что идет декартово произведение всех таблиц. Запрос в студию! Поддерживаю + настройка set delete на момент выполнения запроса + все индексы на таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2008, 14:18 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Спасибо всем за предложения. Ничего не помогло, вот отчет о проделанной работе: DBF 11-12 Мб. Join в SELECTe нет. Переиндексацию делала раньше несколько раз, даже создавала новые таблицы с новыми CDX. Сейчас проверяла и чистила таблицы, все ключевые поля были уникальны. На момент выполнения запроса SET DELETE ON "Виснущий" запрос и индексы в прилагаемом файле. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2008, 16:53 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
_Tania_Join в SELECTe нет. Надо поставить inner join вместо запятых. Запрос текстом просили и не кучу скриншотов в вордовском файлике. Не получится самой джоины вставить - выкладывай запрос текстом, примерно так: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2008, 17:00 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Какого типа поля aa70, fb02, fb12 ? Для ускорения нужен индекс по fb12. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2008, 17:09 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
aa70,fb02 - integer fb12 -numeric(1). Индексация по этому полю ничего не меняет. Запрос текстом не получится, слишком много подстановок из разных объектов.Пришлось бы все PRG выкладывать. А в скриншоте уже конкретная подстановка видна. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2008, 17:52 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
_Tania_aa70,fb02 - integer fb12 -numeric(1). Индексация по этому полю ничего не меняет. Запрос текстом не получится, слишком много подстановок из разных объектов.Пришлось бы все PRG выкладывать. А в скриншоте уже конкретная подстановка видна. И Вы нам предлагаете распознать скриншот? Или чисто медитативно глядя на запрос определять причины его зависания? Или просто не умеете запрос уже с подстановками скопировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2008, 18:01 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
_Tania_Запрос текстом не получится, слишком много подстановок из разных объектов. Несколько вариантов как поместить его текстом в буфер обмена: 1. Вместо Alt+PrintScreen нажать Ctrl+C 2. Переменная _cliptext - это буфер обмена Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2008, 18:08 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Ой мля... Какой запрос страшный. Беглым взглядом на скриншот могу сообщить следующее: Есть завязка таблиц (назовем их для простоты aa, bb и, как это не странно, bb) между aa и bb. Но какая то странная завязка (как только интерпритатор не ругается?) те. запрос вида select ... from aa, bb, bb where aa.поле1= bb.поле2 or bb=12 Разберем: Во первых, две таблицы с одинаковым именем (bb). Какую таблицу из них интерпритатор должен рассматривать как bb в директиве where? Не знаешь? Вот и он не знает. Поэтому он использует АЛИАСЫ (т.е. новые именования этих таблиц (bb)) внутри запроса. Т.е. для интерпритатора получается следующая контсрукция: select ... from aa_1, bb_1, bb_2 where aa_1.поле1= bb.поле2 or bb.поле3=12 Обрати внимание, что интерпритатор не переименует таблицу bb в директиве where, т.к. он не знает какую из них переименовать в bb_1, а какую в bb_2. Таким образом получаем полную чухню в условиях ограничения выборки. Это раз. Второе, cтоит OR. Это значит, что для всех записей таблицы bb, где поле3=12 выдернутся все варианты пересечения ВСЕХ (что самое ужасное) строк из всех таблиц (т.е. тупо декартово произведение трех таблиц). Впрчем где выполнится условие aa_1.поле1= bb.поле2 мы тоже получим большой набор ненужных строк, т.к. bb - таблица не участвующая в запросе и поле2 - внутри запроса константа. Ну и резюмируя все выше сказаное если указатель записи в таблице bb (т.е. той, алиас которой в данный момент называется bb) стоит на той записи, где поле3=12 то в результирующем запросе получим количество записей равное reccount('aa')*reccount('bb')*reccount('bb') ,т.е. при размере таблиц >= 12 мегабайт у нас наврятли ватит памяти даже на серваке :) Подведем общее итого. Проще вникнуть в задачу и написать ПРАВИЛЬНЫЙ запрос, чем пытаться исправить данную ахинею. PS А это ничто иное, как АХИНЕЯ, причем полная! Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 05:13 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Galyamov RinatОй мля... Какой запрос страшный. Это наследие FPD. Стиль селекта чисто FPD-шный, а названия полей и таблиц еще из более раннего прошлого. Сопровождал когда-то прогу написанную в середине 80-х, таблицы назывались A001, A002, B001 и т.д. Аналогичный подход к именам полей. Похоже были такие правила именования, т.к. видел другие проги тех же времен, стиль именования похожий. А селект с нуля писать не обязательно, надо лишнее из WHERE в JOINы перенести. Дело пятиминутное, если текстом его сюда выложить. Если топикстартеру влом это делать, то за нее никто этим не будет заниматься. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 10:06 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
> Автор: Dima T > Galyamov Rinat > Ой мля... Какой запрос страшный. > > Это наследие FPD. Да страшный он не в именовании полей/таблиц/стиле, а в полной безграмотности и непонимании. ОСНОВНЫЕ МОМЕНТЫ Я ОПИСАЛ Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 10:16 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Galyamov RinatДа страшный он не в именовании полей/таблиц/стиле, а в полной безграмотности и непонимании. Нормальный запрос из связки трех таблиц, ничего криминального не вижу. Распознать нечем, а то я бы поправил. надо только FPD-шный синтаксис Код: plaintext
Код: plaintext
Еще бы порядок JOINов немного поменять, но это только с текстом запроса можно показать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 10:52 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
> select ... from a, b, c where a.f1 = b.f2 and b.f3 = c.f4 and ... and ( > ... and ... or ...)заменить на нормальный > > select ... from a inner join b on a.f1 = b.f2 inner join c on b.f3 = c.f4 > where ... and ( ... and ... or ...) > Еще бы порядок JOINов немного поменять, но это только с текстом > запроса можно показать. Специально пересмотрел запрос. Ну нету там вот этого: where a.f1 = b.f2 and b.f3 = c.f4 И скобок (... or ...) нету. Есть просто ... and ...and ... and...OR ... Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 11:11 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Galyamov RinatСпециально пересмотрел запрос. Ну нету там вот этого: where a.f1 = b.f2 and b.f3 = c.f4 И скобок (... or ...) нету. Есть просто ... and ...and ... and...OR ... Как нет? Еще раз смотри. После третьего AND открывается скобка и закрывается перед INTO. OR внутри скобок. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 13:00 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
А автора вес нет. Может, у нее вообще запрос не такой. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 14:01 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
-- С уважением, Галямов Ринат Сагирович, заместитель начальника отдела по автоматизации производства отдела информационных технологий МУП "Томский энергокомплекс" тел. (8-382-2) 26-30-72 "Dima T" <nospam@sql.ru> сообщил/сообщила в новостях следующее: news:6624533@sql.ru... > Автор: Dima T > Galyamov Rinat > Специально пересмотрел запрос. > Ну нету там вот этого: > where a.f1 = b.f2 and b.f3 = c.f4 > > И скобок (... or ...) нету. Есть просто ... and ...and ... > and...OR ... > > > Как нет? Еще раз смотри. После третьего AND открывается скобка и > закрывается перед INTO. > OR внутри скобок. Разглядел :) Но from a,b,b все равно полный гон :) Надоть from a aa, b bb_1, b bb_2. Ну ладно. автора в студию, а там посмотрим что с ним делать (это я про запрос :) ) Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 14:08 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#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.
Ну, для начала, одинаковых имен таблиц-источников нет. Имена все-таки отличаются. В последней букве. Менять запрос на INNER JOIN практического смысла нет. С точки зрения выполнения запроса результат будет один и тот же. Просто другой синтаксис. Но не думаю, что план выполнения запроса будет отличаться. К сожалению в FoxPro реальный план выполнения посмотреть невозможно, но в MS SQL дело обстоит именно так. Ну, и "для порядка" желательно предварять имена полей в директиве Select. Также желательно явно указывать имена полей в результирующей выборке, если поля-источники одинаковые Код: plaintext 1. 2. 3. 4. 5.
На работу запроса это никак не повлияет, но добавит определенности и наглядности в код. ========= В данно случае, сомнения вызывает пользовательская функция FirstSup(). Можно привести ее код? ========= Какие индексы реально используются можно посмотреть при помощи функции SYS(3054) Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 14:29 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Galyamov RinatРазглядел :) Но from a,b,b все равно полный гон :) У тебя чего со зрением сегодня? Там написано from regi_aa, regi_f d , regi_f b т.е. from a,b,d Galyamov RinatНу ладно. автора в студию, а там посмотрим что с ним делать (это я про запрос :) ) Согласен. И запрос текстом тоже надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 14:36 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Вот и запрос появился. Спасибо Владимиру. Я бы вот так написал Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2008, 14:47 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
Извините за молчание. Хотите знать продолжение? Вставила я INNER JOIN, но как и предполагал Владимир, результат тот же. Даже решила запустить SELECT попроще из командной строки: select * from regi_aa,regi_fb,regi_fd where aa70=fb71 and fb02=fd02 and fb12=1 и select *from regi_fb inner join regi_fd on regi_fb.fb02 = regi_fd.fd02 inner join regi_aa on regi_fb.fb71 = regi_aa.aa70 where regi_fb.fb12=1 Все также зависает. Тогда взяла последнюю работающую копию БД и добавляла в нее по несколько записей из неработающей базы(сохраняя ключи).Каждый раз выполняя вышеприведенный SELECT. И в определенный момент опять запрос завис. Самое странное, что максимум может вернуться 214 записей. Если данному условию из БД удовлетворяет большее количество записей, то ...ждем-с. Или есть где-то, какие-то особые установки, ограничения? Всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2008, 17:59 |
|
Проблемы с памятью в VFP
|
|||
---|---|---|---|
#18+
автор какие-то особые установки, ограничения? Вы проверяли уровень оптимизации запроса? у Вас есть все индексы по тем полям, по которым есть ограничение? у Вас 5.0, для старшей версии при установке set dele on Вам необходимы индексы по условию dele() (для 9-й - бинарные) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2008, 18:07 |
|
|
start [/forum/topic.php?fid=41&msg=35740415&tid=1586908]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 340ms |
total: | 511ms |
0 / 0 |