Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Прошу помощи с JOIN  [new]
Rom1
Member

Откуда:
Сообщений: 33
Всё решил с помощью временной таблицы, в неё отгружаю (update or insert) записи из USAGEN -> GOODSID, sum(AMOUNT) as SUMN
В результате получаю время выполнения 2 минуты, против 40-60 встроенными селектами.

Ну так как таблица временная, то во время запуска процедуры она будет очищаться, потом заполняться (как описал выше), а это даст хреновую статистику по апдейтам. Что с этим делать, пока не знаю.
14 окт 21, 10:50    [22383510]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 1119
Rom1,

Как 2 минуты? У Вас миллионы (десятки, сотни) записей?
14 окт 21, 14:20    [22383659]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 1128
KreatorXXI
Rom1,

Как 2 минуты? У Вас миллионы (десятки, сотни) записей?


Дык. Таблицу-то временную ещё ж залить надо. Я бы сделал селективную процедуру с тремя запросами раз уж очень хочется одним клиентским запросом и не парился.
14 окт 21, 14:29    [22383672]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 1119
Старый плюшевый мишка,

у ТС запрос выполняется 40-60 минут. Что там?
14 окт 21, 15:14    [22383711]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 1128
KreatorXXI
Старый плюшевый мишка,

у ТС запрос выполняется 40-60 минут. Что там?


Хрень какая-то, а какая сказать трудно, он толком ничего не говорит, а что говорит, говорит с ашипками. Но три иннера по-любому уделают этажерку с юнионами. Если с индексами всё боле-мене ;)
14 окт 21, 16:04    [22383754]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Rom1
Member

Откуда:
Сообщений: 33
KreatorXXI
Как 2 минуты? У Вас миллионы (десятки, сотни) записей?

USAGEN, это не плоские таблицы, там несколько выборок с агрегацией и кучей джойнов, около 3 млн записей на всё.
15 окт 21, 07:35    [22384040]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1460
Rom1
Всё решил с помощью временной таблицы, в неё отгружаю (update or insert) записи из USAGEN -> GOODSID, sum(AMOUNT) as SUMN
В результате получаю время выполнения 2 минуты, против 40-60 встроенными селектами.

Ну так как таблица временная, то во время запуска процедуры она будет очищаться, потом заполняться (как описал выше), а это даст хреновую статистику по апдейтам. Что с этим делать, пока не знаю.

Зачем update or insert, почему-бы не обойтись только insert?
Зачем очищать таблицу во время запуска процедуры? (ну разве что в одной транзакции несколько раз будешь её запускать, да и то можно без очистки обойтись)
15 окт 21, 09:26    [22384066]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Rom1
Member

Откуда:
Сообщений: 33
m7m
Зачем update or insert, почему-бы не обойтись только insert?
Зачем очищать таблицу во время запуска процедуры? (ну разве что в одной транзакции несколько раз будешь её запускать, да и то можно без очистки обойтись)

Так товар может и не присутствовать в USAGE1, там в SUM1 будет 0. А допустим будет только в USAGE3, там в SUM3 будет будет некая сумма всех значений этого товара в выборке.
15 окт 21, 12:39    [22384182]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Rom1
Member

Откуда:
Сообщений: 33
Наверное не так ответил на ваш вопрос. Перефразирую - во временной таблице через (uppdate or insert) я получаю всего одну запись, в которой будут заполнены все SUMN по GOODSID, а может и не все, но всё равно это будет всего одна запись. А если использовать только инсерты, то я получу по каждому GOODSID от 0 до N SUM's и всё это придется еще агрегировать.
15 окт 21, 12:44    [22384186]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Rom1
Member

Откуда:
Сообщений: 33
Еще добавлю. Очистка производится один раз, для получения сводных данных по товару, это срез данных на текущий момент, в следующий раз эти данные будут уже не актуальны и всё придется делать с чистого листа. Поэтому это и временная таблица, только для формирования остатков по всем USAGEN
15 окт 21, 12:59    [22384194]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54772

Почему бы не формировать остатки в реальном времени? Тогда запрос будет
выполняться за доли секунды.

Posted via ActualForum NNTP Server 1.5

15 окт 21, 13:11    [22384202]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Rom1
Member

Откуда:
Сообщений: 33
Dimitry Sibiryakov

Почему бы не формировать остатки в реальном времени? Тогда запрос будет
выполняться за доли секунды.

В реальном времени можно это делать по одной единице товара, да и это займет времени совсем чуть, можно даже кешировать результат. Однако мне нужен срез по пулу товаров, и тут всё работало, но не устраивало время выполнения этой операции, потому что перебиралась "руками" каждая единица товара из пула. Это просто вопрос оптимизации.
15 окт 21, 13:20    [22384205]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54772

Эта оптимизация уже давно называется "OLAP" и делается без особых проблем как
руками, так и готовыми инструментами. Ничто же не мешает строить куб по твоему
"пулу"...

Posted via ActualForum NNTP Server 1.5

