powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Срочно нужно получить результаты "большого запроса" запроса
8 сообщений из 8, страница 1 из 1
Срочно нужно получить результаты "большого запроса" запроса
    #38083608
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток. Нужен срочный хелп.
такой запрос
Код: sql
1.
2.
SELECT a.schet,a.filter_uch,a.id,MAX(a.sum) as sum,MAX(a.opl) as opl,SUM(NVL(b.sum, 0)) as temp,000000.00 as dolg;
FROM zzzzz3 a LEFT OUTER JOIN zzzzz3 b ON b.id<a.id group by a.id,a.schet,a.filter_uch into CURSOR  zzzzz4


Запрос "нормальный" те на тестовых данных все впоряде, но на реальной базе пишет что слишком большой темп файл.


Что можно сделать.машина на которой выполняется 2Га ОЗУ, винт вообще терабайтник,NTFS
Что б сдесь можно было сделать-неважно пусть час выполняется запрос -нужен результат
...
Рейтинг: 0 / 0
Срочно нужно получить результаты "большого запроса" запроса
    #38083709
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) Неудачный алиас столбца - "Temp"
2) Сомнительная связка таблицы саму с собой. Как результат - декартово произведение.
По моему - полная хрень.
...
Рейтинг: 0 / 0
Срочно нужно получить результаты "большого запроса" запроса
    #38083718
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помню от куда взял на вооружение... эта хрень есть нарастающий итог на небольших исходнных нормально работает.
Может есть другие варианты?
...
Рейтинг: 0 / 0
Срочно нужно получить результаты "большого запроса" запроса
    #38083779
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rock-n-roll... эта хрень есть нарастающий итог...Что ты имеешь ввиду под "нарастающий итогом"? Если можно, поподробнее, а то есть разные варианты.
...
Рейтинг: 0 / 0
Срочно нужно получить результаты "большого запроса" запроса
    #38083814
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, то, что Вы вышли за пределы системных ограничений FoxPro не удивительно. Напомню, что FoxPro ограничивается размером таблицы в 2ГБ или количеством записей в 1 миллиард (1 и 9 нулей). Смотря что раньше кончится. У Вас декартово произведение. Т.е. надо возвести в квадрат количество записей исходной таблицы. Вот и смотрите, какой размер и количество записей получилось.

А решение очевидное. Отказаться от Select-SQL и перейти к сканированию

Код: sql
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.
* Предварительная выборка решает несколько задач
* Формирует итоговый курсор нужной структуры
* и упорядочивает записи таким образом, чтобы записи одной группы 
* оказались рядом и в нужной последовательности (order by)
select 
        a.schet, ;
        a.filter_uch, ;
        a.id, ;
        a.sum, ;
        a.opl, ;
        a.sum - a.sum as temp, ;
        000000.00 as dolg ;
from zzzzz3  ;
into cursor zzzzz4 readwrite ;
order by 1,2,3

local lvSchetPrev, lvFilter_uchPrev, lvIdPrev, lnSumGroup
* Даю переменным пустые значения, заведомо не существующие в таблице, но нужного типа
* это необходимо для корректного входа в цикл
lvSchetPrev = ''
lvFilter_uchPrev = ''
lvIdPrev = 0

* Собственно расчет нарастающего итога
* Для первой строки группы нарастающий итог остается равным нулю
select zzzzz4
go top
scan
    if m.lvSchetPrev <> zzzzz4.Schet OR m.lvFilter_uchPrev <> zzzzz4.Filter_uch OR m.lvIdPrev <> zzzzz4.Id
        m.lvSchetPrev = zzzzz4.Schet 
        m.lvFilter_uchPrev = zzzzz4.Filter_uch 
        m.lvIdPrev = zzzzz4.Id
        m.lnSumGroup = zzzzz4.Sum
    else
        replace temp with m.lnSumGroup
        m.lnSumGroup = m.lnSumGroup + zzzzz4.Sum
    endif
endscan
...
Рейтинг: 0 / 0
Срочно нужно получить результаты "большого запроса" запроса
    #38083823
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не "нарастающий итог" в общем случае. Посмотрите на выборку
Код: sql
1.
2.
3.
SELECT a.id as a_id, b.id as b_id, NVL(b.sum,0) as temp;
 FROM zzzzz3 a LEFT OUTER JOIN zzzzz3 b ON b.id<a.id;
 INTO CURSOR zzzzz4a

и поймёте, что, при наличии нескольких записей с одинаковым Id - LEFT JOIN повторит предыдущие Id столько раз, сколько у вас записей с текущим Id... Кроме того, нарастающий итог , ИМХО, имеет смысл только при наличии упорядоченных записей, а что такое Id - неизвестно, и в каком порядке нужно наращивать итог - непонятно.

Проще для получения нарастающего итога не делать один селект, а сделать выборку и пройтись по ней SCANом.
...
Рейтинг: 0 / 0
Срочно нужно получить результаты "большого запроса" запроса
    #38083826
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс... (я так понимаю, мысли сходятся...)
...
Рейтинг: 0 / 0
Срочно нужно получить результаты "большого запроса" запроса
    #38083876
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу спс спс спс
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Срочно нужно получить результаты "большого запроса" запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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