powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Циклический сдвиг записей
25 сообщений из 27, страница 1 из 2
Циклический сдвиг записей
    #38796685
Rajesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как можно реализовать такую задачу, я сам не программист, но премия не помешает, программировать умею.

В общем есть база данных MS SQL Compact Edition в ней таблица. Туда постоянно пишутся какие-то данные, запись идет постоянно. По требованию заказчика, ему не нужны старые данные, в общем как мне объяснили по простому, нужно организовать такую систему хранения данных, когда например у нас в таблице базы не более миллиона записей, когда например пишется запись после миллионной, то удаляется первая запись и на ее место встает вторая и т.д. и милионная запись освобождается и в нее пишем, то есть такой циклический сдвиг. Пока нет идеи как такое реализовать, ведь по моему разумению циклический сдвиг миллиона записей будет происходить очень долго или нет?
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796687
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rajesh, при вставке записей проверяете уже имеющееся количество: если есть миллион, то удаляете столько же старых, сколько вставляете новых. но только при чем тут сдвиг и что значит "на ее место встает вторая", о каком месте речь?
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796688
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796692
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также в статье упоминается то, что можно создать задание в SQL Server Agent-е .
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796694
Rajesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shakill,

Ну грубо говоря у нас есть база:

Колонка1Колонка2Запись1Значение1Запись2Значение2Запись3Значение3

К примеру у нас потолок не миллион, а 3.

Тогда при добавлении новой записи, таблица должна выглядеть так:

Колонка1Колонка2Запись2Значение2Запись3Значение3Запись4Значение4

То есть старая запись удаляется, сдвигается с потерей.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796703
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rajesh, а "запись идет постоянно" - это сколько операций INSERT в секунду, минуту, час?
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796707
Rajesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Запись через постоянный промежуток времени, сейчас не скажу, около 5 секунд вроде. В общем строго каждые 5 секунд добавляется новая запись.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796710
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RajeshMS SQL Compact EditionВ Compact Edition есть агент?
Лень лезть смотреть, но я что-то сомневаюсь.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796716
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RajeshТо есть старая запись удаляется, сдвигается с потерей.
в обычном MS SQL можно было бы повесить триггер на вставку, который удаляет лишнее, а если в Compact Edition такой возможности нет, то вы можете запустить какой-нибудь шедулер, который так же будет время от времени проверять количество и удалять необходимое количество записей, чтоб уложиться в ваш максимум
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796723
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapRajeshMS SQL Compact EditionВ Compact Edition есть агент?
Лень лезть смотреть, но я что-то сомневаюсь.Есть какой-то.

Но если честно, то я упустил из виду то, что Compaсt Edition. Но вообще идея сводится к написанию задания (Job-а).
Выполняться оно может в сервисе, в планировщике.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796725
Rajesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно подробнее про это, я пока не совсем понял, что за задание и куда это задание давать?
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796726
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RajeshskyANA,

Запись через постоянный промежуток времени, сейчас не скажу, около 5 секунд вроде. В общем строго каждые 5 секунд добавляется новая запись.Грубо говоря раз в час надо удалять по 720 записей. Напишите задание :)
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796727
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RajeshМожно подробнее про это, я пока не совсем понял, что за задание и куда это задание давать?А чем записи пишутся? На чём клиент написан, какую команду он выполняет?
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796729
Rajesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

А, я понял. Неправильно построил вопрос я.

В общем систему их надо дописывать как я понял на C#.

У них есть таймер, с интервалом 5000, каждый тик таймера - INSERT в базу. Соответственно у них база растет растет растет растет и растет. Им в базе не нужны значения старше 48 часов, то есть при пустой базе через 48 часов записи в базу начинается такой момент, когда первая запись становится таковой, вторая, третья, четвертая и т.д. В итоге нужно вместе с этим тиком таймера удалять первую строку и чтобы вся база смещалась на эту первую строку.

Это если идеально, а вообще можно и такое что например раз в минуту запускается задание по удалению записей старше 48 часов.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796745
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rajesh,

Текущий код вставки записи в БД можете показать? В таблице есть поле типа DATETIME?
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796755
Rajesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Ну сейчас проекта нету, но я видел код. Выглядит вот так примерно, да первая колонка - время.


