
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
28.11.2007, 01:02
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Дано таблица, в которой будут часто делаться запросы на получение остатка на дату, вида select summ(balance) from table where date < :beginDate group by userAccount; Возникает мысль, с увеличением числа строк в таблице будут медленнее выполняться запросы. -) Вопрос позновательный, как бытовую проблему можно решить на различных СУБД? Заодно можно и тестики поделать, различных решений. ) з.ы. Сам пользую postreSQL и задал вопрос в соотв. топике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.11.2007, 01:55
|
|||
|---|---|---|---|
|
|||
быстрое получение остатков на дату |
|||
|
#18+
в оракле для такой задачи есть materialized view, которое будет хранить агрегты (например на день) и подсовывать оптимизатору это вью вместо оригинальной таблички. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.11.2007, 10:02
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Думаю эта задача во всех СУБД решается с помощью триггера и еще одной таблицы. В случае Оракла - триггер и таблица системные, что несомненно красивее. ------------------------------------------------------- Автор благодарит алфавит за любезно предоставленные ему буквы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.11.2007, 10:27
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
В MS SQL задача решается с помощью построения indexed view. Оптимизатор сможет использовать это представление и без переписывания оригинального запроса на использование представления в нем вместо базовой таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.11.2007, 11:31
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Завести себе фиксированные остатки. Тогда с ростом таблицы скорость запроса не будет расти выше определенного уровня. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.11.2007, 13:07
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
DobPilotВозникает мысль, с увеличением числа строк в таблице будут медленнее выполняться запросы. -)... Для этих целей, как Вам правильно подсказали выше - используется подход DataWarehouse... Good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 10:23
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Крутая у вас таблица получится.... Кол-во номенклатур * Кол-во дат.... = ? Со временем таблица еще больше получится.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 10:55
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Не зависит от СУБД. В тупых учетных системах - только движения и начальный+текущий остаток. В чуть более продвинутых (1С) - снимок остатка на каждый отчетный период (обычно месяц) + движения между. В хранилищах данных - как правило, на каждый день. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 11:04
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
мне кажется это вопрос больше в тему "Проектирование БД" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 11:20
|
|||
|---|---|---|---|
|
|||
быстрое получение остатков на дату |
|||
|
#18+
TORTКрутая у вас таблица получится.... Кол-во номенклатур * Кол-во дат.... = ? Со временем таблица еще больше получится....Ну если по большей части номенклатур остатки меняются относительно редко, то и не надо по ним остатки на каждую дату хранить. Добавлять записи, только при изменении остатка. Табличка будет не больше, чем таблица движений, а остатки безо всякого суммирования будут получаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 12:19
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Если остатки меняются редко, то и записей о движении будет немного, а следовательно и select sum(...) будет работать недолго....ИМХО... Зачем огород городить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 12:35
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
TORTЕсли остатки меняются редко, то и записей о движении будет немного, а следовательно и select sum(...) будет работать недолго....ИМХО... Зачем огород городить?затем чтобы не суммировать все данные, а взять одну нужную ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:02
|
|||
|---|---|---|---|
|
|||
быстрое получение остатков на дату |
|||
|
#18+
TORTЕсли остатки меняются редко, то и записей о движении будет немного, а следовательно и select sum(...) будет работать недолго....ИМХО... Зачем огород городить? Типичная структура движений такова: из 10-20 тысноменклатурных единиц по 95 процентам движения происходят пару раз в месяц. Процентам по 4 - раз в два-три дня, а по оставшимся - несколько раз в день. Соответственно для 95 процентов вполне можно и суммировать (за год накопится 20-30 записей), но вот по этому проценту (а именно по нему остатки нужны наиболее часто) суммировть потребуется уже довольно много. Соответственно имея записи об остатках на моменты движений мы не раздуваем существенно таблицу остатков, но зато время получения остатка не зависит от активности номенклатуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:07
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Если я правильно понял, то Вам придется хранить остатки товара на каждый день, в независимости от того было по нему движение в этот день или нет... Соответственно и таблица у вас будет размером Кол-во товаров * Кол_во дней = Много. А иначе Вам придется все равно по движению суммировать данные... КМК, нет смысла делать такую таблицу... Поправьте меня, если я заблуждаюсь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:10
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Быть может я не правильно понимаю уровень группировки(день, месяц, год) данных? Но по-поему это не играет никакой роли... Либо Вы храните остатки по всем! товарам на каждый день!...Либо СУБД проще и быстрее будет делать select sum(...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:30
|
|||
|---|---|---|---|
|
|||
быстрое получение остатков на дату |
|||
|
#18+
TORTПоправьте меня, если я заблуждаюсь...Поправляю. Имеем таблицу Код: plaintext 1. 2. 3. 4. Таким образом число записей не превышает количества движений, а остаток на любой день достается запросом без суммирования: Код: plaintext Я не говорю, что это единственное верное решение, но в некоторых случаях оно работает очень хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:43
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Я не совсем понимаю зачем Начало и Конец... Поясните, если не трудно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:57
|
|||
|---|---|---|---|
|
|||
быстрое получение остатков на дату |
|||
|
#18+
TORTЯ не совсем понимаю зачем Начало и Конец... Поясните, если не трудно...Для того чтобы не делать sum и не хранить остатки за все даты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:58
|
|||
|---|---|---|---|
|
|||
быстрое получение остатков на дату |
|||
|
#18+
TORTЯ не совсем понимаю зачем Начало и Конец... Поясните, если не трудно...Да, я понял - вы хотите сказать, что можно обойтись только Началом. Можно, но в этом случае запрос для получения значения будет более сложным - без подзапроса не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:59
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Спасибо за подробное пояснение... Но все-таки хотелось бы уточнить... Таким образом Вы предлагаете хранить интервалы, на которых остатки были неизменными? Я правильно понял? Вы тестировали данный подход? Если не серк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 13:59
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Если не секрет на каой СУБД? Какой интервал движения? И какое кол-во номенклатур? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 14:01
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Интересен механиз реализации этого подхода... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 14:09
|
|||
|---|---|---|---|
|
|||
быстрое получение остатков на дату |
|||
|
#18+
TORTСпасибо за подробное пояснение... Но все-таки хотелось бы уточнить... Таким образом Вы предлагаете хранить интервалы, на которых остатки были неизменными? Я правильно понял? Да, правильно. TORTВы тестировали данный подход? Если не серкНе только тестировал, но и промышленно эксплуатировал. :) TORTЕсли не секрет на каой СУБД? Какой интервал движения? И какое кол-во номенклатур?О СУБД вы могли из моего профиля догадаться - Oracle. Но думаю, что такой подход мог бы на любой СУБД использоваться. Количественные характеристики: из реально работающих есть примеры в которых более 100 тысяч учетных единиц и сотни тысяч движений в день. Но это мало о чем говорит, так как надо учитывать используемую технику и то, что реальные системы не только движения учитывают. Голый тестовый пример для сравнения этой модели с другими я не собирал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 14:19
|
|||
|---|---|---|---|
быстрое получение остатков на дату |
|||
|
#18+
Вопрос с реализацией? Как формируется такая таблица? Триггеры, специальная ХП, клиентское приложение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2007, 15:22
|
|||
|---|---|---|---|
|
|||
быстрое получение остатков на дату |
|||
|
#18+
TORTВопрос с реализацией? Как формируется такая таблица? Триггеры, специальная ХП, клиентское приложение?Триггеры или ХП - это не очень интересный вопрос. У нас было несколько реализаций. Стандартно была процедура, добавляющая движения, она же и остатком занималась. Но в триггере это выглядело бы точно так же. Гораздо более интересный вопрос с обеспечением сериализации - если несколько сеансов одновременно делают движения по одной и той же учетной единице. В общем-то обычная блокировка здесь помогает, но был у нас один исключительный случай, когда учетных единиц было мало (порядка сотни), а конкурирующих транзакций - много (до полусотни процессов и десятки тысяч операций в час у каждого). Тут задержки на блокировках становятся посущественней. Для этого случая был другой вариант, когда заполнением этой таблицы занимался отдельный фоновый процесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=35&mobile=1&tid=1553196]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 392ms |

| 0 / 0 |
