Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.26;
Скачать: CL | DM;

Вниз

Оптимизация работы программы   Найти похожие ветки 

 
McSimm2   (2003-06-04 08:16) [0]

Есть программа работа которой предусматривает последовательное формирование большого количества однотиптых отчётов. На формирование каждого тратится около минуты. Костяк запроса выглядит так:

select sum(k.kolich) as Sum_Kolich,
sum(k.kolich1) as Sum_Kolich1,
sum(k.kolich2) as Sum_Kolich2
from ivcdba.table1 k, ivcdba.table1 d
where ((d.field1 = k.field1(+)) and
(d.field2 = k.field2(+)) and
(d.field3 = k.field3(+)) and
(d.field4 = k.field4(+))) %s

Чтобы сформировать отчёт к этому запросу в параметр %s передаётся ещё одно условие, например

and d.pole5 = 1

Для формирования второго отчёта, который начинает формироваться сразу же после выполнения предыдущего к "костяку" присоединится
уже, например

and d.poleN = NN


Вопрос такой: собственно говоря - сабж.
Может есть смысл залить всё это безобразие в динамический массив и уже по нему тогда бегать, вычисляя нужные суммы?


 
needle ©   (2003-06-04 08:23) [1]

сам ответ и написал - записать в динамический массив. однако надо помнить что память не резиновая, и если все это будет кешироваться на диск, то спорный вопрос, выигрешь ли ты по времени


 
Наталия ©   (2003-06-04 08:59) [2]

А зачем такой усложнённый запрос, если данные из одной таблицы берутся?
>from ivcdba.table1 k, ivcdba.table1 d


 
McSimm2   (2003-06-04 09:08) [3]

> To Наталия © (04.06.03 08:59)

select sum(k.kolich) as Sum_Kolich, ...
^^^
... and d.pole5 = 1
^^^


 
Alex_***   (2003-06-04 09:14) [4]

Один раз залить в TClientDataSet и делай с ним что хочешь


 
Наталия ©   (2003-06-04 09:16) [5]

Так k и d у тебя одна и та же таблица.


 
ЮЮ ©   (2003-06-04 09:18) [6]

>А зачем такой усложнённый запрос, если данные из одной таблицы берутся?

Зато при перемножении таблицы записей будет больше, причем далеко не те, что ожидали :-) Если он уберёт SUM и посмотрит на то, что суммирует - удивится



 
ЮЮ ©   (2003-06-04 09:22) [7]

McSimm2 (04.06.03 09:08)
>... and d.pole5 = 1
Если есть хотя бы одна запись с d.pole5 = 1, то просуммируются все записи k для конкретного field1,field2,field3,field4



 
McSimm2   (2003-06-04 09:22) [8]

>> To Alex_***

TClientDataSet работает с одним полем а не с DataSet.
К тому же IMHO в 5 Delphi eё не наблюдается

PS
(я пишу в 5 а не в 7, как указал.Просто привык писать в 7, а тут вот Qreport понадобился и пришлось 5 ставить...)


 
McSimm2   (2003-06-04 09:25) [9]

>> To ЮЮ

>>... and d.pole5 = 1
>Если есть хотя бы одна запись с d.pole5 = 1, то просуммируются >все записи k для конкретного field1,field2,field3,field4

И что ? в этом задача и стоит.


 
McSimm2   (2003-06-04 09:26) [10]

To Наталия

просто очепятка: естественно

from table1 k, table2 d


 
McSimm2   (2003-06-04 09:29) [11]

В виду того,что сделал как советовал
>> needle © (04.06.03 08:23)
тему объявляю закрытой


 
ЮЮ ©   (2003-06-04 09:30) [12]

Хорошая задача. Для зав.складом, наверное:"как, имея в таблице только 10 записей, получить в отчете 100" :-)


 
McSimm2   (2003-06-04 09:41) [13]

>> ЮЮ
Да, если имеется две таблицы в первой 10, а во второй 100 - то действительно "очень сложно" получить 100.
Читай внимательнее... Выяснили, что таблицы 2 !!!


 
Alex_***   (2003-06-04 09:44) [14]

>> TO McSimm2

