LoginSignup
0
0

More than 1 year has passed since last update.

3分クッキング cross join で1000万レコードを生成

Last updated at Posted at 2021-10-14

SQL の cross join (直積)を使って1000万件のレコードを作る実験をしてみます。
大量のレコードを短時間で作成したいときのために。

環境

OS:Windows 10 Home 64 ビット オペレーティング システム
CPU:Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz 1.80 GHz
RAM:16.0 GB
DB:Microsoft SQL Server 2012
(SQL Server Management Studio 11.0.2100.60)

下ごしらえ1

出力先テーブルを作っておく。
image.png

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table_ABCDEFG](
    [A] [nvarchar](50) NOT NULL,
    [B] [nvarchar](50) NOT NULL,
    [C] [nvarchar](50) NOT NULL,
    [D] [nvarchar](50) NOT NULL,
    [E] [nvarchar](50) NOT NULL,
    [F] [nvarchar](50) NOT NULL,
    [G] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Table_ABCDEFG] PRIMARY KEY CLUSTERED 
(
    [A] ASC,
    [B] ASC,
    [C] ASC,
    [D] ASC,
    [E] ASC,
    [F] ASC,
    [G] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

下ごしらえ2

入力用の7テーブル(Table_A, Table_B, ... , Table_G)を作り、それぞれ10レコードのデータを用意する。

Table_A の場合はこんな感じです。

image.png

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table_A](
    [A] [nvarchar](50) NOT NULL
) ON [PRIMARY]

GO

image.png

Table_G の場合はこんな感じです。

image.png

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table_G](
    [G] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Table_G] PRIMARY KEY CLUSTERED 
(
    [G] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

image.png

これで下ごしらえができました。
image.png

お試しクッキング

1000万件を取得するためのSQLを実行してみます。
1分17秒で終了しました。

select A.A, B.B, C.C, D.D, E.E, F.F, G.G
from Table_A A
cross join Table_B B
cross join Table_C C
cross join Table_D D
cross join Table_E E
cross join Table_F F
cross join Table_G G

image.png
(中略)
image.png

本番クッキング

テーブル Table_ABCDEFG に出力させてみます。
2分56秒で終了しました。

insert into Table_ABCDEFG (A, B, C, D, E, F, G)
select A.A, B.B, C.C, D.D, E.E, F.F, G.G
from Table_A A
cross join Table_B B
cross join Table_C C
cross join Table_D D
cross join Table_E E
cross join Table_F F
cross join Table_G G

image.png

10 x 10 x 10 x 10 x 10 x 10 x 10 = 10000000
のレコードが生成されました。

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0