對於我們,我們需要通過一些測試來運行我們的程序更爲關鍵的一個項目設置與非常大的數據庫。我們正常的最高平均值約爲100,000條,但我們希望測試大約18-24,000,000條條目。複製一個SQL入門百萬的次縮放測試
現在我可以進入它的細節,但我認爲這是我最好從高位問:什麼是複製數據到規模的最好方法?採取一個小集(3個條目)並複製到18,000,000個,或者我應該使用一個具有100,000個記錄的現有分貝並複製那麼少次?
有確實需要一些數據編輯,在每個條目都需要有一列中唯一的GUID,而在另一個友好名稱。
我有一個存儲過程,我從一個前同事的存檔清理,它需要一個記錄,並將一個不完整的數字添加到兩個唯一列的末尾,然後關閉並再次運行。需要4個小時才能達到6,000,000個,我認爲這大概是14GB。我們只用它來記錄多達100,000條記錄,但效果相當不錯。
但是這個尺寸看起來它鎖定了(SQL Management Studio中崩潰),情況真的很慢,或只是什麼都不做,但仍然就像是(無CPU活動)。日誌文件變得很大,如14GB數據庫文件的20GB。
這裏是存儲過程,因爲它是現在:
USE [DBNAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[PERSON_Insert]
@LoopCount int,
@PersonId varchar(50)
AS
BEGIN
DECLARE @intFlag INT ,@P_FIELD1 Varchar(50),@T_FIELD2 Varchar(10),@T_FIELD3 numeric(11,0), @T_FIELD4 numeric(11,0), @T_FIELD5 varchar(8000), @T_FIELD6 numeric(20,0)
,@TR_FIELD7 Varchar(10),@TR_FIELD8 numeric(11,0), @TR_FIELD9 numeric(11,0), @TR_FIELD10 varchar(8000), @TR_FIELD11 numeric(20,0)
SET @intFlag = 1
select @P_FIELD1=dbo.MyRegistratonNo(@PersonId)
select @T_FIELD2=dbo.MyENGINETYPE(@PersonId,1)
select @T_FIELD3=dbo.MyTEMPLATEID(@PersonId,1)
select @T_FIELD4=dbo.MyTEMPLATETYPE(@PersonId,1)
select @T_FIELD5=dbo.MyTEMPLATEFEATURE(@PersonId,1)
select @T_FIELD6=dbo.MyTEMPLATESIZE(@PersonId,1)
select @TR_FIELD7=dbo.MyENGINETYPE(@PersonId,2)
select @TR_FIELD8=dbo.MyTEMPLATEID(@PersonId,2)
select @TR_FIELD9=dbo.MyTEMPLATETYPE(@PersonId,2)
select @TR_FIELD10=dbo.MyTEMPLATEFEATURE(@PersonId,2)
select @TR_FIELD11=dbo.MyTEMPLATESIZE(@PersonId,2)
WHILE (@intFlag <[email protected])
BEGIN
INSERT INTO [PERSON]
([PERSONID],[REGISTRATIONNO] , [TYPEID] , [REGISTEREDDATE] , [STATUS])
VALUES(@PersonId+CAST(@intFlag AS varchar(50)),@P_FIELD1+CAST(@intFlag AS varchar(50)),1,GETDATE(),1)
INSERT INTO [TEMPLATES]
([PERSONID],[ENGINETYPE] , [TEMPLATEID] , [TEMPLATETYPE] , [TEMPLATEFEATURE] , [TEMPLATESIZE])
VALUES(@PersonId+CAST(@intFlag AS varchar(50)),@T_FIELD2,@T_FIELD3,@T_FIELD4,@T_FIELD5,@T_FIELD6)
INSERT INTO [TEMPLATES]
([PERSONID],[ENGINETYPE] , [TEMPLATEID] , [TEMPLATETYPE] , [TEMPLATEFEATURE] , [TEMPLATESIZE])
VALUES(@PersonId+CAST(@intFlag AS varchar(50)),@TR_FIELD7,@TR_FIELD8,@TR_FIELD9,@TR_FIELD10,@TR_FIELD11)
PRINT @P_FIELD1 +CAST(@intFlag AS varchar(50))
SET @intFlag = @intFlag + 1
END
END
也有一些標量函數,使用其中的六個,並都遵循相同的格式:
USE [DBNAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[MyENGINETYPE]
(@PersonID varchar(50),@TemplateID numeric(11,0))
RETURNS varchar(10)
AS
BEGIN
DECLARE @Return varchar(10)
SELECT @Return = (SELECT ENGINETYPE FROM TEMPLATES WHERE [email protected] AND [email protected])
RETURN @Return
END
保持記住我是一個輕型腳手架/ webdev,並不是真正的dba或擅長這樣的企業級數據。這就是說這是至少一個體面的方式去做,或者我用這種笨重的東西謀殺這臺服務器?我們只有SQL Server 2012,沒有第三方工具或其他任何東西,但我們希望保持這種狀態。
任何例子都會很棒,超過預先!