Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация запроса. / 7 сообщений из 7, страница 1 из 1
09.04.2007, 00:33
    #34446120
w2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса.
Дан файл DAN.DBF

Код: plaintext
1.
2.
3.
KOD_OTDEL  N   2   0
POL        C   1
FIO        C   40
DOHOD      N   8   2

со сведениями о годовых доходах сотрудников предприятия с учетом их принадлежности определенным отделам. Составить программу для формирования справки о сотрудниках, доход которых выше среднего по каждому отделу (для мужчин и женщин в отдельности)

Мой неработающий вариант. Помогите доработать и если нетрудно, поясните вкратце:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT FIO, POL, AVG(DOHOD) AS SRED_DOHOD ;
FROM DAN ;
INTO CURSOR curResult;
GROUP BY KOD_OTDEL ;
HAVING DOHOD > SRED_DOHOD; 
ORDER BY POL

SELECT CurResult
SCAN
        ?"FIO ",FIO, POL
ENDSCAN
...
Рейтинг: 0 / 0
09.04.2007, 08:30
    #34446291
Оптимизация запроса.
w2000Дан файл DAN.DBF

Код: plaintext
1.
2.
3.
KOD_OTDEL  N   2   0
POL        C   1
FIO        C   40
DOHOD      N   8   2

со сведениями о годовых доходах сотрудников предприятия с учетом их принадлежности определенным отделам. Составить программу для формирования справки о сотрудниках, доход которых выше среднего по каждому отделу (для мужчин и женщин в отдельности)

Мой неработающий вариант. Помогите доработать и если нетрудно, поясните вкратце:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT FIO, POL, AVG(DOHOD) AS SRED_DOHOD ;
FROM DAN ;
INTO CURSOR curResult;
GROUP BY KOD_OTDEL ;
HAVING DOHOD > SRED_DOHOD; 
ORDER BY POL

SELECT CurResult
SCAN
        ?"FIO ",FIO, POL
ENDSCAN

я бы сделал так (должен работать на 100 %):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT b.kod_otdel, AVG(B.DOHOD) as sred_dohod FROM DAN B;
group by b.KOD.OTDEL ;
into cursor temp1

SELECT A.FIO, A.POL, A.DOHOD AS SUPER_DOHOD ;
FROM DAN A, temp1 b;
INTO CURSOR curResult;
ORDER BY A.POL,A.FIO
WHERE A.DOHOD > B.SRED_DOHOD and A.KOD_OTDEL=b.KOD_OTDEL

SELECT CurResult
SCAN
        ?"FIO ",FIO, POL
ENDSCAN

или так (тоже должен работать, но, скорее всего , медленнее предыдущего варианта):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT A.FIO, A.POL, A.DOHOD AS SUPER_DOHOD ;
FROM DAN A;
INTO CURSOR curResult;
ORDER BY A.POL,A.FIO
WHERE A.DOHOD > (SELECT AVG(B.DOHOD) FROM DAN B;
WHERE A.KOD_OTDEL=b.KOD_OTDEL )

SELECT CurResult
SCAN
        ?"FIO ",FIO, POL
ENDSCAN

или так (только для VFP, должен работать аналогично первому варианту, но надо проверять...):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT A.FIO, A.POL, A.DOHOD AS SUPER_DOHOD ;
FROM DAN A, (SELECT b.kod_otdel, AVG(B.DOHOD) as sred_dohod FROM DAN B;
group by b.KOD_OTDEL ) C;
INTO CURSOR curResult;
ORDER BY A.POL,A.FIO
WHERE A.DOHOD > C.SRED_DOHOD and A.KOD_OTDEL=c.KOD_OTDEL

SELECT CurResult
SCAN
        ?"FIO ",FIO, POL
ENDSCAN
...
Рейтинг: 0 / 0
09.04.2007, 10:42
    #34446600
w2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса.
Станислав С , спасибо огромное!!!
P.S. Почему, по вашему мнению, вариант (2) с вложенным подзапросом будет работать медленнее, нежели вариант (1) ?
...
Рейтинг: 0 / 0
09.04.2007, 11:03
    #34446681
Оптимизация запроса.
w2000 Станислав С , спасибо огромное!!!
P.S. Почему, по вашему мнению, вариант (2) с вложенным подзапросом будет работать медленнее, нежели вариант (1) ?
Причина следующая.
При работе первого варианта будет создана временная таблица (temp1), в которую поместятся результаты промежуточных расчетов среднего значения, а уже затем будут построены связи для отбора необходимых значений (A.KOD_OTDEL=b.KOD_OTDEL).

При работе второго варианта для каждой записи первой таблицы надо будет подсчитать среднее значение, даже если оно уже было посчитано 2-3 записи назад (A.DOHOD > (SELECT AVG(B.DOHOD) FROM DAN B WHERE A.KOD_OTDEL=b.KOD_OTDEL )). В целом это более накладный вариант, хотя могут сработать оптимизаторы, хеши и т.д., ускоряющие работу.

Конечно, если у Вас от 0 до 10 - 100 записей, то заметить замедление, возможно, не удастся.
Но, скажем, на 500 000 записей замедление уже проявится...
...
Рейтинг: 0 / 0
09.04.2007, 12:40
    #34447064
w2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса.
Но с другой стороны-то, временная таблица требует больших затрат памяти, если имеется большое кол-во записей.
...
Рейтинг: 0 / 0
09.04.2007, 13:07
    #34447162
Оптимизация запроса.
w2000Но с другой стороны-то, временная таблица требует больших затрат памяти, если имеется большое кол-во записей.
Во-первых, не настолько больших (количество отделов, по которым производится группировка, является конечным числом) - мы ведь храним только подсчитанные итоги
Во-вторых, повторное вычисление одних и тех же (уже расчитанных ранее) значений более медленное "занятие", чем поиск в готовом массиве/таблице.
...
Рейтинг: 0 / 0
09.04.2007, 17:07
    #34447977
w2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса.
Вопросов больше не имею.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация запроса. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]