2012-06-23 23 views
2

對於我們,我們需要通過一些測試來運行我們的程序更爲關鍵的一個項目設置與非常大的數據庫。我們正常的最高平均值約爲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,沒有第三方工具或其他任何東西,但我們希望保持這種狀態。

任何例子都會很棒,超過預先!

回答

0

這可能會給你一些想法。

SET NOCOUNT ON重要的是要停止「插入1行」的消息。

也可能是值得考慮的禁用/插入之前刪除索引 - 可能會加快速度。

CREATE TABLE Person 
(
    PersonId UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, 
    Blah1 VARCHAR(50) DEFAULT REPLICATE('X', 50) 
) 
GO 

SET NOCOUNT ON 
GO 

DECLARE @i INT 
SET @i = 1 

WHILE (@i <= 1000000) 
BEGIN 
    INSERT INTO Person DEFAULT VALUES 
    SET @i = @i + 1 
END 

另一種選擇是創建一個平面文件,並使用批量插入。創建平面文件可能需要一些努力,但應該是一次性的 - 除非需要更改數據。