Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 Оптимизация базы...  [new]
KiLLun
Member

Откуда:
Сообщений: 2788
База данных представляет собой конструктор организации различного рода хранилищ данных с последующим выводом в отчеты.
На данный момент на ней вертится более 10 задач одновременно, весит около 300 МБ, средства разработки Delphi 4 и IB 5.6(Dialect 1). Отчет по республики после репликации со всех областей строится 20 минут. Есть ли какие-нибудь способы ускорить работу с базой.

Мои варианты:
- хранить базы по областям отдельно;
- перевод базы на Dialect 3;
- хранить отдельно базы по годам;
- оптимизация запросов и ХП предназначенных для построения отчетов;
- писать новую базу (скорее всего не дадут по времени).

Можете ли подсказать в каком направлении двигаться...

Спасибо за то что дочитали до сюда...
12 дек 03, 15:51    [458229]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
Gt.
Guest
слово отчет мало что нам скажет .. можно ли выделить конкретные процедуры, запросы, планы и т.п. которые создают наибольшие задержки ?

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

что с деньгами/хардваре .. оцени сколько время/ресурсов уйдет на переписывание чего либо, может все же дешевле поставить n процесоров с n гб памяти.
12 дек 03, 16:09    [458247]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
S.G.
Member

Откуда: cartoon network
Сообщений: 30611
С одной стороны, по закону Мура (Moore) мощность компьютеров
нарастает вдвое каждые 2-2,5 года. Т.е если система уже работает
года 3, самое время поменять хардвер и получить быстро работающий
отчет.
С другой стороны, по закону подлости, написание софтвера отнимает
время в два раза больше, чем было планировано. Т.е опять же
довод в пользу той первой стороны.

Вроде даже научно получилось ;)

p.s. Да, хранить базы отдельно по годам не стОит, имхо.
Кому-то сразу захочется иметь отчет, включающий
данные из разных лет

p.p.s. Но можно сделать автоматизацию, которая делает
длинные отчеты ночью, если технология допускает такое.
12 дек 03, 19:37    [458412]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
Да, очень бы не помешало краткое описание действий, которые делаются в отчете. Ну и железо, которое сейчас используется. Для InterBase 300 мегов при нынешнем железе это фигня.

-- Tygra's --
15 дек 03, 10:43    [459393]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
KiLLun
Member

Откуда:
Сообщений: 2788
Железо:
3 пень 1 Ггц, 1 Гб памяти.

В базе 3154243 записи на сегодняшний день.
Было дело данные за одну область заливались 5-6 часов.
Самый сложный отчет использует вот такую ХП:

CREATE PROCEDURE REPORT_REPUBLIC(
SQLI INTEGER,
N INTEGER,
CURDATE1 CHAR(10),
CURDATE2 CHAR(10))
RETURNS (
DATA0 VARCHAR(250),
DATA1 INTEGER,
DATA2 INTEGER,
DATA3 INTEGER,
DATA4 INTEGER,
DATA5 INTEGER,
DATA6 DOUBLE PRECISION,
DATA7 DOUBLE PRECISION,
DATA8 DOUBLE PRECISION,
DATA9 DOUBLE PRECISION,
DATA10 INTEGER,
DATA11 INTEGER,
DATA12 INTEGER,
DATA13 INTEGER,
DATA14 INTEGER,
DATA15 INTEGER,
DATA16 INTEGER,
DATA17 INTEGER,
DATA18 INTEGER,
DATA19 INTEGER,
DATA20 INTEGER,
DATA21 INTEGER,
DATA22 INTEGER,
DATA23 INTEGER,
DATA24 INTEGER,
DATA25 DOUBLE PRECISION,
DATA26 INTEGER,
DATA27 INTEGER,
DATA28 INTEGER,
DATA29 INTEGER,
DATA30 DOUBLE PRECISION,
DATA31 INTEGER,
DATA32 INTEGER,
DATA33 INTEGER)
AS
DECLARE VARIABLE INDLIST INTEGER;
DECLARE VARIABLE O_IND INTEGER;
DECLARE VARIABLE TMP DATE;
DECLARE VARIABLE TMP_VAL INTEGER;
DECLARE VARIABLE SQLI1 SMALLINT;
DECLARE VARIABLE O_TIND SMALLINT;
DECLARE VARIABLE DAT1 DATE;
DECLARE VARIABLE DAT2 DATE;
DECLARE VARIABLE Y1 INTEGER;
DECLARE VARIABLE Y2 INTEGER;
DECLARE VARIABLE D1 INTEGER;
DECLARE VARIABLE M1 INTEGER;
DECLARE VARIABLE D2 INTEGER;
DECLARE VARIABLE M2 INTEGER;
begin
data0='';
select ListInd from Params where ind=:SQLI into:sqlI1;
EXECUTE PROCEDURE Year1(:CURDATE1)RETURNING_VALUES Y1;
EXECUTE PROCEDURE Year1(:CURDATE2)RETURNING_VALUES Y2;
EXECUTE PROCEDURE month1(:CURDATE1)RETURNING_VALUES M1;
EXECUTE PROCEDURE month1(:CURDATE2)RETURNING_VALUES M2;
EXECUTE PROCEDURE day1(:CURDATE1)RETURNING_VALUES D1;
EXECUTE PROCEDURE day1(:CURDATE2)RETURNING_VALUES D2;
if (Y1<>Y2) then exit; Dat1=D1 || "." || M1 || "." || Y1; Dat2=D2 || "." || M2 || "." || Y2;
for select ind, val from Lists where ParamInd=:sqlI1
order by val /*order by ind*/ /*ored by val*/
into :IndList,:DATA0
do begin
data1=0;data2=0;data3=0;data4=0;data5=0;data6=0;data7=0;data8=0;data9=0;
data10=0;data11=0;data12=0;data13=0;data14=0;data15=0;data16=0;data17=0;data18=0;data19=0;
data20=0;data21=0;data22=0;data23=0;data24=0;data25=0;data26=0;data27=0;
data28=0;data29=0;data30=0;data31=0;data32=0;data33=0;
for select ObjectInd from Pvalues where ind=566 and val>1000000000 and val<8000000000 into :o_Ind
do begin tmp_val=0;
select ListInd from pvalues where ind=236
and ObjectInd=:o_Ind into :tmp_val;
if ((tmp_val=110) or (tmp_val=10) or ((tmp_val!<40) and (tmp_val!>60))) then begin
select YES From isparent(:o_ind,:N) into :o_tind;
if (o_tind =1) then begin
select cast(val as date) from pvalues where ind=492 and objectInd=:o_Ind into :tmp;
if ((:tmp!<:dat1) and (:tmp!>:dat2)) then begin
select ListInd from pvalues where ind=:SQLI and ObjectInd=:o_Ind into :tmp_val;
if (:tmp_val=:Indlist) then begin
data1=:data1+1; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,270) into :tmp_val;
data2=data2+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,271) into :tmp_val;
data3=data3+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,439) into :tmp_val;
data4=data4+tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,440) into :tmp_val;
data5=data5+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,280) into :tmp_val;
data6=data6+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,443) into :tmp_val;
data7=data7+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,444) into :tmp_val;
data8=data8+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,445) into :tmp_val;
data9=data9+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,273) into :tmp_val;
data10=data10+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,272) into :tmp_val;
data11=data11+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,278) into :tmp_val;
data12=data12+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,446) into :tmp_val;
data13=data13+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,279) into :tmp_val;
data14=data14+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,275) into :tmp_val;
data15=data15+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,277) into :tmp_val;
data16=data16+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,448) into :tmp_val;
data17=data17+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,276) into :tmp_val;
data18=data18+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,274) into :tmp_val;
data19=data19+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,281) into :tmp_val;
data20=data20+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,284) into :tmp_val;
data21=data21+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,289) into :tmp_val;
data22=data22+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,288) into :tmp_val;
data23=data23+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,285) into :tmp_val;
data24=data24+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,291) into :tmp_val;
data25=data25+:tmp_val; tmp_val=0;
select ListInd from pvalues where ind=449 and
ObjectInd=:o_Ind into :tmp_val;
if (tmp_val=1) then begin Data26=data26+1; end
if (tmp_val=3) then begin Data27=data27+1; end
if (tmp_val=2) then begin Data28=data28+1; end
select Val1 from get_param_caption(:o_Ind,451) into :tmp_val;
data29=data29+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,455) into :tmp_val;
data30=data30+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,452) into :tmp_val;
data31=data31+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,453) into :tmp_val;
data32=data32+:tmp_val; tmp_val=0;
select Val1 from get_param_caption(:o_Ind,454) into :tmp_val;
data33=data33+:tmp_val; tmp_val=0;
end /* */
end
end
end
end
suspend;
end
end


CREATE PROCEDURE GET_PARAM_CAPTION(
OBJIND INTEGER,
PARIND INTEGER)
RETURNS (
VAL1 VARCHAR(250))
AS
declare variable LISTIND1 SMALLINT;
declare variable LIST1 SMALLINT;
declare variable PARTYPE INTEGER;
begin
Val1 = "";
SELECT ParamType,ListInd FROM Params WHERE Ind=:parInd INTO :parType, :List1;
SELECT Val, ListInd FROM PValues WHERE (Ind=:ParInd) and (ObjectInd=:ObjInd) INTO :val1, :ListInd1;

IF (((:parType=1) or (:parType=2)) and (:Val1="
")) THEN Val1="0";

IF ((:parType=7) and (not (:ListInd1 is null))) THEN
SELECT Val FROM LISTS WHERE (ind=:listInd1) AND (ParamInd=:List1) INTO :Val1;

suspend;
end

15 дек 03, 18:10    [460303]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
Markelenkov
Member

Откуда:
Сообщений: 2312
Чёй-то не понял, здесь ведь вроде СУБД сравнивают?
15 дек 03, 18:43    [460365]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
Gt.
Guest
мда .. у меня десктоп помощнее будет, небойсь без SCSI, обычная память ... вложите туда хотя бы 3 килобакса будет 10-20 раз быстрее
15 дек 03, 18:56    [460385]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
Ну железо уже можно и помощнее, но три лимона записей всего - это немного. Может чего с индексами? Процедура конечно офигенная, но надо ее просмотреть на те места, где все тяжко, и их прооптимизировать.

-- Tygra's --
16 дек 03, 12:05    [461100]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
DimaR
Member

Откуда:
Сообщений: 1570
Ну железо уже можно и помощнее, но три лимона записей всего - это немного. Может чего с индексами? Процедура конечно офигенная, но надо ее просмотреть на те места, где все тяжко, и их прооптимизировать.

Я когдато делал задачу на IB5.6
Все было хорошо , просто замечательно,
пока не стал писать запросы аналитики, о процедурах даже речи небыло,
просто хитрые запросы, Interbase умирал.

Ничего не помогало, при том что данных было мало, структура простая.
16 дек 03, 13:35    [461388]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
alex_k
Member

Откуда: krasnoyarsk
Сообщений: 6694
о процедурах даже речи небыло,
и напрасно.
и о процедурах нужно речь вести и о планах запросов
16 дек 03, 13:38    [461400]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Я думаю DimaR наоборот имел ввиду, что процедуры даже не использовались, причем не напрасно, а вполне осознанно, так как тормозили со страшной дурью в IB 5.6 . Причем я полностью с ним согласен - действительно IB 5-х версий начинал умирать, как только запрос должен был возвратить чего то более менее сложное. Надежность хранения данных тоже оставляла желать лучшего. Сейчас говорят в новом IB, который здорово шагнул по сравнению с 5-ым, все поправили, но вот неприятный осадок на душе и недоверие к данной СУБД осталось.
16 дек 03, 14:05    [461529]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
alex_k
Member

Откуда: krasnoyarsk
Сообщений: 6694
я с 5.х не работал, но на 4.2 нормально процедуры у меня работали. и данных было мало и структура простая :-)

процедуры я использовал там, где не мог селектом производительности добиться. кстати, и сейчас иногда прибегаю к такому методу, где совесть позволяет.
16 дек 03, 14:12    [461550]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
f_w_p
Guest
Присоединюсь к alex_k. Неудача с пятыми версиями в свое время чуть не погубила этот продукт. А 4.2 вполне работал. Советую попробовать FireBird 1.5. Для начала просто без всяких переделок. Потом поиграть с индексами и планами запросов.
16 дек 03, 14:21    [461589]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
KiLLun
Member

Откуда:
Сообщений: 2788
to All...
Так чем лучше заняться (см. первый пост)???
Может на старший сервер перевести???
16 дек 03, 15:33    [461820]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
KiLLun
Member

Откуда:
Сообщений: 2788
FB 1.5 работает с первым диалектом??? (удаленно понятно, а локально).
16 дек 03, 15:42    [461853]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
DimaR
Member

Откуда:
Сообщений: 1570
Я в свое время решил сравнить,
тупо делфишной DataPump скопировал базу на
Oracle 8.0.5, создал такие же индексы,
все залетало, т.е. отклики на те же запросы были мгновенные, на гораздо более медленном железе, в то время как IB мог обрабатывать запросы до 20 мин.
16 дек 03, 15:42    [461855]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
В любом случае перенос на другой, вышестоящий сервер в линейке, даст выигрыш. Как говорится, кесарю - кесарево и никуда тут не попрешь. По крайней мере на MS SQL такое количество данных будет летать

-- Tygra's --
16 дек 03, 15:48    [461872]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Посмотри графики обращений к таблицам в эксперте. Скорее всего где-то есть много неиндексированных чтений. Ну и добейся чтоб они были индексированными.
16 дек 03, 19:21    [462326]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
StarWind
Member

Откуда: г. Иркутск
Сообщений: 1875
железо конечно можно заменить.... но я бы порекомендовал заменить версию... причем до семерки (FB мне не понравился всеж) Если будешь менять железо, то ставь двухпроцовый. Гипертрейдинг толку не дает. Да, на двухпроцовом из IB работает только начиная с 7.0 и с дополнительной лицензией. Ощутимое достоинство -- хорошее распаралеливание ресурсов под разные запросы.
а по твоим вариантам....

"- хранить базы по областям отдельно" много гемороя очень много... но при желании можно что-то улучшить (знаю на опыте)

"- перевод базы на Dialect 3" толку нет, простой перевод в смысле

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

"- оптимизация запросов и ХП предназначенных для построения отчетов" хороший вариант может дать ускорение от 0 и до.... вчера видел оптимезацию запроса... ускорился в 1000 (тысячу) раз

"- писать новую базу (скорее всего не дадут по времени)" кардинальный вариант... может и ускорить и замедлить, но время, которое будет затрачено на разработку...
17 дек 03, 03:21    [462509]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация базы...  [new]
KiLLun
Member

Откуда:
Сообщений: 2788
Всем огромное спасибо за мнения, советы и реккомендации...
17 дек 03, 15:08    [463601]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить