Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.026 c
3-83959
kanat
2003-05-29 13:15
2003.06.26
Dbase как работать с NTX


9-83849
Карлсон
2003-01-12 18:20
2003.06.26
просто интересно, почему.


1-84380
Andy BitOff
2003-06-09 12:01
2003.06.26
Как выбрать SelectItems


3-84007
Жук
2003-05-30 16:14
2003.06.26
Select из ХП


6-84488
Dinn
2003-04-22 14:49
2003.06.26
Список доступных tnsnames





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский