Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Циклический сдвиг записей  [new]
Rajesh
Member

Откуда:
Сообщений: 8
Подскажите, как можно реализовать такую задачу, я сам не программист, но премия не помешает, программировать умею.

В общем есть база данных MS SQL Compact Edition в ней таблица. Туда постоянно пишутся какие-то данные, запись идет постоянно. По требованию заказчика, ему не нужны старые данные, в общем как мне объяснили по простому, нужно организовать такую систему хранения данных, когда например у нас в таблице базы не более миллиона записей, когда например пишется запись после миллионной, то удаляется первая запись и на ее место встает вторая и т.д. и милионная запись освобождается и в нее пишем, то есть такой циклический сдвиг. Пока нет идеи как такое реализовать, ведь по моему разумению циклический сдвиг миллиона записей будет происходить очень долго или нет?
5 ноя 14, 19:09    [16802652]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Rajesh, при вставке записей проверяете уже имеющееся количество: если есть миллион, то удаляете столько же старых, сколько вставляете новых. но только при чем тут сдвиг и что значит "на ее место встает вторая", о каком месте речь?
5 ноя 14, 19:14    [16802674]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Например: Mongo Style Capped Collections In MS SQL Server
5 ноя 14, 19:14    [16802675]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Также в статье упоминается то, что можно создать задание в SQL Server Agent-е.
5 ноя 14, 19:19    [16802694]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
Rajesh
Member

Откуда:
Сообщений: 8
Shakill,

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

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


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

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

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


То есть старая запись удаляется, сдвигается с потерей.
5 ноя 14, 19:23    [16802703]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Rajesh, а "запись идет постоянно" - это сколько операций INSERT в секунду, минуту, час?
5 ноя 14, 19:31    [16802734]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
Rajesh
Member

Откуда:
Сообщений: 8
skyANA,

Запись через постоянный промежуток времени, сейчас не скажу, около 5 секунд вроде. В общем строго каждые 5 секунд добавляется новая запись.
5 ноя 14, 19:40    [16802777]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Rajesh
MS SQL Compact Edition
В Compact Edition есть агент?
Лень лезть смотреть, но я что-то сомневаюсь.
5 ноя 14, 19:48    [16802789]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Rajesh
То есть старая запись удаляется, сдвигается с потерей.

в обычном MS SQL можно было бы повесить триггер на вставку, который удаляет лишнее, а если в Compact Edition такой возможности нет, то вы можете запустить какой-нибудь шедулер, который так же будет время от времени проверять количество и удалять необходимое количество записей, чтоб уложиться в ваш максимум
5 ноя 14, 19:58    [16802809]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
iap
Rajesh
MS SQL Compact Edition
В Compact Edition есть агент?
Лень лезть смотреть, но я что-то сомневаюсь.
Есть какой-то.

Но если честно, то я упустил из виду то, что Compaсt Edition. Но вообще идея сводится к написанию задания (Job-а).
Выполняться оно может в сервисе, в планировщике.
5 ноя 14, 20:13    [16802850]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
Rajesh
Member

Откуда:
Сообщений: 8
Можно подробнее про это, я пока не совсем понял, что за задание и куда это задание давать?
5 ноя 14, 20:19    [16802863]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Rajesh
skyANA,

Запись через постоянный промежуток времени, сейчас не скажу, около 5 секунд вроде. В общем строго каждые 5 секунд добавляется новая запись.
Грубо говоря раз в час надо удалять по 720 записей. Напишите задание :)
5 ноя 14, 20:20    [16802865]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Rajesh
Можно подробнее про это, я пока не совсем понял, что за задание и куда это задание давать?
А чем записи пишутся? На чём клиент написан, какую команду он выполняет?
5 ноя 14, 20:21    [16802868]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
Rajesh
Member

Откуда:
Сообщений: 8
skyANA,

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

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

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

Это если идеально, а вообще можно и такое что например раз в минуту запускается задание по удалению записей старше 48 часов.
5 ноя 14, 20:30    [16802880]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Rajesh,

Текущий код вставки записи в БД можете показать? В таблице есть поле типа DATETIME?
5 ноя 14, 21:17    [16802973]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
Rajesh
Member

Откуда:
Сообщений: 8
skyANA,

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


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

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


Но судя по всему, если удалять записи старше 48 часов, придется указывать полную дату, иначе не ясно что 23:05:10 это по времени более старое, чем 8:10:05.
5 ноя 14, 21:36    [16803012]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Rajesh, то есть Вы хотите сказать, что колонка Время имеет тип nvarchar(16)? Именно такой тип соответсвует time в SQL Server Compact 3.5.
5 ноя 14, 23:18    [16803330]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
Rajesh
Member