Это как это TClientDataSet c одним полем работает? Это нормальная виртуальная табличка, наследуется из TDataSet. И в D5 лежит на закладке midas. Для работы правда нужна midas.dll.
P.S. Я с ним и в D5 и в D6 работал - без проблем. Dynamic array шустрее немного, конечно, но не так универсально.


 
McSimm2   (2003-06-04 09:48) [15]

To >> Alex_*** (04.06.03 09:44)
Я с этой штукой не работал просто - не знаю.
Я загнал всё в массив 180.000 записей заливает долго, зато потом быстро работает.

Если конечно потом в файл можно было бы сохранить массив и в будущем открывать его а не базу, то было бы вообще круто, но это мечты .... :)))


 
Sergey13 ©   (2003-06-04 09:53) [16]

2McSimm2 (04.06.03 09:48)
Если (судя по синтаксису) это Оракл, то может подумать о материализованых представлениях? ИМХО, имеет смысл.


 
McSimm2   (2003-06-04 09:56) [17]

To Sergey13 © (04.06.03 09:53)
Это действительно Oracle.
"материализованых представлениях" что эт такое в 2 словах.


 
Alex_***   (2003-06-04 10:11) [18]

>> McSimm2
TCustomClientDataSet.SaveToFile(...);
можно указать один из нескольких форматов (ХML, binary,...)
Фильтровать и сортировать можно опять же ))


 
Sergey13 ©   (2003-06-04 10:13) [19]

В 2 словах это обычная вьюха, но результыты селекта хранятся как обычная таблица и обновляется она либо по событию в таблицах исходниках либо по расписанию. Сам я их не юзал, но то что читал про них вроде тебе подойдет. Например в них удобно хранить результаты расчетов.


 
Alex_***   (2003-06-04 10:26) [20]

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


 
roottim   (2003-06-04 10:35) [21]

оптимизировать имхо можно только используя индексы..
и просмсматривать планы запросов... prepare запрсоа тоже непомешает, если конечно возможно использование параметров
Насчет пересчетов на клиенте.. мнебы такая идея ненравилась.. когда есть мощный серер.. зачем сор в избу тащить... если все оптимизировано скорости должно хватать

про материализованные представления.. незнаю каким местом они к отчетам прикручиваются... обычно их исползуют для просмотра динамики изменений неких данных с таблиц...
создаются просто create snapshot bla as select ...

к слову.. а Qreport вроде есть в D7.. тока спрятан...
я его не вынимал... так-как предпочитаю FR


 
Sandman25 ©   (2003-06-04 10:39) [22]

Рассмотрите возможность извлечения
select d.pole5,
sum(k.kolich) as Sum_Kolich,
sum(k.kolich1) as Sum_Kolich1,
sum(k.kolich2) as Sum_Kolich2
from ivcdba.table1 k, ivcdba.table1 d
where ((d.field1 = k.field1(+)) and
(d.field2 = k.field2(+)) and
(d.field3 = k.field3(+)) and
(d.field4 = k.field4(+)))
group by d.pole5
order by d.pole5

Если нужно выполнить запрос по (почти) всем возможным d.pole5, то это может работать быстрее.


 
bushmen ©   (2003-06-04 10:39) [23]

> roottim FR ???


 
Sergey13 ©   (2003-06-04 10:52) [24]

2roottim (04.06.03 10:35)
>незнаю каким местом они к отчетам прикручиваются...

На http://www.oracle.com/ru/oramag/ как то (давненько) попалась мне статья "Использование материализованных представлений для ускорения запросов". Там утверждалось обратное. Я не говорю что это истина в последней инстанции, но откидывать идею я бы не стал.


 
roottim   (2003-06-04 10:55) [25]

2bushmen © (04.06.03 10:39)
FR -> FastReport http://www.fast-report.com/rus

2Sandman25 © (04.06.03 10:39)
согласен поностью...
даже если и не по всем возможным...
допустим по 5, 7, 8

select
d.pole5,
sum(m.kolich) as Sum_Kolich,
sum(m.kolich1) as Sum_Kolich1,
sum(m.kolich2) as Sum_Kolich2
from
(
select nuna_polja.
from ivcdba.table1 k, ivcdba.table1 d
where ((d.field1 = k.field1(+)) and
(d.field2 = k.field2(+)) and
(d.field3 = k.field3(+)) and
(d.field4 = k.field4(+))) and
d.pole5 in (5, 7, 8)
) m
group by d.pole5


 
roottim   (2003-06-04 11:00) [26]

