Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.12;
Скачать: CL | DM;

Вниз

Не выполняется запрос   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
14-35440
v2a
2002-07-17 10:38
2002.08.12
MapObjects


4-35498
tretmike
2002-06-05 12:26
2002.08.12
Как удалить окно из панели задач, но оставить его видимым


1-35310
MAN-IN-RED
2002-07-29 15:54
2002.08.12
Как можно сделать полупрозрачное окно?


3-35226
Crazy Joker
2002-07-19 11:29
2002.08.12
Помогите! Форма не отображается пока не выполнится запрос к БД .


3-35149
RDA
2002-07-21 10:27
2002.08.12
Express Quantum TdxDBTreeView