Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизОптимизация работы программы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.029 c