powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дата последнего движения
6 сообщений из 31, страница 2 из 2
Дата последнего движения
    #32888046
Alexey Rovdo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DogenКак это неконтролируемый? Будет типа какой-нибудь логарифм от количества документов (пущай грамотные товарищи поправют).

Логарифм он и есть логарифм. И результат логарифма уж точно неконтролируемый - он предопределенный законами природы.
...
Рейтинг: 0 / 0
Дата последнего движения
    #32888056
Alexey Rovdo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может построить отдельную таблицу, в которую переносить только уникальные значения пар AccountId и Date? Т.е. множество проводок по одному счету в один день породят в такой таблице только одну запись. Не уверен, что это отличается от использования композитных индексов, но в такой таблице в любом разе легче будет задействовать кластеризацию.
...
Рейтинг: 0 / 0
Дата последнего движения
    #32888068
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА может построить отдельную таблицу

И чего? Будет сканиться она. Получим неконтролируемый рост / количество записей в день = неконтролируемый рост.
...
Рейтинг: 0 / 0
Дата последнего движения
    #32888075
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-- Если есть разные счета, тогда надо использовать код операции
CREATE INDEX IX_OPR1_REW ON dbo.OPR1(KofOpr, DateOpr DESC, NomOpr DESC )

-- Использовать временную таблиицу или таблицу памяти
Declare @DateN DateTime, @DateK DateTime
Create table #T (KodOPr int, DateOpr DateTime, NomOpr int)
Insert into #T (KodOpr)
select Distinct KodOpr
from Opr1 with (index(Ix_Opr1_Rew))
where DateOpr between @DateN and @DateK
-- Здесь нет перебора по базе, используется только индекс

-- Заполнить таблицу последней датой
Update t Set
DateOpr=(select top 1 DateOpr
from Opr1 with (index(Ix_Opr1_Rew))
order by DateOpr Desc, NomOpr desc),
NomOpr=(select top 1 DateOpr
from Opr1 with (index(Ix_Opr1_Rew))
order by DateOpr Desc, NomOpr desc)
from #T t

-- Можно еще уменьшить время в два раза, если помудрить
-- над последним операторм, т.е.

Declare @Str VarChar (50)
Update t Set
@Str =(select top 1
Convert(Char(15),DateOpr,4)+
Convert(Char(10), NomOpr)
from Opr1 with (index(Ix_Opr1_Rew))
order by DateOpr Desc, NomOpr desc),
DateOpr=Convert(DateTime,Left(@Str,15)),
NomOpr=Convert(Int,Substring(@Str,16,10))
from #T t
...
Рейтинг: 0 / 0
Дата последнего движения
    #32888791
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 PVP

Спасибо! И ведь знал же про этот прием... Избавил от кучи лишней работы. Reads, конечно, в результате бы революционно уменьшилось, но так (через спекуляцию с индексом) все будет работать уже сейчас и без изменения системы.

P.S.В "моем" случае и DESC индекса не понадобилось по своим причинам.
...
Рейтинг: 0 / 0
Дата последнего движения
    #32889527
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crimean

Обычно кроме проводок есть еще и закэшированная информация об остатках на счете
При чем если ее делать по уму то эта таблица, грубо говоря, хранит записи только за
те даты на которые по указанному счету были обороты. Ясно, что количество записей в
такой таблице на порядок меньше чем в таблице проводок. Возможно, стоит требуемую
информацию брать оттуда?

Это что касается программной оптимизации - кроме того, у большинства СУБД есть свои
средства работы с большими таблицами (тот же partitioned views)
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дата последнего движения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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