Самый эффективный способ поддерживать максимальное количество записей в таблице базы данных SQL Server - PullRequest
0 голосов
/ 15 января 2012

Мне было интересно, каков наиболее эффективный способ сделать следующее?

Я пытаюсь внедрить какую-то систему аудита, где каждый вход на мою страницу будет храниться в базе данных.Я использую базу данных SQL Server 2005.Таблица, в которой хранятся данные аудита, очевидно, не может расти без верхнего предела.Так, скажем, он должен иметь максимум 1000 записей, а затем любые старые записи должны быть удалены при вставке новых.Вопрос в том, как сделать это наиболее эффективным способом - нужно ли мне добавлять какие-либо специальные столбцы, например, порядковый номер записи для упрощения очистки?

РЕДАКТИРОВАТЬ: Скажите, если структурамоей таблицы (псевдокод):

`id` BIGINT autoincrement
`date` DATETIME
`data1` NVARCHAR(256)
`data2` INT

Как бы вы написали эту процедуру очистки?

Ответы [ 4 ]

1 голос
/ 15 января 2012

Является ли столбец «ID» столбцом идентификаторов с шагом 1?

после вставки одной строки

удалить столбец с идентификатором

1 голос
/ 15 января 2012

Как упоминал Тони, используйте даты, чтобы идентифицировать вставки.Кроме того, используйте кластерный индекс в поле даты, чтобы вставки всегда были в конце таблицы, и было легко и эффективно сканировать и удалять старые строки.

Если вы используете число,что-то вроде этого должно работать:

DELETE FROM myTable WHERE someField < (SELECT MAX(someField) - 1000 FROM myTable)

Для даты удаление всего старше одного дня было бы примерно так:

DELETE FROM myTable WHERE someField < DateAdd('d', -1, getdate())
1 голос
/ 15 января 2012

Если я понимаю ваши потребности, это должно работать. Я тестировал его на SQL 2008R2, но не вижу причин, по которым он не будет работать на SQL Server 2005.

  1. Используйте триггер входа в систему, чтобы вставить строку в таблицу аудита.

  2. Создайте триггер AFTER INSERT в вашей таблице аудита, который удаляет строку с MIN (ID).

Вот код для игры:

/ * Создать таблицу аудита * /

CREATE TABLE ServerLogonHistory
(SystemUser VARCHAR(512),
ID BIGINT,
DBUser VARCHAR(512),
SPID INT,
LogonTime DATETIME)
GO

/ * Создать триггер входа в систему * /

CREATE TRIGGER Tr_ServerLogon
ON ALL SERVER FOR LOGON
AS
BEGIN
INSERT INTO TestDB.dbo.ServerLogonHistory
SELECT SYSTEM_USER, MAX(ID)+1 , USER,@@SPID,GETDATE()
FROM TestDB.dbo.ServerLogonHistory;
END
GO 

/ * Создать триггер очистки * /

CREATE TRIGGER AfterLogin
ON TestDB.dbo.ServerLogonHistory
AFTER INSERT
AS
DELETE 
FROM TestDB.dbo.ServerLogonHistory 
WHERE ID = 
(SELECT MIN(ID) FROM TestDB.dbo.ServerLogonHistory);
GO;

Слово предупреждения. Если вы создадите неверный триггер входа в систему, вы не сможете войти в базу данных. Но не паникуйте! Это все часть обучения. Вы сможете использовать «sqlcmd», чтобы сбросить неверный триггер.

Я попытался удалить строку с идентификатором min в триггере входа в систему, но мне не удалось заставить это работать.

1 голос
/ 15 января 2012

Делай это по дате, а не по номеру. Посмотрите на вашу статистику, посмотрите, сколько будет 1000 дней. Удалите что-нибудь старше этого. Аудит никогда не бывает особенно эффективным, но если у вас есть масса данных, которые вам не помогают, это очень неэффективно ...

...