Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ускориние работы СУБД [D5, IB6.x]


Alex Chu ©   (2002-08-19 16:26:00) 

Согласен, что вопрос стар, как Мир...
Но не нашел на него ответа на ibase.ru
Есть БД на Ib6, которая написана достаточно сносно, но скорость обработки даже простых запросов, сравнительно с sybase, оставляет желать лучшего...
Как ускорить работу (увидеть максимум возможностей) этой субд?
Может, есть какие специфичные настройки иль ешо что?..

пример:
create view RRR (a,b,c) as
select o.ordno, o.ord_price,
(
select sum(w1.wc_value)
from wincalc w1, windows w
where w1.wc_paramid=650
and w.windowid=w1.windowid and w.orderid=o.orderid
) as c
from orders o
where o.ord_payment>=o.ord_price

а запрос select sum(c) from RRR

Так вот этот запрос выполняется около 30 сек при смешном кол-ве записей (объем всей БД около 20 Мб)...


evgeg   (2002-08-19 19:43:00) [1]

Правильно люди говорят.В IB другое устройство.
View лучше вообще не использовать.
Делать надо все через хранимые процедуры. For select в IB крутой.


ShuraGrp   (2002-08-19 18:31:00) [2]

Если во вьюхе использовать Sum и т.п., то индексы вообще не используются


Romkin   (2002-08-19 17:44:00) [3]

я бы сделал так

create procedure RRR (wc_paramid integer)
returns (ordno <тип>, ordprice <тип>, asum <тип>)
as
declare variable TMPSum <тип>;
declare variable windowid integer;
declare variable orderid integer;
begin
for select ordno, ord_price, orderid
from orders o
where o.ord_payment>=o.ord_price
into :ordno, :ord_price, :orderid
do begin
asum = 0;
for select windowid
from windows
where orderid = :orderid
into :windowid
do begin
select sum(wc_value)
from wincalc
where wc_paramid = :wc_paramid
and windowid = :windowid
into :TMPSum;

asum = asum + tmpsum;
end
suspend;
end
end

вызов select * from RRR(:wcParamID), и для каждого запроса подобрать план
можно и так:

create procedure RRR (wc_paramid integer)
returns (ordno <тип>, ordprice <тип>, asum <тип>)
as
declare variable orderid integer;
begin
for select ordno, ord_price, orderid
from orders o
where o.ord_payment>=o.ord_price
into :ordno, :ord_price, :orderid
do begin
select sum(w1.wc_value)
from wincalc w1, windows w
where w1.wc_paramid = :wc_paramid
and w1.windowid = w.windowid and w.orderid=:orderid
into :asum;
suspend;
end
end


Desdechado   (2002-08-19 16:44:00) [4]

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

а еще много зависит от глубины индексов - на это влияет размер страницы БД


Наверх

Титульная страница Поиск, карта сайта Написать письмо