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
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 の場合はこんな感じです。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table_A](
[A] [nvarchar](50) NOT NULL
) ON [PRIMARY]
GO
Table_G の場合はこんな感じです。
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
お試しクッキング
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
本番クッキング
テーブル 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
10 x 10 x 10 x 10 x 10 x 10 x 10 = 10000000
のレコードが生成されました。