Sql-Server
如何將假數據填充/插入到 MS Sql Server
我正在嘗試測試MS Sql Server 的一些配置設置,
FILEGROUP
為此我希望填滿我的FILEGROUP
磁碟,以便它開始填充 2ndFILEGROUP
。我剛剛創建了一個虛擬表,
PRIMARY FILEGROUP
並有以下簡單的 sql 來插入一些數據。它只是花了很長時間,慢慢地填充它。有沒有更好的方法來快速填充一個真正佔用大量硬碟空間的垃圾數據表?--IF OBJECT_ID('dbo.__RandomData', 'U') IS NOT NULL --BEGIN -- DROP TABLE dbo.__RandomData; -- CREATE TABLE dbo.__RandomData ( -- RowId INT IDENTITY(1,1) NOT NULL, -- SomeInt INT, -- SomeBit BIT, -- SomeVarchar VARCHAR(10), -- SomeDateTime DATETIME, -- SomeNumeric NUMERIC(16,2) ) --END --GO DECLARE @count INT SET @count = 1 WHILE @count <= 1000000 BEGIN INSERT INTO dbo.__RandomData SELECT @count, CASE WHEN DATEPART(MILLISECOND, GETDATE()) >= 500 THEN 0 ELSE 1 END [SomeBit], CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) [SomeVarchar], DATEADD(MILLISECOND, (ABS(CHECKSUM(NEWID())) % 6000) * -1, DATEADD(MINUTE, (ABS(CHECKSUM(NEWID())) % 1000000) * -1, GETDATE())) [SomeDateTime], (ABS(CHECKSUM(NEWID())) % 100001) + ((ABS(CHECKSUM(NEWID())) % 100001) * 0.00001) [SomeNumeric] SET @count += 1 END
在 sys.columns 之間進行 CROSS JOIN,使用相同的 2、3 或 4 次。有一個 TOP,有盡可能多的行。使用它作為 INSERT … SELECT 的基礎。
CREATE TABLE mytable(c1 int identity(1, 1), c2 char(10)) INSERT INTO mytable SELECT TOP(1000) 'Hello' FROM sys.columns AS a CROSS JOIN sys.columns AS b CROSS JOIN sys.columns AS c
交叉連接是一個經典的技巧。在兩個表之間進行交叉連接,每個表有 1000 行,結果中有 1,000,000 行。使用 3 個表,您有 1,000,000,000 行。您可以為這些目的創建一些“數字”表,例如其中包含 1000 行。或者,快速而骯髒地使用一些您知道存在的視圖,其中包含相當數量或行(如 sys.columns)。