Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Таблица для логов программы: insert'ы блокируют себя.  [new]
Moriarti
Member

Откуда: Ultima Thule
Сообщений: 744
Hi All!

Есть некая простая таблица OperLog, куда пишется лог действий моей системы.

CREATE TABLE [dbo].[OperLog](
	[ID] [uniqueidentifier] NOT NULL,
	[OperType] [int] NOT NULL,
	[CUser] [varchar](50) NULL,
	[CDate] [datetime] NULL,
	[SEA_ID] [varchar](50) NULL,
	[Comment] [varchar](2048) NULL,
	[ChCode] [varchar](50) NULL,
	[TDoc] [varchar](2) NULL,
 CONSTRAINT [PK_OperLog] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[OperLog] ADD  CONSTRAINT [DF_OperLog_ID]  DEFAULT (newid()) FOR [ID]
GO


Пример записи события:

INSERT INTO OperLog (
	OperType,
	CUser,
	CDate,
	SEA_ID,
	Comment,
	TDoc
	)
VALUES (
	5,
	'RazovAV',
	'2014-02-07 17:00:12',
	'73118',
	'Razovav-m.tatneft.ru',
	'')


Несколько месяцев, проблем с этой таблицей не было.
С увеличением количества строк до 300 тысяч появилась проблема:
sp_who2 показывает что инсерты блокируются друг другом.
Других действий с таблицей практически нет.
- есть отчетность по логам, но она запускается нечасто + некие проверки нахождения события в логе (там select c (nolock))

В день идет в среднем добавление приблизительно 5000-6000 строчек. Так как логи пишутся в основном, в рабочее время, то это примерно 12 инсертов в минуту.

Погуглил проблему, убрал все индексы на таблицу (были для облегчения построения отчетов), оставив только PK, однако, блокировки все равно периодически возникают.

Как оптимизировать таблицу, чтобы избавиться от блокировок?

Вынести весь лог в отдельную таблицу OperLogMain, а для оперативной вставки использовать маленький "дневной" OperLog, данные из которого сливать ночью в OperLogMain?
10 фев 14, 08:02    [15544429]     Ответить | Цитировать Сообщить модератору
 Re: Таблица для логов программы: insert'ы блокируют себя.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Moriarti
ALTER TABLE [dbo].[OperLog] ADD  CONSTRAINT [DF_OperLog_ID]  DEFAULT (newid()) FOR [ID]


Ну, вы хотя б NEWSEQUENTIALID() использовали б, что ли...
10 фев 14, 08:20    [15544450]     Ответить | Цитировать Сообщить модератору
 Re: Таблица для логов программы: insert'ы блокируют себя.  [new]
Moriarti
Member

Откуда: Ultima Thule
Сообщений: 744
tpg,

а что NEWSEQUENTIALID() быстрее newid() будет?
10 фев 14, 08:34    [15544471]     Ответить | Цитировать Сообщить модератору
 Re: Таблица для логов программы: insert'ы блокируют себя.  [new]
Moriarti
Member

Откуда: Ultima Thule
Сообщений: 744
Ага, прочитал.

Если столбец GUID используется в качестве идентификатора строки, использование NEWSEQUENTIALID может ускорить работу по сравнению с использованием функции NEWID


http://technet.microsoft.com/ru-ru/library/ms189786.aspx

Я, признаюсь, всегда оставлял по-умолчанию newid().
10 фев 14, 08:41    [15544484]     Ответить | Цитировать Сообщить модератору
 Re: Таблица для логов программы: insert'ы блокируют себя.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Moriarti
Ага, прочитал.

Если столбец GUID используется в качестве идентификатора строки, использование NEWSEQUENTIALID может ускорить работу по сравнению с использованием функции NEWID


http://technet.microsoft.com/ru-ru/library/ms189786.aspx

Я, признаюсь, всегда оставлял по-умолчанию newid().
newid() тоже хорошо.

Просто тогда нельзя оставлять кластерный индекс, если вы используете гуид.
10 фев 14, 21:41    [15548528]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить