Страница 1 из 1

AVG в ОГРОМНОЙ базе

Добавлено: 14 июн 2012, 17:30
gert
Некоторое время назад просил помощи с построением индексов в огромной базе (400 Гб и более 3 500 000 000 записей).

Моя работа активно продолжается, но сейчас наткнулся на такой момент: считаю AVG практически для всего объема этих записей и получаю отрицательное значение, когда каждое значение положительное (проверено запросом)! Значения типа NUMERIC(3,2)
Полагаю, что происходит переполнение чего либо... Подскажите есть ли какие ограничения для функции AVG и как их обойти?

Re: AVG в ОГРОМНОЙ базе

Добавлено: 14 июн 2012, 18:53
hvlad
AVG(CAST(xx AS NUMERIC 18.2))

PS IIRC, по стандарту должно быть numeric overflow, а не тихое переполнение...

Re: AVG в ОГРОМНОЙ базе

Добавлено: 15 июн 2012, 16:02
gert
Спасибо большое, запустил, жду!
Конечно странно что не ругнулся, да и вообще, непонятно почему необходимо расширить размерность исходного типа...

Re: AVG в ОГРОМНОЙ базе

Добавлено: 16 июн 2012, 13:31
gert
:(
Запрос:
select avg(cast(prox.prox_val as Numeric(18,2)))
from proximity prox
where prox.prox_val<>1

результат тот же -0,55
P.S. версия СУБД Firebird 2.5

Re: AVG в ОГРОМНОЙ базе

Добавлено: 16 июн 2012, 20:05
hvlad
А где гарантия, то там всё неотрицательное ? Вычисли ещё MIN и MAX

Re: AVG в ОГРОМНОЙ базе

Добавлено: 16 июн 2012, 23:38
dimitr
там знаковый int переполняется при подсчете кол-ва записей, на которое потом делится сумма

Re: AVG в ОГРОМНОЙ базе

Добавлено: 17 июн 2012, 00:42
hvlad
Где же ты раньше был ? :)

Re: AVG в ОГРОМНОЙ базе

Добавлено: 17 июн 2012, 17:33
gert
dimitr писал(а):там знаковый int переполняется при подсчете кол-ва записей, на которое потом делится сумма
gert писал(а):Полагаю, что происходит переполнение чего либо...
Так и думал... integer вроде до 2 147 483 648, попробую разбить на две выборки ...