Форум: "Базы";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
ВнизУскориние работы СУБД Найти похожие ветки
← →
Alex Chu (2002-08-19 16:26) [0]Согласен, что вопрос стар, как Мир...
Но не нашел на него ответа на 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 Мб)...
← →
Desdechado (2002-08-19 16:44) [1]подзапросы в ИБ обрабатываются медленнее, да и вообще это не очень эффективный подход - вьюхи создавать. сделай хранимую процедуру, которая будет по условию отбирать и возвращать данные. имхо, быстрее будет.
а еще много зависит от глубины индексов - на это влияет размер страницы БД
← →
Romkin (2002-08-19 17:44) [2]я бы сделал так
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
← →
ShuraGrp (2002-08-19 18:31) [3]Если во вьюхе использовать Sum и т.п., то индексы вообще не используются
← →
evgeg (2002-08-19 19:43) [4]Правильно люди говорят.В IB другое устройство.
View лучше вообще не использовать.
Делать надо все через хранимые процедуры. For select в IB крутой.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c