【问题标题】:How to insert Huge dummy data to Sql server如何将巨大的虚拟数据插入 Sql 服务器
【发布时间】:2015-04-13 10:31:28
【问题描述】:

目前开发团队已经完成了他们的应用,作为测试人员需要在20张表中插入1000000条记录,进行性能测试。

我浏览了表格,实际上所有表格之间都有关系。

要将这么多的虚拟数据插入表中,我需要在很短的时间内完全理解应用程序,以便此时我也没有虚拟数据。

SQL server有没有办法插入这么多数据插入可能性。

请分享方法。

  1. 目前我正在计划在 excel 中创建虚拟数据的可能性,但在这里我不确定表之间的关系。
  2. 在 Google 中发现 SQL profiler 会提供执行顺序,但等待访问者对此进行分析。
  3. 我在 Google 中发现的另一件事是可以使用 red-gate 工具。

是否有任何脚本或任何其他解决方案可以简单地执行此任务。

如果这是一个常见问题,我非常抱歉,我是第一次在 SQL 实时场景中工作。但我有 SQL 知识。

【问题讨论】:

  • 正在寻找 BulkInsert?
  • @yog241:它是批量插入,但数据必须自动生成
  • 根据您拥有多少时间和知识,我会创建一个单元测试方法,该方法调用应用程序的相同 api 来创建新实体,并在循环中执行 1.000.000 次,或者我会使用 SQL Profiler 来捕获应用程序生成的插入,然后从 ID 中抽象出这些插入,然后将这些插入放入 SQL Server 中的 while 循环中。我过去也一直在寻找这样的数据填充工具,我想我确实在网上找到了一些东西,但不确定它如何与表之间有很多关系的复杂数据库模式一起工作......
  • 你看过msdn.microsoft.com/en-us/library/aa833267(v=vs.100).aspxmsdn.microsoft.com/en-us/library/dd193262(v=vs.100).aspx。数据生成工具是 Visual Studio 2010 中数据库项目的一部分
  • @jesus:这个工具看起来不错,但在专业版中是不可能的。

标签: c# sql-server dummy-data


【解决方案1】:

为什么您不在 SQL Server 中生成这些记录。这是一个生成 1000000 行表的脚本:

DECLARE @values TABLE (DataValue int, RandValue INT)

;WITH mycte AS
(
SELECT 1 DataValue
UNION all
SELECT DataValue + 1
FROM    mycte   
WHERE   DataValue + 1 <= 1000000
)
INSERT INTO @values(DataValue,RandValue)
SELECT 
        DataValue,
        convert(int, convert (varbinary(4), NEWID(), 1)) AS RandValue
FROM mycte m 
OPTION (MAXRECURSION 0)


SELECT 
        v.DataValue,
        v.RandValue,
        (SELECT TOP 1 [User_ID] FROM tblUsers ORDER BY NEWID())
FROM    @values v

在@values 表中,您将有一些随机的 int 值(列 RandValue),可用于为其他列生成值。您还有获取随机外键的示例。

【讨论】:

    【解决方案2】:

    下面是我编写的一个简单的过程,用于将数百万条虚拟记录插入表中,我知道它不是最有效的方法,但它可以达到一百万条记录的目的,大约需要 5 分钟。您需要传递执行过程时需要生成的记录数。

    IF  EXISTS (SELECT 1 FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[DUMMY_INSERT]') AND type in (N'P', N'PC'))
    BEGIN
        DROP PROCEDURE  DUMMY_INSERT
    END
    GO
    CREATE PROCEDURE DUMMY_INSERT (
    @noOfRecords INT
    )
    AS
    BEGIN
    
    DECLARE @count int
    SET @count = 1;
    
    WHILE (@count < @noOfRecords)
    BEGIN
        INSERT INTO [dbo].[LogTable] ([UserId],[UserName],[Priority],[CmdName],[Message],[Success],[StartTime],[EndTime],[RemoteAddress],[TId])
         VALUES(1,'user_'+CAST(@count AS VARCHAR(256)),1,'dummy command','dummy message.',0,convert(varchar(50),dateadd(D,Round(RAND() * 1000,1),getdate()),121),convert(varchar(50),dateadd(D,Round(RAND() * 1000,1),getdate()),121),'160.200.45.1',1);
    
         SET @count = @count + 1;
    END
    END
    

    【讨论】:

      【解决方案3】:

      您可以将光标用于重复数据:

      例如这个简单的代码:

      Declare @SYMBOL nchar(255), --sample V
               @SY_ID     int         --sample V
      Declare R2 Cursor
          For SELECT  [ColumnsName]
              FROM    [TableName]
          For Read Only;
      Open R2
      Fetch  Next From R2 INTO @SYMBOL,@SY_ID
          While (@@FETCH_STATUS <>-1 )
              Begin
                  Insert INTO [TableName] ([ColumnsName])
                      Values              (@SYMBOL,@SY_ID)
                  Fetch  Next From R2 INTO @SYMBOL,@SY_ID
              End
      Close R2
      Deallocate R2
      /*wait a ... moment*/
      SELECT COUNT(*)                  --check result
              FROM [TableName]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多