簡體   English   中英

如何在MS SQL Server中填充具有500萬行的表?

[英]How to populate a table with 5 million rows in MS SQL Server?

我正在開發一個應在5,760,000行中的char(26)列中找到26個字母代碼的應用程序。 我需要知道需要多長時間。 我正在使用MS SQL Server 2012 Express。

我有一個只有一個表myTable的數據庫:

Idcolumn integer  
CodeColumn char(26)  
DateAndTimeColumn datetime  
  • 列“ CodeColumn”具有索引。
  • IdColumn只是整數ID。
  • CodeColumn具有“ 00592098715648275649283746”格式(這是一個示例)。
  • DateAndTimeColumn是一個時間戳。

我想用數據填充該表以進行一些測試,並找出從數據庫中獲得答案要花費多長時間。 我不知道如何編寫適當的tsql語句,以用576萬行填充我的表。 特別是第二列很長。 如何填充表格以填充表格?

假設我使用statement時數據應該像這樣

SELECT IdColumn, CodeColumn, DateAndTimeColumn FROM myTable;

輸出:

1   00000000000000000000000001  2014-11-19 15:46:50.843
2   00000000000000000000000002  2014-11-19 15:46:54.310
3   00000000000000000000000003  2014-11-19 15:46:56.060

依此類推...直到576萬行。

我怎樣才能做到這一點?

;WITH Numbers AS
(
    SELECT TOP (5760000) 
              IdColumn = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id]))
    FROM sys.all_objects AS s1 
    CROSS JOIN sys.all_objects AS s2
    CROSS JOIN sys.all_objects AS s3
)
INSERT INTO dbo.YourTable
SELECT  IdColumn,
        RIGHT(REPLICATE('0',26)+CONVERT(VARCHAR(26),IdColumn),26) CodeColumn,
        GETDATE() DateAndTimeColumn 
FROM Numbers;

這是使用Lamak出色示例的另一種方法。 唯一的區別是,這將創建一個零讀取的1000萬行cte。 當您使用sys.all_objects時,由於所有I / O,它會變得非常慢。

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), 
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), 
    E6(N) AS (SELECT 1 from E4 a, E2 b, E1 c),
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E6
    )

INSERT INTO dbo.YourTable
SELECT  IdColumn,
        RIGHT(REPLICATE('0',26)+CONVERT(VARCHAR(26),IdColumn),26) CodeColumn,
        GETDATE() DateAndTimeColumn 
FROM cteTally
where cteTally.N <= 5760000

與Lamak答案非常相似,這將不取決於您的數據庫結構:

;WITH Numbers AS
(
    SELECT 1 AS id UNION SELECT 2 UNION SELECT 3 UNION
    SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION
    SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION
    SELECT 10
),
Joins AS
(
    SELECT TOP (5760000) 
              IdColumn = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[id]))
    FROM Numbers AS s1 --10
    CROSS JOIN Numbers AS s2 --100
    CROSS JOIN Numbers AS s3 --1.000
    CROSS JOIN Numbers AS s4 --10.000
    CROSS JOIN Numbers AS s5 --100.000
    CROSS JOIN Numbers AS s6 --1.000.000
    CROSS JOIN Numbers AS s7 --10.000.000
)

INSERT INTO #YourTable
SELECT  IdColumn,
        RIGHT(REPLICATE('0',26)+CONVERT(VARCHAR(26),IdColumn),26) CodeColumn,
        GETDATE() DateAndTimeColumn 
FROM Joins;

它只是生成一個從1到10的數字列表,然后一直交叉連接到10 ^ 7。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM