SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Archive for 3月 9th, 2019

SQL Server の OPTION(RECOMPILE)による実行プランの変化について

without comments

SQL Server では、「OPTION (RECOMPILE)」のクエリヒントを使用することで、明示的に SQL ステートメントをリコンパイルすることができます。
パラメータースニフィングにより、パラメーターを使用したクエリで、実行タイミングによって大きく件数が変わる場合などに、コンパイルによる再利用効率とのトレードオフを考慮してクエリヒントをケースが多いと思いますが、それ以外でも RECOMPILE のヒントによって動作が変更されるケースがあります。
RECOMPILE の説明には次のような記載があります。

RECOMPILE
SQL Server データベース エンジン に、クエリの新しい一時的なプランを生成し、クエリ実行完了直後にそのプランを破棄するよう指示します。 生成されたクエリ プランは、RECOMPILE ヒントを指定しないで同じクエリを実行したときにキャッシュに格納されるプランを置き換えません。 RECOMPILE を指定しない場合、データベース エンジンはクエリ プランをキャッシュして再利用します。 クエリ プランをコンパイルする場合、RECOMPILE クエリ ヒントは、クエリ内のローカル変数の現在値を使用します。 クエリがストアド プロシージャ内にある場合は、任意のパラメーターに渡された現在値を使用します。

ポイントとなるのが「クエリ プランをコンパイルする場合、RECOMPILE クエリ ヒントは、クエリ内のローカル変数の現在値を使用します。 クエリがストアド プロシージャ内にある場合は、任意のパラメーターに渡された現在値を使用します。」の個所ですね。
この辺の動作をすっかり忘れていて、処理時間に大きく影響が出たクエリを作ってしまったので、実際のクエリをベースに確認していきます。
Read the rest of this entry »

Written by Masayuki.Ozawa

3月 9th, 2019 at 6:25 pm

Posted in SQL Server

Tagged with

SQL Server 2017 (Windows / Linux) の Unicode テキストの BULK INSERT / bcp での取り込みについて

without comments

SQL Server では、BULK INSERT ステートメント / bcp ユーティリティ 等を使用してテキストを取り込むことができます。
SQL Server 2017 の on Windows / on Linux 両方で、これらの方法を使用することができるのですが、使用する OS によって多少動作の違いが出てきます。
これらの動作について確認する機会がありましたのでまとめておきたいと思います。
最初にざっくりとした結果を書いておきますと、

  • SQL Server 2017 on Linux の BULK INSERT については、UTF-8 の取り込みができず、UTF-16 BOM あり (UTF-16 BE / UTF-16 LE) であれば可能であった
  • bcp については、Windows / Linux ともに、UTF-8 / UTF-16 LE / UTF-16 BE / UTF-16LE を取り込むことができた

Read the rest of this entry »

Written by Masayuki.Ozawa

3月 9th, 2019 at 2:48 pm

Posted in SQL Server

Tagged with ,