powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблемы с памятью в VFP
25 сообщений из 28, страница 1 из 2
Проблемы с памятью в VFP
    #35732790
_Tania_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подобная проблема обсуждалась. У меня следующий случай. База из 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 также проблемы не решило.
Помогите, пожалуйста. Что это может быть?
Заранее спасибо.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35732875
VictorSK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А размер DBF случайне не 2 Гб?
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35732944
Ffffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не пользуйтесь джойнами с большими объемами, особенно Left Join.
Подзапросы позволяют сэкономить память и время.

Иногда такое бывает, если в таблице, из которой идет связь один-ко-многим поле для связи не уникально.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35733252
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, повреждены индексы. В подобной ситуации FoxPro не ругается, но перестает их использовать, что и может привести к прямому сканированию таблиц. Попробуйте переиндексировать базу.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35734364
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то есть подозрение, что идет декартово произведение всех таблиц.

Запрос в студию!


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35734941
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov Rinat
Что-то есть подозрение, что идет декартово произведение всех таблиц.

Запрос в студию!




Поддерживаю + настройка set delete на момент выполнения запроса + все индексы на таблицы.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35735545
_Tania_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за предложения. Ничего не помогло, вот отчет о проделанной работе:
DBF 11-12 Мб.
Join в SELECTe нет.
Переиндексацию делала раньше несколько раз, даже создавала новые таблицы с новыми CDX.
Сейчас проверяла и чистила таблицы, все ключевые поля были уникальны.
На момент выполнения запроса SET DELETE ON
"Виснущий" запрос и индексы в прилагаемом файле.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35735571
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Tania_Join в SELECTe нет.
Надо поставить inner join вместо запятых.

Запрос текстом просили и не кучу скриншотов в вордовском файлике. Не получится самой джоины вставить - выкладывай запрос текстом, примерно так:
Код: plaintext
select ...
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35735606
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какого типа поля aa70, fb02, fb12 ?

Для ускорения нужен индекс по fb12.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35735762
_Tania_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aa70,fb02 - integer
fb12 -numeric(1). Индексация по этому полю ничего не меняет.
Запрос текстом не получится, слишком много подстановок из разных объектов.Пришлось бы все PRG выкладывать. А в скриншоте уже конкретная подстановка видна.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35735782
_Tania_aa70,fb02 - integer
fb12 -numeric(1). Индексация по этому полю ничего не меняет.
Запрос текстом не получится, слишком много подстановок из разных объектов.Пришлось бы все PRG выкладывать. А в скриншоте уже конкретная подстановка видна.
И Вы нам предлагаете распознать скриншот? Или чисто медитативно глядя на запрос определять причины его зависания? Или просто не умеете запрос уже с подстановками скопировать?
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35735801
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Tania_Запрос текстом не получится, слишком много подстановок из разных объектов.
Несколько вариантов как поместить его текстом в буфер обмена:
1. Вместо Alt+PrintScreen нажать Ctrl+C
2. Переменная _cliptext - это буфер обмена
Код: plaintext
1.
2.
3.
lcQuery = 'select ...'
....
_cliptext = lcQuery
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35736307
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой мля... Какой запрос страшный.

Беглым взглядом на скриншот могу сообщить следующее:

