次の方法で共有


Azure Synapse Analytics の専用 SQL プールに T-SQL ループを使用する

この記事には、T-SQL ループを使用してカーソルを置き換える専用 SQL プール ソリューション開発のヒントが含まれています。

WHILE ループの目的

Azure Synapse の専用 SQL プールでは、ステートメント ブロックを繰り返し実行するための WHILE ループがサポートされています。 この WHILE ループは、指定された条件が true である限り、またはコードが BREAK キーワードを使用してループを明示的に終了するまで継続します。

ループは、SQL コードで定義されているカーソルを置き換える場合に便利です。 さいわい、SQL コードで記述されるほとんどすべてのカーソルは、高速で読み取り専用です。 したがって、WHILE ループは、カーソルを置き換える場合に最適な代替手段です。

専用 SQL プール内のカーソルの置き換え

しかし、いきなり始める前に、「このカーソルはセットベースの操作を使って書き直すことができるか」と自問してみる必要があります。

多くの場合、答えははいであり、多くの場合、最良のアプローチです。 セットベースの操作は、多くの場合、反復的な行単位のアプローチよりも高速に実行されます。

高速順方向の読み取り専用カーソルは、ループ構造に簡単に置き換えることができます。 次の例は単純な例です。 このコード例では、データベース内のすべてのテーブルの統計を更新します。 ループ内のテーブルを反復処理することで、各コマンドが順番に実行されます。

最初に、個々のステートメントを識別するために使用される一意の行番号を含む一時テーブルを作成します。

CREATE TABLE #tbl
WITH
( DISTRIBUTION = ROUND_ROBIN
)
AS
SELECT  ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Sequence
,       [name]
,       'UPDATE STATISTICS '+QUOTENAME([name]) AS sql_code
FROM    sys.tables
;

次に、ループを実行するために必要な変数を初期化します。

DECLARE @nbr_statements INT = (SELECT COUNT(*) FROM #tbl)
,       @i INT = 1
;

次に、それらを一度に 1 つずつ実行するステートメントをループします。

WHILE   @i <= @nbr_statements
BEGIN
    DECLARE @sql_code NVARCHAR(4000) = (SELECT sql_code FROM #tbl WHERE Sequence = @i);
    EXEC    sp_executesql @sql_code;
    SET     @i +=1;
END

最後に、最初の手順で作成した一時テーブルを削除します。

DROP TABLE #tbl;

次のステップ

開発についてのその他のヒントは、開発の概要に関するページをご覧ください。