DB

AIモードを利用してSQLを高速化してみた

指定したSQLを高速化したい場合、AIツールを利用すると、修正案をいくつか提案してくれる。
今回は、GoogleのAIモードを利用して、SQLを高速化してみたので、その手順を共有する。

前提条件

下記記事の実装が完了していること。

SQL Serverで一定件数ずつデータ更新とデータ追加をしてみたテーブルデータを更新する際に、テーブル全件を一括更新しようとすると、テーブルロックによりデッドロックが発生する可能性があるため、一定件数...

SQLの高速化

GoogleのAIモードを利用して、SQLを高速化する手順は、以下の通り。

1) WebサイトでGoogleにアクセスする。
https://www.google.com/

2) 質問文を入力し、「AIモード」のボタンを押下する。
SQLの高速化_2

3) 以下のように、AIモードで回答が返ってくる。
SQLの高速化_3

4) 以下のファイルの中身を質問欄に入力し、↑を押下する。
SQLの高速化_4_1

SQLの高速化_4_2 SQLの高速化_4_3

5) 以下のように、AIモードで改善提案を提示してくれることが確認できる。
SQLの高速化_5

エンジニアファーストバナー

6) AIモードで提案された「ループを維持する場合のSQL」を参考に、修正したSQLは、以下の通り。

DECLARE @BatchSize INT = 1000; -- ループさせるなら1000〜5000程度が効率的
DECLARE @AffectedRows INT = 1;
DECLARE @RoopCount INT = 1; -- ループカウント数

WHILE (@AffectedRows > 0)
BEGIN
    -- UPDATEしたIDを直接、履歴テーブルに流し込む
    UPDATE TOP (@BatchSize) dbo.USER_DATA
    SET memo = N'ループカウント数:' + CAST(@RoopCount AS NVARCHAR) + N'、実行時刻:' + FORMAT(GETDATE(), 'yyyy/MM/dd HH:mm:ss')
    OUTPUT inserted.id, GETDATE() INTO dbo.USER_DATA_MEMO_UPD(id, upd_time)
    WHERE memo IS NULL; -- もしくはリセットせず特定の条件で

    SET @AffectedRows = @@ROWCOUNT;
    SET @RoopCount = @RoopCount + 1;
END

7) 6)のSQLを実行した結果は以下の通り。
SQLの高速化_7

8) 6)のSQLを実行後、SQL修正前と同様、USER_DATAテーブルのmemoが、赤枠部分のように更新されていることが確認できる。

SELECT * FROM dbo.USER_DATA ORDER BY id ASC
SQLの高速化_8

9) 6)のSQLを実行後、SQL修正前と同様、USER_DATA_MEMO_UPDテーブルに、赤枠部分のようにデータ追加されていることが確認できる。

SELECT * FROM dbo.USER_DATA_MEMO_UPD ORDER BY id ASC
SQLの高速化_9

要点まとめ

  • 指定したSQLを高速化したい場合、AIツールを利用すると、修正案をいくつか提案してくれる。