ฉันมีตารางเข้าสู่ระบบที่แทรกทั้งหมดจะทำโดยขั้นตอนการจัดเก็บเดียว
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
ขณะนี้มีแถวประมาณ 45,500,000 แถวในตารางนั้นและฉันต้องการบันทึกโดยตรงไปยังตารางอื่น
ความคิดของฉันคือการใช้สคริปต์ต่อไปนี้
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