Форум: "Базы";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
ВнизНе выполняется запрос Найти похожие ветки
← →
AlexA (2002-07-19 15:46) [0]Имеются три таблицы
Workers (сотрудники)
Tn - integer (табельный номер) /индекс/
FIO - CHAR ( .. ) ФИО
Pol - char(1) Пол
Date_rogden - Data дата рождения /индекс/
Dopz_All (зарплата по месяцам)
Tn - integer (табельный номер) /индекс/
mes_vidach - smallint (месяц выдачи) /индекс/
VO smallint - вид оплаты /индекс/
Summa numeric(15,3) сумма
Spz Char (5) счет
z_kod_otch (настройки по видам оплат)
VO smallint - вид оплаты /индекс/
pen smallint - 0 или 1 идут ли отчисления в песионый фонд
Пишу такой запрос.
Запрос содержит два вложенных.
1 вложенный ищет сотрудников с указаным полом и возростом.
2 вложенный ищет сотрудников у которых в пятом месяце сумму начислений облагеемой пенсионом фондом (Z.pen=1) больше 30000
И наконец основной запрос ищет сумму начислений облагеемой пенсионом фондом (Zа.pen=1) для найденных сотрудников
select Sum(summa) from dopz_All Da, z_kod_otch Za
where Da.Tn in ( select Tn from dopz_All D, z_kod_otch Z
where D.Tn in (
select tn from workers W
where (W.pol="М" and W.Date_rogden<"01.01.1953") or (W.pol="Ж" and W.Date_rogden<"01.01.1957")
)
and Z.pen=1 and D.Vo=Z.vo and D.Spz is not null and D.mes_vidach<6
group by tn
having sum(summa)-30000>0
)
and Za.pen=1 and Da.Vo=Za.vo and Da.Spz is not null and Da.mes_vidach=6
PLAN (W INDEX (WORKERS_TN,WORKERS_DATE_ROGDEN,WORKERS_DATE_ROGDEN))
PLAN SORT (JOIN (Z INDEX (Z_KOD_OTCH_PEN),D INDEX (DOPZ_ALL_VO,DOPZ_ALL_MES_VIDACH)))
PLAN JOIN (ZA INDEX (Z_KOD_OTCH_PEN),DA INDEX (DOPZ_ALL_VO,DOPZ_ALL_MES_VIDACH))
SUM
================
<null>
Этот запрос выполняется быстро. Видимо всвязи с тем что нет данных в шестом месяце (Da.mes_vidach=6).
//////////////
Сдвигаю дату на один месяц
Выполняю часть предыдущего вопроса
select Tn from dopz_All D, z_kod_otch Z
where D.Tn in (
select tn from workers W
where (W.pol="М" and W.Date_rogden<"01.01.1953") or (W.pol="Ж" and W.Date_rogden<"01.01.1957")
)
and Z.pen=1 and D.Vo=Z.vo and D.Spz is not null and D.mes_vidach<5
group by tn
having sum(summa)-20000>0
PLAN (W INDEX (WORKERS_TN,WORKERS_DATE_ROGDEN,WORKERS_DATE_ROGDEN))
PLAN SORT (JOIN (Z INDEX (Z_KOD_OTCH_PEN),D INDEX (DOPZ_ALL_VO,DOPZ_ALL_MES_VIDACH)))
TN
======
12
28
260
304
Elapsed time= 12.79 sec
Этот запрос выполяется уже подольше.
/////////
Выполняю запрос с полученными данными
select Sum(Da.summa) from dopz_All Da, z_kod_otch Za
where Da.Tn in ( 12,28,260,304
)
and Za.pen=1 and Da.Vo=Za.vo and Da.Spz is not null and Da.mes_vidach=6
PLAN JOIN (ZA INDEX (Z_KOD_OTCH_PEN),DA INDEX (DOPZ_ALL_VO,DOPZ_ALL_MES_VIDACH,DOPZ_ALL_TN,DOPZ_ALL_TN,DOPZ_ALL_TN,DOPZ_ALL_TN))
SUM
======================
25556.910
Elapsed time= 0.95 sec
Все отлично
////////
Пишу запрос полностью.
select Sum(Da.summa) from dopz_All Da, z_kod_otch Za
where Da.Tn in ( select D.Tn from dopz_All D, z_kod_otch Z
where D.Tn in (
select W.tn from workers W
where (W.pol="М" and W.Date_rogden<"01.01.1953") or (W.pol="Ж" and W.Date_rogden<"01.01.1957")
)
and Z.pen=1 and D.Vo=Z.vo and D.Spz is not null and D.mes_vidach<5
group by tn
having sum(summa)-20000>0
)
and Za.pen=1 and Da.Vo=Za.vo and Da.Spz is not null and Da.mes_vidach=5
и все приплыли. IBServer занимает ресурсы ЦП. Запрос не выполняется. К серверу можно подключаться из других программ - работают нормально
Прошло около 1,5 часа. Сообщение connection lost to database
IBServer освободил ЦП.
Что делать. Посоветуйте плиз.
Извините за размер вопроса
← →
-=Sergeante=- (2002-07-19 17:08) [1]Как всегда: если поля не индексированы - проиндексируй.
На мой взгляд, подход неправильный.
Попробуй вместо
select D.Tn from dopz_All D, z_kod_otch Z
where D.Tn in (
select W.tn from workers W
where (W.pol="М" and W.Date_rogden<"01.01.1953") or (W.pol="Ж" and W.Date_rogden<"01.01.1957")
)
and Z.pen=1 and D.Vo=Z.vo and D.Spz is not null and D.mes_vidach<5
group by tn
having sum(summa)-20000>0
вот это...
select D.Tn, W.tn from dopz_All D, z_kod_otch Z, workers W
where
D.Tn=W.tn and ((W.pol="М" and W.Date_rogden<"01.01.1953") or (W.pol="Ж" and W.Date_rogden<"01.01.1957"))
and Z.pen=1 and D.Vo=Z.vo and D.Spz is not null and D.mes_vidach<5
group by tn
having sum(summa)-20000>0
← →
-=Sergeante=- (2002-07-19 17:11) [2]А... Тогда у тя группировка работать не будит, кажись. Если не работает, то сорри.
Но много все же вложенных запросов.
← →
Desdechado (2002-07-19 17:18) [3]PLAN SORT - очень плохо
а вообще подзапросы старайся не использовать, особенно каскадом. получается, что для каждой строки главного подзапроса вып-ся подзапрос 2 уровня, а для каждой строки 2 уровня - подзапрос 3 уровня. а теперь посчитай сколько же их всего.
← →
Шамиль (2002-07-24 14:31) [4]В FOX-е я бы сделал так:
select D.Tn , sum(D.SUMMA) as ITOG
from dopz_All D, z_kod_otch Z
where D.Tn in (
select tn from workers W
where (W.pol="М" and W.Date_rogden<"01.01.1953")
or (W.pol="Ж" and W.Date_rogden<"01.01.1957")
)
and Z.pen=1 and D.Vo=Z.vo and D.Spz is not null and D.mes_vidach<5
group by tn
having ITOG-20000>0
а после командой sum ITOG получил бы общий итог.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c