Откуда:
Сообщений: 8
skyANA,

Колонка время будет иметь такой тип, который я ей укажу. В данный момент наверное так и есть, как вы говорите, но это совсем не важно, если для решения задачи этой надо будет изменить тип, он будет изменен.
5 ноя 14, 23:25    [16803352]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Rajesh, аааа...

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

SqlCeCommand Class
5 ноя 14, 23:36    [16803377]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
booby
Member

Откуда:
Сообщений: 2557
Rajesh,

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

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

Если аналогичный тип есть в Compact Edition (скорее есть, чем нет), то можно взять предложенную реализацию без доп. подкруток.
Если нет, то нужно изобрести замену для rowversion.
Вроде счетчика с переустановкой стартового значения. Здесь потребуются доп усилия по поддержке переустановки счетчика на 1е значение.
Т.к., вероятнее всего, задача ваша одно-пользовательская и одно-поточная, поддержка "окон вставки" для нескольких одновременно идущих сеансов не потребуется.
Просто прочтите текст по первой ссылке. С высокой вероятностью это почти готовое для вас решение ( при наличии в compact edition подходящего типа), не требующее большого допиливания по месту.
М.б., какое-то доп внимание потребуют "СтолбецА, СтолбецБ" в случае, если они текстовые (Это зависит от деталей того, как движок реализует работу с текстовыми полями).
5 ноя 14, 23:37    [16803383]     Ответить | Цитировать Сообщить модератору
 Re: Циклический сдвиг записей  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
What's New in SQL Server Compact

What's New in SQL Server Compact 3.5
SQL 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.
  • 5 ноя 14, 23:46    [16803403]     Ответить | Цитировать Сообщить модератору
     Re: Циклический сдвиг записей  [new]
    a_voronin
    Member

    Откуда: Москва
    Сообщений: 4902
    Shakill
    Rajesh, при вставке записей проверяете уже имеющееся количество: если есть миллион, то удаляете столько же старых, сколько вставляете новых. но только при чем тут сдвиг и что значит "на ее место встает вторая", о каком месте речь?


    Если это проверять на каждой записи, то вы просадить производительность ниже плинтуса. Можно проверять на каждой 100-й или 1000-й записи, но иметь ввиду, что может быть некоторый подвисон.
    6 ноя 14, 13:12    [16805712]     Ответить | Цитировать Сообщить модератору
     Re: Циклический сдвиг записей  [new]
    Rajesh
    Member

    Откуда:
    Сообщений: 8
    В общем сегодня созвонился с человеком. Хранить записи требуется 24 часа, запись они хотят сделать каждую секунду, то есть в таблице будет максимум. 24часа * 60 минут * 60 секунд = 86400 записей.

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

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

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

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

    Просто методом
    автор
    DELETE FROM Table WHERE Время < @time"
    Это конечно удобно когда удаляется первая, а последняя записывается в конце, но мне сказали что на самом деле строки не удялются а где-то остаются, это правда?
    6 ноя 14, 13:42    [16805905]     Ответить | Цитировать Сообщить модератору
     Re: Циклический сдвиг записей  [new]
    skyANA
    Member

    Откуда: Зеленоград
    Сообщений: 28355
    Rajesh
    В общем сегодня созвонился с человеком. Хранить записи требуется 24 часа, запись они хотят сделать каждую секунду, то есть в таблице будет максимум. 24часа * 60 минут * 60 секунд = 86400 записей.

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

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

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

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

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

    А вариант с UPDATE - так это вариант по моей первой ссылке: 16802675.
    6 ноя 14, 14:13    [16806128]     Ответить | Цитировать Сообщить модератору
     Re: Циклический сдвиг записей  [new]
    booby
    Member

    Откуда:
    Сообщений: 2557
    Rajesh
    ...86400 записей....Потом по таймеру каждую секунду делать UPDATE, потом когда номер строки дойдет до 86400, делать номер строки равным 1...
    По производительности это нормальное решение?

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

    Но, может оказаться так, что по каким-то причинам, фактический "апдейт" окажется не через секунду, а через 2.5

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

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

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

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


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

    не обязательно оправдаются.
    Ранее Ваше внимание обращалось на то, что детали реализации могут или должны учитывать особенности "СтолбецА, СтолбецБ"

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

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

    PS
    Дерзайте.
    Рано или поздно у Вас все получится.
    Даже если это будет стоить самооценки, карьеры и финансового благополучия, может быть стоило во все это ввязаться.
    "Хочу" всегда важнее "мог"у. Без первого не бывает второго.
    Это уважаемо, если стартующий готов сгинуть навеки под своей задачей.
    7 ноя 14, 00:17    [16809374]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить