Помогите советом, плз.

Ильдар
Дата: 06.03.2001 13:50:24
Помогите советом, плз.

есть 3 таблицы:
1. Предприятия (48 000 записей)
FinInstitute(IdFinInstitute int, ... )
2. Категории (26 записей)
FSCategory(IdFSCategory int, ...)
3. Данные предприятий по категориям (1 248 000 000 записей)
на каждое предприятие по 26 записей
FormSix(IdFormSix int, IdFinInstitute int, IdFSCategory int, Val_1 int, ... Val_19 int)

суть проблемы такая:
например запрос (см. ниже) выполняется за ~3 сек.

SELECT
fsc.IdFSCategory,
SUM(fs.Val_1) as Val_1
FROM FormSix fs, FSCategory fsc, FinInstitute fi
WHERE fs.IdFSCategory = fsc.IdFSCategory
AND fs.IdFinInstitute = fi.IdFinInstitute
AND fi.IdFinInstitute < 10000
GROUP BY fsc.IdFSCategory

но если в нем перечислить все поля (Val_1 - Val_19) (см. ниже),
то время выполнения возростает до 14-18 сек.

SELECT
fsc.IdFSCategory,
SUM(fs.Val_1) as Val_1,
SUM(fs.Val_2) as Val_2,
...
...
SUM(fs.Val_19) as Val_19
FROM FormSix fs, FSCategory fsc, FinInstitute fi
WHERE fs.IdFSCategory = fsc.IdFSCategory
AND fs.IdFinInstitute = fi.IdFinInstitute
AND fi.IdFinInstitute < 10000
GROUP BY fsc.IdFSCategory

почему так возрастает время выполнения,
можно ли это бороться?
(т.е. как сократить время выполнения, оптимизировать, ...)

С уважением, Ильдар.
SergSuper
Дата: 06.03.2001 14:08:44
Идет перебор миллионов записей и ничего удивительно что это так медленно работает. Это же надо сложить 25 млн чисел, которые предварительно еще надо сгруппировать. Оптимизировать можно было бы если бы был не тупой перебор, а некие выборки.

Кстати - Вы осознанно включили таблицу FinInstitute?
Что измениться если написать так?

...
FROM FormSix fs, FSCategory fsc
WHERE fs.IdFSCategory = fsc.IdFSCategory
AND fs.IdFinInstitute < 10000
GROUP BY fsc.IdFSCategory
SergSuper
Дата: 06.03.2001 14:13:12
пригляделся еще.
по-моему вы неосознанно пихаете таблицы во FROM

а попробуйте написать так

SELECT
fs.IdFSCategory,
SUM(fs.Val_1) as Val_1,
SUM(fs.Val_2) as Val_2,
...
...
SUM(fs.Val_19) as Val_19
FROM FormSix fs
WHERE fs.IdFinInstitute< 10000
GROUP BY fs.IdFSCategory
Ильдар
Дата: 06.03.2001 14:35:53
Спасибо за ответ.

таблицу FinInstitute нужна.
потомучто на сама деле запрос должен выглядел так,
видимо некорректно сократил:

FROM FormSix fs, FSCategory fsc, FinInstitute fi
WHERE fs.IdFSCategory = fsc.IdFSCategory
AND fs.IdFinInstitute = fi.IdFinInstitute
AND fi.IdRegion = .....

вот таблица FSCategory здесь действительно лишняя, можно записать так

FROM FormSix fs, FinInstitute fi
WHERE fs.IdFinInstitute = fi.IdFinInstitute
AND fi.IdRegion = .....
GROUP BY fs.FSCategory

неужели количество полей влияет сильно влияет на запрос?
VadimB
Дата: 06.03.2001 17:11:47
Если 14-18 секунд много для времени выполнения запроса,
то создай четвертую таблицу,
в которой храняться результаты этого запроса для каждого предпреятия

SumFormSix(IdFormSix int, IdFinInstitute int, IdFSCategory int, SumVal_1 int, ... SumVal_19 int)
всего записей 48 000 - как и в таблице предприятий.

Конешно тоблицу SumFormSix надо поддерживать в актуальном состоянии -
при изменении записей в FormSix менять соответствующие записи в SumFormSix и
создать соответствующие индексы

По таблице SumFormSix твой запррос будет выполняться за доли секунды