kdv писал(а):все не так. если мы рассматриваем цену и наименование как атрибуты товара, то все здесь замечательно вплоть до третьей НФ.
Это понятно, просто я свой частный случай - цена товара всегда с периодом действия -
обобщил до "должно быть так у всех"
To S.H.S
Что тут не то...
Вот я создал простенький тест на FB 1.5.3 -
таблицы Category, Goods и Ваse c примерно похожей структурой.
первичные и внешние ключи (никаких дополнительных индексов)
Залил тестовым генератором IBExpert в Category 100, в Goods - 1000,
в Base - 100000 записей.
В запросах IIF заменил на CASE, ROUND выбросил (особой разницы
не сыграет)
Что получилось - запрос вида
Код: Выделить всё
select b.goods_id,min(g.name),
min(c.category),
SUM(case when (b.beznal=0 AND b1.war_base_id IS NULL) then 1 else 0 end),
SUM(case when (b.beznal=1 AND b1.war_base_id IS NULL) then 1 else 0 end),
min(((g.price-g.price/100*g.discount_pr)/100)*100),
min(g.discount_pr),
min(g.color_sell),
min(g.price),
min(g.warranty),
min(c.category ||' '|| g.name) as fullname,
min(c.category_id)
from base b left join base b1
ON b1.war_base_id=b.base_id
inner join goods g
ON b.goods_id=g.goods_id
inner join category c
ON c.category_id=g.category_id
where b.sell_date IS NULL
AND b.warranty_date IS NULL
AND b.del_date IS NULL
AND b.reserved_id IS NULL
AND g.inprice=1
group by b.goods_id
union all
select g.goods_id,g.name,
c.category,
CAST(0 AS INTEGER),
CAST(0 AS INTEGER),
((g.price-g.price/100*g.discount_pr)/100)*100,
g.discount_pr,
g.color_sell,
g.price,
g.warranty,
c.category ||' '|| g.name as fullname,
c.category_id
from goods g inner join category c
ON c.category_id=g.category_id
LEFT JOIN base b
ON b.goods_id=g.goods_id
AND b.sell_date IS NULL
AND b.warranty_date IS NULL
AND b.del_date IS NULL
AND b.reserved_id IS NULL
where g.inprice=1 and b.goods_id IS NULL
order by 2,3
дает план
Код: Выделить всё
PLAN SORT (JOIN (JOIN (B NATURAL,B1 INDEX (FK_BASE_BASE)),JOIN (G INDEX (PK_GOODS),C INDEX (PK_CATEGORY))))
PLAN JOIN (JOIN (C NATURAL,G INDEX (FK_GOODS_CATEGORY)),B INDEX (FK_BASE_GOODS))
------ Performance info ------
Prepare time = 16ms
Execute time = 1s 344ms
Avg fetch time = 1 344,00 ms
Current memory = 743 484
Max memory = 938 396
Memory buffers = 75
Reads from disk to cache = 34 363
Writes from cache to disk = 0
Fetches from cache = 288 602
Для Вашего последнего запроса получаем план
Код: Выделить всё
PLAN SORT (SORT (JOIN (JOIN (JOIN (C NATURAL,G INDEX (FK_GOODS_CATEGORY)),B INDEX (FK_BASE_GOODS)),B1 INDEX (FK_BASE_BASE))))
------ Performance info ------
Prepare time = 0ms (запрос уже был подготовлен)
Execute time = 52s 390ms
Avg fetch time = 105,84 ms
Current memory = 727 772
Max memory = 938 476
Memory buffers = 75
Reads from disk to cache = 571 725
Writes from cache to disk = 0
Fetches from cache = 49 656 08
Так что еще раз прошу показать планы по обоим запросам и
статистику выполнения