исправляю очепятки.. но думаю не для тупых и так все понятно

select
m.pole5,
sum(m.kolich) as Sum_Kolich,
sum(m.kolich1) as Sum_Kolich1,
sum(m.kolich2) as Sum_Kolich2
from
(
select nuna_polja...
from ivcdba.table1 k, ivcdba.table1 d
where ((d.field1 = k.field1(+)) and
(d.field2 = k.field2(+)) and
(d.field3 = k.field3(+)) and
(d.field4 = k.field4(+))) and
d.pole5 in (5, 7, 8)
) m
group by m.pole5


 
Sandman25 ©   (2003-06-04 11:20) [27]

На Informix я бы создал временную таблицу
create temp tmp_pole5 (pole5 int) with no log;
записал в нее значения
insert into tmp_pole5 values(5);
insert into tmp_pole5 values(7);
insert into tmp_pole5 values(8);
А потом использовал
select d.pole5,
sum(k.kolich),
sum(k.kolich1),
sum(k.kolich2)
from ivcdba.table1 k, ivcdba.table1 d, tmp_pole5 t
where ((d.field1 = k.field1(+)) and
(d.field2 = k.field2(+)) and
(d.field3 = k.field3(+)) and
(d.field4 = k.field4(+))) and
(t.pole5 = d.pole5)
group by d.pole5


 
roottim   (2003-06-04 11:29) [28]

сам пишу и сам удивляюсь... зачем
select
d.pole5,
sum(k.kolich) as Sum_Kolich,
sum(k.kolich1) as Sum_Kolich1,
sum(k.kolich2) as Sum_Kolich2
from ivcdba.table1 k, ivcdba.table1 d
where ((d.field1 = k.field1(+)) and
(d.field2 = k.field2(+)) and
(d.field3 = k.field3(+)) and
(d.field4 = k.field4(+))) and
d.pole5 in (5, 7, 8)
group by d.pole5


 
Danilka ©   (2003-06-04 11:31) [29]

если такой ламерский запрос, возвращающий всего одну запись так долго отрабатывает, то либо записей сумируется во время группировки огромное количество, либо (что более вероятно) проблемы с индексами, вернее с их использованием. надо анализировать план.


 
Saraf   (2003-06-04 14:07) [30]

Ещё вариант
Используй связку TQuery --> TDataSetProvider --> TClientDataSet
в TQuery

select * from table1

в TClientDataSet
1. добавляешь все поля
2. создаешь поля Sum1, Sum2 ... SumN типа TAggregateField
3. свойство AggregatesActive := True
4. cоздаешь индексы по суммируемым полям
5. в индексах заполняешь поле GroupingLevel i := 1 to N
в TAggregateField
1. IndexName := <имя созданного индекса>
2. Active := True
3. Expression := Sum(<имя поля>)
4. GroupingLevel := i

Для получения нужной суммы устанавливаешь соответствующий индекс




 
Danilka ©   (2003-06-04 14:18) [31]

Saraf (04.06.03 14:07)
Все это - от лукавого.
Зачем делать то, для чего предназначен сервер? А он с этими задачами справляется моментом, если все правильно написать.


 
интересующийся   (2003-06-04 14:39) [32]

McSimm2 зря закрыл тему.
Sandman25 и roottim дело пишут.



 
интересующийся   (2003-06-04 14:40) [33]

а вообще вопрос не такой и
интересный...



Страницы: 1 вся ветка

Текущий архив: 2003.06.26;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.031 c
4-84818
saha
2003-04-22 13:00
2003.06.26
Активное окно


1-84335
Spartak
2003-06-16 07:46
2003.06.26
Сохранение масива в файл и загрузка из файла


14-84520
Soft
2003-06-06 13:09
2003.06.26
Вы готовы осознать Будущее?


1-84082
АлеКо
2003-06-06 08:55
2003.06.26
Как правильно закрыть Excel


14-84588
Igor__
2003-06-08 12:19
2003.06.26
Стеганография