|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Подскажите, как можно реализовать такую задачу, я сам не программист, но премия не помешает, программировать умею. В общем есть база данных MS SQL Compact Edition в ней таблица. Туда постоянно пишутся какие-то данные, запись идет постоянно. По требованию заказчика, ему не нужны старые данные, в общем как мне объяснили по простому, нужно организовать такую систему хранения данных, когда например у нас в таблице базы не более миллиона записей, когда например пишется запись после миллионной, то удаляется первая запись и на ее место встает вторая и т.д. и милионная запись освобождается и в нее пишем, то есть такой циклический сдвиг. Пока нет идеи как такое реализовать, ведь по моему разумению циклический сдвиг миллиона записей будет происходить очень долго или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:09 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Rajesh, при вставке записей проверяете уже имеющееся количество: если есть миллион, то удаляете столько же старых, сколько вставляете новых. но только при чем тут сдвиг и что значит "на ее место встает вторая", о каком месте речь? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:14 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Также в статье упоминается то, что можно создать задание в SQL Server Agent-е . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:19 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Shakill, Ну грубо говоря у нас есть база: Колонка1Колонка2Запись1Значение1Запись2Значение2Запись3Значение3 К примеру у нас потолок не миллион, а 3. Тогда при добавлении новой записи, таблица должна выглядеть так: Колонка1Колонка2Запись2Значение2Запись3Значение3Запись4Значение4 То есть старая запись удаляется, сдвигается с потерей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:23 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Rajesh, а "запись идет постоянно" - это сколько операций INSERT в секунду, минуту, час? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:31 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
skyANA, Запись через постоянный промежуток времени, сейчас не скажу, около 5 секунд вроде. В общем строго каждые 5 секунд добавляется новая запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:40 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
RajeshMS SQL Compact EditionВ Compact Edition есть агент? Лень лезть смотреть, но я что-то сомневаюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:48 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
RajeshТо есть старая запись удаляется, сдвигается с потерей. в обычном MS SQL можно было бы повесить триггер на вставку, который удаляет лишнее, а если в Compact Edition такой возможности нет, то вы можете запустить какой-нибудь шедулер, который так же будет время от времени проверять количество и удалять необходимое количество записей, чтоб уложиться в ваш максимум ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:58 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
iapRajeshMS SQL Compact EditionВ Compact Edition есть агент? Лень лезть смотреть, но я что-то сомневаюсь.Есть какой-то. Но если честно, то я упустил из виду то, что Compaсt Edition. Но вообще идея сводится к написанию задания (Job-а). Выполняться оно может в сервисе, в планировщике. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 20:13 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Можно подробнее про это, я пока не совсем понял, что за задание и куда это задание давать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 20:19 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
RajeshskyANA, Запись через постоянный промежуток времени, сейчас не скажу, около 5 секунд вроде. В общем строго каждые 5 секунд добавляется новая запись.Грубо говоря раз в час надо удалять по 720 записей. Напишите задание :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 20:20 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
RajeshМожно подробнее про это, я пока не совсем понял, что за задание и куда это задание давать?А чем записи пишутся? На чём клиент написан, какую команду он выполняет? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 20:21 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
skyANA, А, я понял. Неправильно построил вопрос я. В общем систему их надо дописывать как я понял на C#. У них есть таймер, с интервалом 5000, каждый тик таймера - INSERT в базу. Соответственно у них база растет растет растет растет и растет. Им в базе не нужны значения старше 48 часов, то есть при пустой базе через 48 часов записи в базу начинается такой момент, когда первая запись становится таковой, вторая, третья, четвертая и т.д. В итоге нужно вместе с этим тиком таймера удалять первую строку и чтобы вся база смещалась на эту первую строку. Это если идеально, а вообще можно и такое что например раз в минуту запускается задание по удалению записей старше 48 часов. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 20:30 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Rajesh, Текущий код вставки записи в БД можете показать? В таблице есть поле типа DATETIME? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 21:17 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
skyANA, Ну сейчас проекта нету, но я видел код. Выглядит вот так примерно, да первая колонка - время. "INSERT into Table (Время, СтолбецА, СтолбецБ, ...) VALUES (@time, @СтолбецА, СтолбецБ, ...)"; Соответственно в базе все это идет как: Время15:05:2015:05:2515:05:30...19:10:05 Но судя по всему, если удалять записи старше 48 часов, придется указывать полную дату, иначе не ясно что 23:05:10 это по времени более старое, чем 8:10:05. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 21:36 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Rajesh, то есть Вы хотите сказать, что колонка Время имеет тип nvarchar (16)? Именно такой тип соответсвует time в SQL Server Compact 3.5. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 23:18 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
skyANA, Колонка время будет иметь такой тип, который я ей укажу. В данный момент наверное так и есть, как вы говорите, но это совсем не важно, если для решения задачи этой надо будет изменить тип, он будет изменен. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 23:25 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Rajesh, аааа... Ну тогда самый простой вариант - это изменить тип колонки на datetime , и после INSERT выполнить (код C#): Код: c# 1. 2. 3. 4. 5.
SqlCeCommand Class ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 23:36 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Rajesh, Забудьте пока про "задания" и "удалять". То, что Вы описываете, называется кольцевой буфер . В "обычных" случаях с ним не принято работать методом "удалить старые и добавить новые". Его устраивают так: Создают таблицу сразу с количеством записей, равным размеру буфера. Затем используют только одну команду - update, изменяя всегда существующие записи в "кольцевом" порядке. "Задания" и "агенты" понадобятся, если вы работаете не с простым кольцевым буфером, а с чем-то вроде "кольцевой очереди", т.е. с таблицей, подлежащей "очистке после прочтения" и имеющей заранее заданную максимальную вместимость. Вариант, предложенный по первой ссылке skyANA описывает реализацию именно кольцевого буфера (а не кольцевой очереди), в которой проектировщик закладывается на встроенный в SQL Server тип данных rowversion, он же timestamp в более ранних версиях. Если аналогичный тип есть в Compact Edition (скорее есть, чем нет), то можно взять предложенную реализацию без доп. подкруток. Если нет, то нужно изобрести замену для rowversion. Вроде счетчика с переустановкой стартового значения. Здесь потребуются доп усилия по поддержке переустановки счетчика на 1е значение. Т.к., вероятнее всего, задача ваша одно-пользовательская и одно-поточная, поддержка "окон вставки" для нескольких одновременно идущих сеансов не потребуется. Просто прочтите текст по первой ссылке. С высокой вероятностью это почти готовое для вас решение ( при наличии в compact edition подходящего типа), не требующее большого допиливания по месту. М.б., какое-то доп внимание потребуют "СтолбецА, СтолбецБ" в случае, если они текстовые (Это зависит от деталей того, как движок реализует работу с текстовыми полями). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 23:37 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 23:46 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
ShakillRajesh, при вставке записей проверяете уже имеющееся количество: если есть миллион, то удаляете столько же старых, сколько вставляете новых. но только при чем тут сдвиг и что значит "на ее место встает вторая", о каком месте речь? Если это проверять на каждой записи, то вы просадить производительность ниже плинтуса. Можно проверять на каждой 100-й или 1000-й записи, но иметь ввиду, что может быть некоторый подвисон. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2014, 13:12 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
В общем сегодня созвонился с человеком. Хранить записи требуется 24 часа, запись они хотят сделать каждую секунду, то есть в таблице будет максимум. 24часа * 60 минут * 60 секунд = 86400 записей. Как я хочу это реализовать: При первоначальной настройке базы INSERT 86400 записей пустых, возможно пронумерованых с первым столбцом №1...86400. Потом по таймеру каждую секунду делать UPDATE, потом когда номер строки дойдет до 86400, делать номер строки равным 1. То есть запись новых значений пойдет сверху заменяя старые. По производительности это нормальное решение? Просто методом авторDELETE FROM Table WHERE Время < @time" Это конечно удобно когда удаляется первая, а последняя записывается в конце, но мне сказали что на самом деле строки не удялются а где-то остаются, это правда? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2014, 13:42 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
RajeshВ общем сегодня созвонился с человеком. Хранить записи требуется 24 часа, запись они хотят сделать каждую секунду, то есть в таблице будет максимум. 24часа * 60 минут * 60 секунд = 86400 записей. Как я хочу это реализовать: При первоначальной настройке базы INSERT 86400 записей пустых, возможно пронумерованых с первым столбцом №1...86400. Потом по таймеру каждую секунду делать UPDATE, потом когда номер строки дойдет до 86400, делать номер строки равным 1. То есть запись новых значений пойдет сверху заменяя старые. По производительности это нормальное решение? Просто методом авторDELETE FROM Table WHERE Время < @time" Это конечно удобно когда удаляется первая, а последняя записывается в конце, но мне сказали что на самом деле строки не удялются а где-то остаются, это правда?Вы не правильно поняли то, что Вам сказали. А вариант с UPDATE - так это вариант по моей первой ссылке: 16802675 . ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2014, 14:13 |
|
Циклический сдвиг записей
|
|||
---|---|---|---|
#18+
Rajesh...86400 записей....Потом по таймеру каждую секунду делать UPDATE, потом когда номер строки дойдет до 86400, делать номер строки равным 1... По производительности это нормальное решение? При таком объеме данных любое произвольно взятое - даже самое неудачное решение - "по производительности" будет почти наверно "нормальным". Черти как всегда в деталях. Я не знаю, почему и зачем Вам авторПотом по таймеру каждую секунду делать UPDATE Но, может оказаться так, что по каким-то причинам, фактический "апдейт" окажется не через секунду, а через 2.5 В зависимости от того, как фактически окажется выписанным Ваш "апдейт", у вас появятся или нет пропуски в каких-то точках из планируемых 86400. Значит-ли это что-то по существу задачи или нет - от моего компьютера не видать. Видно вот что: этот вопрос - в решении, предлагаемом по ссылке skyANA - полностью "замазан". т.е. - пропусков там не будет, в плане оставшихся не перезаписанными, строк. Если Вы ориентируетесь в SQL, то перезапись варианта того запроса для случая 86400 нумерованных строк очевидна. И, в среднем, Вы "почти всегда" попадете в "свою" секунду. Вот будет при этом, с точки зрения конечного пользователя системы, происходить или нет потеря, или искажение информации не просто в бинокль не видать, а даже в подходящего телескопа не видно в кустах. Сейчас задача, которая должна решиться на Земле, рассматривается даже не с орбиты Луны или Марса, а откуда-то из-за пределов Урана. авторЭто конечно удобно когда удаляется первая, а последняя записывается в конце, но мне сказали что на самом деле строки не удялются а где-то остаются, это правда? Какой кошмар (страшно аж жуть). С учетом того обстоятельства, что Вы пока не понимаете - чего надо бояться, а что составляет собой забористую шутку, сформулируем так: а) Ваши надежды на то, что авторТо есть запись новых значений пойдет сверху заменяя старые. не обязательно оправдаются. Ранее Ваше внимание обращалось на то, что детали реализации могут или должны учитывать особенности "СтолбецА, СтолбецБ" б) Приемлемо или нет конкретное решение, в плане организации таблиц и запросов, работающих с ними невозможно принять на основе понимания только свойств таблиц и знания особенностей той или иной системы хранения данных. Это понимание должно быть положено на детальное понимание существа вашей задачи безотносительно к таблицам. А об этом Вы ни одного содержательного слова не сказали. PS Дерзайте. Рано или поздно у Вас все получится. Даже если это будет стоить самооценки, карьеры и финансового благополучия, может быть стоило во все это ввязаться. "Хочу" всегда важнее "мог"у. Без первого не бывает второго. Это уважаемо, если стартующий готов сгинуть навеки под своей задачей. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2014, 00:17 |
|
|
start [/forum/topic.php?fid=46&tid=1700126]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
184ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 313ms |
0 / 0 |