У мене є таблиця входу, в яку всі вставки виконуються за єдиною збереженою процедурою.
CREATE TABLE dbo.LogTable(
LogRefnr int IDENTITY(1, 1) NOT NULL,
LogQuery varchar(255) NOT NULL,
LogTime datetime NOT NULL,
logQueryDuration int NULL,
LogSessionID int NULL,
CONSTRAINT PK_Log PRIMARY KEY CLUSTERED (LogRefnr)
)
go
Create procedure DBO.LogInsert ( @Query varchar(255), @time datetime, @duration int, @SessinID int) as
begin
Insert into LogTable ( LogRefnr, LogQuery, logQueryDuration, LogSessionID)
Values (@Query, @time, @duration, @SessinID);
end;
GO
Наразі в цій таблиці близько 45500000 рядків, і я хочу направити журнал до іншої таблиці.
Моя ідея - використовувати наступний сценарій
begin Transaction
exec sp_rename LogTable, LogTableOld;
CREATE TABLE dbo.LogTable(
LogRefnr int IDENTITY(46000000, 1) NOT NULL, -- greater than select max(LogRefnr) from LogTableOld
LogQuery varchar(255) NOT NULL,
LogTime datetime NOT NULL,
logQueryDuration int NULL,
LogSessionID int NULL,
CONSTRAINT PK_Log2 PRIMARY KEY CLUSTERED (LogRefnr);
)
go
sp_recompile LogTable;
go
Commit;
Чи працює це і має мінімальний вплив на інші процедури, що викликають LogInsert?
2
Sp_recompile вам не потрібен. Кеш процедур для будь-яких об'єктів, які використовують об'єкт dbo.LogTable, автоматично закінчується, коли ви перейменовуєте об'єкт.
—
mrdenny