powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите советом, плз.
6 сообщений из 6, страница 1 из 1
Помогите советом, плз.
    #32002798
Ильдар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите советом, плз.

есть 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

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

С уважением, Ильдар.
...
Рейтинг: 0 / 0
Помогите советом, плз.
    #32002799
Ильдар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите советом, плз.

есть 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

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

С уважением, Ильдар.
...
Рейтинг: 0 / 0
Помогите советом, плз.
    #32002801
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идет перебор миллионов записей и ничего удивительно что это так медленно работает. Это же надо сложить 25 млн чисел, которые предварительно еще надо сгруппировать. Оптимизировать можно было бы если бы был не тупой перебор, а некие выборки.

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

...
FROM FormSix fs, FSCategory fsc
WHERE fs.IdFSCategory = fsc.IdFSCategory
AND fs.IdFinInstitute < 10000
GROUP BY fsc.IdFSCategory
...
Рейтинг: 0 / 0
Помогите советом, плз.
    #32002802
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пригляделся еще.
по-моему вы неосознанно пихаете таблицы во 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
...
Рейтинг: 0 / 0
Помогите советом, плз.
    #32002803
Ильдар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ.

таблицу 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

неужели количество полей влияет сильно влияет на запрос?
...
Рейтинг: 0 / 0
Помогите советом, плз.
    #32002811
VadimB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если 14-18 секунд много для времени выполнения запроса,
то создай четвертую таблицу,
в которой храняться результаты этого запроса для каждого предпреятия

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

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

По таблице SumFormSix твой запррос будет выполняться за доли секунды
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите советом, плз.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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