Есть завязка таблиц (назовем их для простоты 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
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35736482
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov RinatОй мля... Какой запрос страшный.
Это наследие FPD. Стиль селекта чисто FPD-шный, а названия полей и таблиц еще из более раннего прошлого. Сопровождал когда-то прогу написанную в середине 80-х, таблицы назывались A001, A002, B001 и т.д. Аналогичный подход к именам полей. Похоже были такие правила именования, т.к. видел другие проги тех же времен, стиль именования похожий.

А селект с нуля писать не обязательно, надо лишнее из WHERE в JOINы перенести. Дело пятиминутное, если текстом его сюда выложить. Если топикстартеру влом это делать, то за нее никто этим не будет заниматься.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35736507
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Dima T
> Galyamov Rinat
> Ой мля... Какой запрос страшный.
>
> Это наследие FPD.

Да страшный он не в именовании полей/таблиц/стиле, а в полной безграмотности
и непонимании.
ОСНОВНЫЕ МОМЕНТЫ Я ОПИСАЛ


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35736596
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov RinatДа страшный он не в именовании полей/таблиц/стиле, а в полной безграмотности
и непонимании.

Нормальный запрос из связки трех таблиц, ничего криминального не вижу. Распознать нечем, а то я бы поправил.
надо только FPD-шный синтаксис
Код: plaintext
select ... from a, b, c where a.f1 = b.f2 and b.f3 = c.f4 and ... and ( ... and ... or ...)
заменить на нормальный
Код: plaintext
select ... from a inner join b on a.f1 = b.f2 inner join c on b.f3 = c.f4 where ... and ( ... and ... or ...)

Еще бы порядок JOINов немного поменять, но это только с текстом запроса можно показать.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35736649
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> 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
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35736945
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov RinatСпециально пересмотрел запрос.
Ну нету там вот этого:
where a.f1 = b.f2 and b.f3 = c.f4

И скобок (... or ...) нету. Есть просто ... and ...and ... and...OR ...

Как нет? Еще раз смотри. После третьего AND открывается скобка и закрывается перед INTO.
OR внутри скобок.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35737094
Fffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А автора вес нет. Может, у нее вообще запрос не такой.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35737112
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--



С уважением, Галямов Ринат Сагирович,
заместитель начальника отдела по автоматизации производства
отдела информационных технологий МУП "Томский энергокомплекс"
тел. (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
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35737174
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
select
	aa01,
	fd08,
	fd08,
	fd12,
	fd12,
	fd13,
	fd13,
	fd13,
	fd14,
	fd18,
	fd18,
	fd19,
	fd20,
	fd23,
	fd24,
	fd24,
	fd70
from 
	regi_aa, 
	regi_fd, 
	regi_fb
where 	
	regi_aa.aa70 = refi_fb.fd71
	and regi_fb.fb02 = regi_fd.fd02
	and regi_fb.fb02 =  47298 
	and 
	(
		inlist(regi_fb.fb12, 5 , 6 , 7 ) and regi_fd.fd70 = FirstSup(fb02) 
		or 
		inlist(regi_fb.fb12, 1 , 9 )
	)
into cursor sqlresult

Ну, для начала, одинаковых имен таблиц-источников нет. Имена все-таки отличаются. В последней букве.

Менять запрос на INNER JOIN практического смысла нет. С точки зрения выполнения запроса результат будет один и тот же. Просто другой синтаксис. Но не думаю, что план выполнения запроса будет отличаться. К сожалению в FoxPro реальный план выполнения посмотреть невозможно, но в MS SQL дело обстоит именно так.

Ну, и "для порядка" желательно предварять имена полей в директиве Select. Также желательно явно указывать имена полей в результирующей выборке, если поля-источники одинаковые

Код: plaintext
1.
2.
3.
4.
5.
select
	regi_aa.aa01,
	regi_fd.fd08 as fd08_1,
	regi_fd.fd08 as fd08_2,
...

На работу запроса это никак не повлияет, но добавит определенности и наглядности в код.

=========

В данно случае, сомнения вызывает пользовательская функция FirstSup(). Можно привести ее код?

=========

Какие индексы реально используются можно посмотреть при помощи функции SYS(3054)

Код: plaintext
1.
2.
3.
=SYS( 3054 , 11 )
select ...
=SYS( 3054 , 0 )
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35737201
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov RinatРазглядел :)

Но from a,b,b все равно полный гон :)
У тебя чего со зрением сегодня? Там написано
from regi_aa, regi_f d , regi_f b

т.е. from a,b,d

Galyamov RinatНу ладно. автора в студию, а там посмотрим что с ним делать (это я про
запрос :) )
Согласен. И запрос текстом тоже надо.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35737231
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и запрос появился. Спасибо Владимиру.

Я бы вот так написал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select ...
from 
	regi_fb inner join regi_fd on regi_fb.fb02 = regi_fd.fd02
		inner join regi_aa on regi_fb.fd71 = regi_aa.aa70
where 	
	regi_fb.fb02 =  47298 
	and 
	(
		inlist(regi_fb.fb12, 1 , 9 )
		or 
		inlist(regi_fb.fb12, 5 , 6 , 7 ) and regi_fd.fd70 = FirstSup(fb02) 
	)
into cursor sqlresult
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35740390
_Tania_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините за молчание. Хотите знать продолжение?
Вставила я 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 записей. Если данному условию из БД удовлетворяет большее количество записей, то ...ждем-с.
Или есть где-то, какие-то особые установки, ограничения?
Всем спасибо.
...
Рейтинг: 0 / 0
Проблемы с памятью в VFP
    #35740415
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор какие-то особые установки, ограничения?

Вы проверяли уровень оптимизации запроса?
у Вас есть все индексы по тем полям, по которым есть ограничение?

у Вас 5.0, для старшей версии
при установке set dele on
Вам необходимы индексы по условию dele()
(для 9-й - бинарные)
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблемы с памятью в VFP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]