ブロッコリーを克服するまでプログラミング

プログラミングとか趣味とかを報告します。

SQLServer :マルチテーブルインサート?っていうの?

すっっっっっっっごいいまさらな話。飛んでくる情報源に対して、淡々とINSERTする処理を高速化したいのだが、飛んでくる情報源がどのテーブルへのINSERTかわからない状態。

ただ、30%くらいの確立で特定テーブルへのINSERTが集中するという状態であったので、SQLServer の マルチテーブルインサート?を試してみた。

 

通常なら飛んでくる情報源に対し、

INSERT INTO TESTDB VALUES(100000, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100001, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100002, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100003, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100004, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100005, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100006, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100007, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100008, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(100009, 0, 0, 0, 0)
INSERT INTO TESTDB VALUES(1000010, 0, 0, 0, 0)

という文章を作成し、カーソルループしていたところを、前後が同一テーブルに対してのINSERTならばつなげて、

 

INSERT INTO TESTDB VALUES

(100011, 0, 0, 0, 0),(100012, 0, 0, 0, 0),(100013, 0, 0, 0, 0),

(100014, 0, 0, 0, 0),(100015, 0, 0, 0, 0),(100016, 0, 0, 0, 0),

(100017, 0, 0, 0, 0),(100018, 0, 0, 0, 0),(100019, 0, 0, 0, 0),

(100020, 0, 0, 0, 0)

となるようにしてみた。

 

前者の実行プランは下記のようなもの。直列動作の当然すぎる結果。

 

f:id:atwtama:20180228224922p:plain

 

 

後者の実行プランは以下のようなもの。テーブルアクセスやINSERTは1度きりでスマート。実環境の速度も速そう。こういうのってきっと落とし穴があるんだろうね。

 

f:id:atwtama:20180228225031p:plain