"INSERT into Table (Время, СтолбецА, СтолбецБ, ...) VALUES (@time, @СтолбецА, СтолбецБ, ...)";

Соответственно в базе все это идет как:
Время15:05:2015:05:2515:05:30...19:10:05

Но судя по всему, если удалять записи старше 48 часов, придется указывать полную дату, иначе не ясно что 23:05:10 это по времени более старое, чем 8:10:05.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796794
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rajesh, то есть Вы хотите сказать, что колонка Время имеет тип nvarchar (16)? Именно такой тип соответсвует time в SQL Server Compact 3.5.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796798
Rajesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Колонка время будет иметь такой тип, который я ей укажу. В данный момент наверное так и есть, как вы говорите, но это совсем не важно, если для решения задачи этой надо будет изменить тип, он будет изменен.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796802
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rajesh, аааа...

Ну тогда самый простой вариант - это изменить тип колонки на datetime , и после INSERT выполнить (код C#):
Код: c#
1.
2.
3.
4.
5.
using (var cmd = new SqlCeCommand("DELETE FROM Table WHERE Время < @time", conn)
{
    cmd.Parameters.AddWithValue("@time", DateTime.Now.AddHours(-48);
    cmd.ExecuteNonQuery();
}


SqlCeCommand Class
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796803
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rajesh,

Забудьте пока про "задания" и "удалять".
То, что Вы описываете, называется кольцевой буфер .
В "обычных" случаях с ним не принято работать методом "удалить старые и добавить новые".
Его устраивают так:
Создают таблицу сразу с количеством записей, равным размеру буфера.
Затем используют только одну команду - update, изменяя всегда существующие записи в "кольцевом" порядке.
"Задания" и "агенты" понадобятся, если вы работаете не с простым кольцевым буфером, а с чем-то вроде "кольцевой очереди",
т.е. с таблицей, подлежащей "очистке после прочтения" и имеющей заранее заданную максимальную вместимость.

Вариант, предложенный по первой ссылке skyANA описывает реализацию именно кольцевого буфера (а не кольцевой очереди), в которой проектировщик закладывается на встроенный в SQL Server тип данных rowversion, он же timestamp в более ранних версиях.

Если аналогичный тип есть в Compact Edition (скорее есть, чем нет), то можно взять предложенную реализацию без доп. подкруток.
Если нет, то нужно изобрести замену для rowversion.
Вроде счетчика с переустановкой стартового значения. Здесь потребуются доп усилия по поддержке переустановки счетчика на 1е значение.
Т.к., вероятнее всего, задача ваша одно-пользовательская и одно-поточная, поддержка "окон вставки" для нескольких одновременно идущих сеансов не потребуется.
Просто прочтите текст по первой ссылке. С высокой вероятностью это почти готовое для вас решение ( при наличии в compact edition подходящего типа), не требующее большого допиливания по месту.
М.б., какое-то доп внимание потребуют "СтолбецА, СтолбецБ" в случае, если они текстовые (Это зависит от деталей того, как движок реализует работу с текстовыми полями).
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38796809
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
What's New in SQL Server Compact

What's New in SQL Server Compact 3.5SQL Server Compact 3.5 was released with Visual Studio 2008. Starting with the SQL Server Compact 3.5 release, SQL Server Compact provides the following new features:

SQL Server Compact implements the timestamp ( rowversion ) data type. The rowversion is a data type that exposes automatically generated binary numbers, which are guaranteed to be unique in a database.
It is used typically as a mechanism for version-stamping table rows.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38797224
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillRajesh, при вставке записей проверяете уже имеющееся количество: если есть миллион, то удаляете столько же старых, сколько вставляете новых. но только при чем тут сдвиг и что значит "на ее место встает вторая", о каком месте речь?

Если это проверять на каждой записи, то вы просадить производительность ниже плинтуса. Можно проверять на каждой 100-й или 1000-й записи, но иметь ввиду, что может быть некоторый подвисон.
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38797263
Rajesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем сегодня созвонился с человеком. Хранить записи требуется 24 часа, запись они хотят сделать каждую секунду, то есть в таблице будет максимум. 24часа * 60 минут * 60 секунд = 86400 записей.

Как я хочу это реализовать:

При первоначальной настройке базы INSERT 86400 записей пустых, возможно пронумерованых с первым столбцом №1...86400.

Потом по таймеру каждую секунду делать UPDATE, потом когда номер строки дойдет до 86400, делать номер строки равным 1. То есть запись новых значений пойдет сверху заменяя старые.

По производительности это нормальное решение?

Просто методом авторDELETE FROM Table WHERE Время < @time" Это конечно удобно когда удаляется первая, а последняя записывается в конце, но мне сказали что на самом деле строки не удялются а где-то остаются, это правда?
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38797310
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RajeshВ общем сегодня созвонился с человеком. Хранить записи требуется 24 часа, запись они хотят сделать каждую секунду, то есть в таблице будет максимум. 24часа * 60 минут * 60 секунд = 86400 записей.

Как я хочу это реализовать:

При первоначальной настройке базы INSERT 86400 записей пустых, возможно пронумерованых с первым столбцом №1...86400.

Потом по таймеру каждую секунду делать UPDATE, потом когда номер строки дойдет до 86400, делать номер строки равным 1. То есть запись новых значений пойдет сверху заменяя старые.

По производительности это нормальное решение?

Просто методом авторDELETE FROM Table WHERE Время < @time" Это конечно удобно когда удаляется первая, а последняя записывается в конце, но мне сказали что на самом деле строки не удялются а где-то остаются, это правда?Вы не правильно поняли то, что Вам сказали.

А вариант с UPDATE - так это вариант по моей первой ссылке: 16802675 .
...
Рейтинг: 0 / 0
Циклический сдвиг записей
    #38797919
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rajesh...86400 записей....Потом по таймеру каждую секунду делать UPDATE, потом когда номер строки дойдет до 86400, делать номер строки равным 1...
По производительности это нормальное решение?

При таком объеме данных любое произвольно взятое - даже самое неудачное решение - "по производительности" будет почти наверно "нормальным".
Черти как всегда в деталях.
Я не знаю, почему и зачем Вам авторПотом по таймеру каждую секунду делать UPDATE
Но, может оказаться так, что по каким-то причинам, фактический "апдейт" окажется не через секунду, а через 2.5

В зависимости от того, как фактически окажется выписанным Ваш "апдейт", у вас появятся или нет пропуски в каких-то точках из планируемых 86400. Значит-ли это что-то по существу задачи или нет - от моего компьютера не видать.

Видно вот что: этот вопрос - в решении, предлагаемом по ссылке skyANA - полностью "замазан".
т.е. - пропусков там не будет, в плане оставшихся не перезаписанными, строк.
Если Вы ориентируетесь в SQL, то перезапись варианта того запроса для случая 86400 нумерованных строк очевидна.
И, в среднем, Вы "почти всегда" попадете в "свою" секунду.

Вот будет при этом, с точки зрения конечного пользователя системы, происходить или нет потеря, или искажение информации не просто в бинокль не видать, а даже в подходящего телескопа не видно в кустах.
Сейчас задача, которая должна решиться на Земле, рассматривается даже не с орбиты Луны или Марса, а откуда-то из-за пределов Урана.

авторЭто конечно удобно когда удаляется первая, а последняя записывается в конце, но мне сказали что на самом деле строки не удялются а где-то остаются, это правда?

Какой кошмар (страшно аж жуть).
С учетом того обстоятельства, что Вы пока не понимаете - чего надо бояться, а что составляет собой забористую шутку,
сформулируем так:
а) Ваши надежды на то, что авторТо есть запись новых значений пойдет сверху заменяя старые.
не обязательно оправдаются.
Ранее Ваше внимание обращалось на то, что детали реализации могут или должны учитывать особенности "СтолбецА, СтолбецБ"

б) Приемлемо или нет конкретное решение, в плане организации таблиц и запросов, работающих с ними невозможно принять на основе понимания только свойств таблиц и знания особенностей той или иной системы хранения данных.

Это понимание должно быть положено на детальное понимание существа вашей задачи безотносительно к таблицам.
А об этом Вы ни одного содержательного слова не сказали.

PS
Дерзайте.
Рано или поздно у Вас все получится.
Даже если это будет стоить самооценки, карьеры и финансового благополучия, может быть стоило во все это ввязаться.
"Хочу" всегда важнее "мог"у. Без первого не бывает второго.
Это уважаемо, если стартующий готов сгинуть навеки под своей задачей.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Циклический сдвиг записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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