15 окт 21, 13:24    [22384208]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 1119
В любом случае 3 млн записей за 2 минуты (не говоря о 40-60) - это непозволительно много. Надо оптимизировать или пересматривать запросы совсем. Было бы 3 млрд, можно было бы и о кубах подумать.
15 окт 21, 17:48    [22384297]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 1128
Rom1
Dimitry Sibiryakov

Почему бы не формировать остатки в реальном времени? Тогда запрос будет
выполняться за доли секунды.

В реальном времени можно это делать по одной единице товара, да и это займет времени совсем чуть, можно даже кешировать результат. Однако мне нужен срез по пулу товаров, и тут всё работало, но не устраивало время выполнения этой операции, потому что перебиралась "руками" каждая единица товара из пула. Это просто вопрос оптимизации.



Мнэээ... Этот срез нужен с точностью до миллисекунды? Помнится, была у меня в обиходе табличка для стратегической и тактической аналитики. Ну там ABC, теория управляемого накопителя, бюджетирование и всё такое. По трём линиям поставки - Европа, Азия и остальной мир, с комплектационными складами на линиях, товарах на них, в пути между ними, в пути от поставщиков, в принятых к исполнению поставщиками заказах, в отправленных поставщикам на утверждение (даты они ещё могли поменять), доходностями, наличием денег в определённых банках, прогнозами их прибытия на основе статистики прошлых лет и тенденций момента, первой и второй производными приходов и расходов и прогнозами состояния запасов в перечисленных стадиях на месяц, два... полгода, ещё чего-то, не помню уже, короче к сотне полей. На фоне сотни тыщ позиций номенклатуры. Пересчитывалась инсёртами с датой (чтобы можно было сравнить свои представления с любым временным интервалом) по ночам часа за три. На серваке сборки 2004 года и FB 1.5. Ну кого в течение дня мнэээ... колыхало, что за день картина ушла на полпроцента? На крайняк для отражения кардинальных судьбоносных изменений по группе товаров был предусмотрен оперативный пересчёт по именно ней. Кеширование, ля...

Ещё вопрос имею, чиста для самообразования. Чем временная таблица в срочно-оперативной схеме интересней возврата агрегированных данных в параметрах процедуры, которая их наагрегировала, не беспокоя диск?

Сообщение было отредактировано: 15 окт 21, 17:45
15 окт 21, 17:56    [22384304]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 1128
KreatorXXI
В любом случае 3 млн записей за 2 минуты (не говоря о 40-60) - это непозволительно много. Надо оптимизировать или пересматривать запросы совсем. Было бы 3 млрд, можно было бы и о кубах подумать.


9 млн за 40 секунд в 2004 году.
15 окт 21, 17:58    [22384307]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1460
Rom1
m7m
Зачем update or insert, почему-бы не обойтись только insert?
Зачем очищать таблицу во время запуска процедуры? (ну разве что в одной транзакции несколько раз будешь её запускать, да и то можно без очистки обойтись)

Так товар может и не присутствовать в USAGE1, там в SUM1 будет 0. А допустим будет только в USAGE3, там в SUM3 будет будет некая сумма всех значений этого товара в выборке.

Rom1
Наверное не так ответил на ваш вопрос. Перефразирую - во временной таблице через (uppdate or insert) я получаю всего одну запись, в которой будут заполнены все SUMN по GOODSID, а может и не все, но всё равно это будет всего одна запись. А если использовать только инсерты, то я получу по каждому GOODSID от 0 до N SUM's и всё это придется еще агрегировать.

Ну так и суммируй их, возможно это лучше чем апдейтить и может быть даже гораздо лучше
Rom1
Еще добавлю. Очистка производится один раз, для получения сводных данных по товару, это срез данных на текущий момент, в следующий раз эти данные будут уже не актуальны и всё придется делать с чистого листа. Поэтому это и временная таблица, только для формирования остатков по всем USAGEN
Зачем временную таблицу чистить
16 окт 21, 08:49    [22384480]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
Rom1
Member

Откуда:
Сообщений: 33
Задача решена, выполняется быстро. Однако во время перевода в продакт, занимались чисткой лишних индексов и был удален обязательный индекс по GOODSID, во временной таблице. После этого время выполнения снова подскочило до ~1 часа.

Отсюда я могу предположить, что вариант, как с временной таблицей, так и с вложенными запросами - одинаково производительны. НО! При вложенном запросах, видимо, необходимо грамотно составлять план, чтобы построились временные индексы. Но я в планах не силён, от слова совсем, поэтому мой вариант - временная таблица.

Пишу это потому, что некоторые участники заинтересовались почему может быть такая разница в производительности.
1 ноя 21, 08:51    [22390856]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с JOIN  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 1119
Rom1
При вложенном запросах, видимо, необходимо грамотно составлять план, чтобы построились временные индексы. Но я в планах не силён, от слова совсем, поэтому мой вариант - временная таблица.

Какие такие временные индексы? А планами занимается встроенный планировщик. В Вашем примере достаточно всё просто. Придумали себе проблему.
1 ноя 21, 10:06    [22390876]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Firebird, InterBase Ответить