Нарастающий итог

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Mikle Klementiev
Сообщения: 3
Зарегистрирован: 04 фев 2005, 11:18

Нарастающий итог

Сообщение Mikle Klementiev » 04 фев 2005, 11:28

Вопрос по оптимизации

Есть табличка. Для простоты - одно поле ( VALUE), Integer
Задача - посчитать нарастающий итог
то есть, результат запроса должен выглядеть следующим образом:

Value narast_itog
+1 1
+3 4
+5 9
-3 6
-2 4

и т.д.

В реальности в таблице много полей и условие выборки задается по разным полям с разными условиями. По этому никогда заранее не известно значение WHERE ..... в операторе SELECT - как следствие -
приходится его формировать динамически, в программе ( Delphi 7.0).

Вопрос - как добиться максимального быстродействия? Желательно без создания временных рабочих таблиц.

Slava Ekimov
Сообщения: 44
Зарегистрирован: 26 окт 2004, 14:30

Re: Нарастающий итог

Сообщение Slava Ekimov » 07 фев 2005, 09:12

Mikle Klementiev писал(а):Вопрос по оптимизации

Вопрос - как добиться максимального быстродействия? Желательно без создания временных рабочих таблиц.
Процедурой

Mikle Klementiev
Сообщения: 3
Зарегистрирован: 04 фев 2005, 11:18

Re: Нарастающий итог

Сообщение Mikle Klementiev » 09 фев 2005, 11:46

Slava Ekimov писал(а):
Mikle Klementiev писал(а):Вопрос по оптимизации

Вопрос - как добиться максимального быстродействия? Желательно без создания временных рабочих таблиц.
Процедурой

Процедура подразумевает, что оператор SELECT уже написан.
В моем случае, условия выборки каждый раз разные ( по разным полям, с разными условиями) То-есть заранее неизвестно, что писать в WHERE...

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Re: Нарастающий итог

Сообщение Лысый » 09 фев 2005, 12:14

>Mikle Klementiev
Какая версия сервера?
Ни как народ не хочет научиться оформлять вопросы...

Mikle Klementiev
Сообщения: 3
Зарегистрирован: 04 фев 2005, 11:18

Re: Нарастающий итог

Сообщение Mikle Klementiev » 10 фев 2005, 15:40

Лысый писал(а):>Mikle Klementiev
Какая версия сервера?
Ни как народ не хочет научиться оформлять вопросы...
IB server v7.5

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 фев 2005, 16:14

как добиться быстродействия в беге голышом, одетым, в шубе, и с гирей 10кг на ноге? Быстродействие определяется запросом, его планом, наличием нужных индексов и своевремнностью сбора по ним статистики. Кроме того, быстродействие еще определяется знанием SQL, и ... это опустим.

Так вот - встречный вопрос: какой запрос и какой у него план? и насколько "динамичен" where?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Нарастающий итог

Сообщение Merlin » 10 фев 2005, 16:18

Mikle Klementiev писал(а):Вопрос по оптимизации

Есть табличка. Для простоты - одно поле ( VALUE), Integer
Задача - посчитать нарастающий итог
то есть, результат запроса должен выглядеть следующим образом:

Value narast_itog
+1 1
+3 4
+5 9
-3 6
-2 4

и т.д.

В реальности в таблице много полей и условие выборки задается по разным полям с разными условиями. По этому никогда заранее не известно значение WHERE ..... в операторе SELECT - как следствие -
приходится его формировать динамически, в программе ( Delphi 7.0).

Вопрос - как добиться максимального быстродействия? Желательно без создания временных рабочих таблиц.
С временными таблицами замучаешь сервер. И запросами с суммированием предыстории каждого шага - тоже. Если природа запроса такова, что нарастающий итог не зависит от предыстории, оставшейся за его рамками, и возвращаемый резалтсет не слишком большой, то можно на клиенте забирать его целиком во что-нибудь типа TClientDataSet и AfterOpen пробегаться по нему с накоплением суммы и Edit - Post. Если же это что-то типа складской карточки и нарастающий итог - это остаток после каждой операции, то лучше хранить его прямо в базе, поддерживая на триггерах. Или, если вернуться к решению на стороне клиента, то сначала одним запросом получить остаток на то, что не попало в запрос, но является предысторией для него, и учесть как стартовые условия для суммирования на AfterOpen. Иначе - только через ХП. В IB нет execute stament, как в FB, который хорош как раз для таких задач аналитического плана, когда потерями на перекомпиляцию динамически формируемого или передаваемого параметром с клиента запроса внутри ХП можно пренебречь. Но если диапазон изменения where не слишком всебъемлюш, можно раскрутиться на этажерке if-ов, хоть это и проктология в общем случае.

Ответить