![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация работы программы [D7]
McSimm2 © (2003-06-04 08:16:00)Есть программа работа которой предусматривает последовательное формирование большого количества однотиптых отчётов. На формирование каждого тратится около минуты. Костяк запроса выглядит так:
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
Вопрос такой: собственно говоря - сабж.
Может есть смысл залить всё это безобразие в динамический массив и уже по нему тогда бегать, вычисляя нужные суммы?
интересующийся (2003-06-04 14:40:00) [1]а вообще вопрос не такой и
интересный...
интересующийся (2003-06-04 14:39:00) [2]McSimm2 зря закрыл тему.
Sandman25 и roottim дело пишут.
Danilka (2003-06-04 14:18:00) [3]Saraf (04.06.03 14:07)
Все это - от лукавого.
Зачем делать то, для чего предназначен сервер? А он с этими задачами справляется моментом, если все правильно написать.
Saraf (2003-06-04 14:07:00) [4]Ещё вариант
Используй связку 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 11:31:00) [5]если такой ламерский запрос, возвращающий всего одну запись так долго отрабатывает, то либо записей сумируется во время группировки огромное количество, либо (что более вероятно) проблемы с индексами, вернее с их использованием. надо анализировать план.
roottim (2003-06-04 11:29:00) [6]сам пишу и сам удивляюсь... зачем
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
Sandman25 (2003-06-04 11:20:00) [7]На 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:00:00) [8]исправляю очепятки.. но думаю не для тупых и так все понятно
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
roottim (2003-06-04 10:55:00) [9]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
Sergey13 (2003-06-04 10:52:00) [10]2roottim (04.06.03 10:35)
>незнаю каким местом они к отчетам прикручиваются...
На http://www.oracle.com/ru/oramag/как то (давненько) попалась мне статья "Использование материализованных представлений для ускорения запросов". Там утверждалось обратное. Я не говорю что это истина в последней инстанции, но откидывать идею я бы не стал.
bushmen (2003-06-04 10:39:00) [11]> roottim FR ???
Sandman25 (2003-06-04 10:39:00) [12]Рассмотрите возможность извлечения
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, то это может работать быстрее.
roottim (2003-06-04 10:35:00) [13]оптимизировать имхо можно только используя индексы..
и просмсматривать планы запросов... prepare запрсоа тоже непомешает, если конечно возможно использование параметров
Насчет пересчетов на клиенте.. мнебы такая идея ненравилась.. когда есть мощный серер.. зачем сор в избу тащить... если все оптимизировано скорости должно хватать
про материализованные представления.. незнаю каким местом они к отчетам прикручиваются... обычно их исползуют для просмотра динамики изменений неких данных с таблиц...
создаются просто create snapshot bla as select ...
к слову.. а Qreport вроде есть в D7.. тока спрятан...
я его не вынимал... так-как предпочитаю FR
Alex_*** (2003-06-04 10:26:00) [14]я так понимаю здесь проблема не просчитать, а фетчить записи каждый раз с сервака... как-то в локале лучше хранить наверно...
Sergey13 (2003-06-04 10:13:00) [15]В 2 словах это обычная вьюха, но результыты селекта хранятся как обычная таблица и обновляется она либо по событию в таблицах исходниках либо по расписанию. Сам я их не юзал, но то что читал про них вроде тебе подойдет. Например в них удобно хранить результаты расчетов.
Alex_*** (2003-06-04 10:11:00) [16]>> McSimm2
TCustomClientDataSet.SaveToFile(...);
можно указать один из нескольких форматов (ХML, binary,...)
Фильтровать и сортировать можно опять же ))
McSimm2 (2003-06-04 09:56:00) [17]To Sergey13 © (04.06.03 09:53)
Это действительно Oracle.
"материализованых представлениях" что эт такое в 2 словах.
Sergey13 (2003-06-04 09:53:00) [18]2McSimm2 (04.06.03 09:48)
Если (судя по синтаксису) это Оракл, то может подумать о материализованых представлениях? ИМХО, имеет смысл.
McSimm2 (2003-06-04 09:48:00) [19]To >> Alex_*** (04.06.03 09:44)
Я с этой штукой не работал просто - не знаю.
Я загнал всё в массив 180.000 записей заливает долго, зато потом быстро работает.
Если конечно потом в файл можно было бы сохранить массив и в будущем открывать его а не базу, то было бы вообще круто, но это мечты .... :)))
Alex_*** (2003-06-04 09:44:00) [20]>> TO McSimm2
Это как это TClientDataSet c одним полем работает? Это нормальная виртуальная табличка, наследуется из TDataSet. И в D5 лежит на закладке midas. Для работы правда нужна midas.dll.
P.S. Я с ним и в D5 и в D6 работал - без проблем. Dynamic array шустрее немного, конечно, но не так универсально.