JDBC で接続をする際のコネクションプールで使用するライブラリとして HikariCP があります。
HikariCP を使用して SQL Server に接続をする際の挙動について、いくつか調査する必要があったのでその時に確認した内容を残しておきたいと思います。
SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿
JDBC で接続をする際のコネクションプールで使用するライブラリとして HikariCP があります。
HikariCP を使用して SQL Server に接続をする際の挙動について、いくつか調査する必要があったのでその時に確認した内容を残しておきたいと思います。
Build 2024 が開催されています。
キーノートについては次の情報から確認できます。
SQL Server についてはアップデートはなかったのですが、Azure SQL Database についてはアップデートがアナウンスされていますのでまとめておきたいと思います。
SQL Server ベースの環境に対しての CI/CD で活用できるツールとして SqlPackage があります。
Visual Studio Code の Dev Container (開発コンテナー) 上に SqlPackage の実行環境を作成しようかなと思って試してみました。
SqlPackage に問題がある場合は DacFx のリポジトリ から Issue で報告ができます。
前回の Update: SQL Server / SQL Database Update (2024/01~2024/03/03)
前回の投稿以降の Update をまとめておきたいと思います。
SQL Server 2019 以降のクエリストアでは、カスタムキャプチャの設定を行うことができるようになりました。これにより、クエリのキャプチャモードを「ALL」「AUTO」以外に「CUSTOM」で設定することができるようになります。
「CUSTOM」を使用した場合、キャプチャされるクエリの条件を従来より柔軟に設定することができます。
「CUSTOM」を設定した場合の設定観点について少しふれておきたいと思います。
クエリストアの活用については次のドキュメントが参考になります。
SSMS は接続情報として入力した内容が保存されており、接続を行おうとした場合に再利用することができます。
自サーバー上の SQL Server にのみ接続をしているのであれば、この情報が増えるということはあまりないですが、クライアントからいくつかのサーバーに接続している場合にはこの情報が増えていき、今は接続が不要になったサーバーの情報も残った状態となっていることがあります。
接続の情報は SSMS の構成ファイルである 「UserSettings.xml」に記録が行われており、この XML から接続情報を削除することで、表示が行われなくなります。
ファイルは「%USERPROFILE%\AppData\Roaming\Microsoft\SQL Server Management Studio」に SSMS のバージョンごと (18.0 / 19.0 / 20.0 等のディレクトリ) に保存されています。
不要となった情報は
することでクリアすることができます。
XML の階層としては「SqlStudio > SSMS > ConnectionOptions > ServerTyes > Element」配下に保存されています。
UserSettings.xml は情報量が多い XML ですので、メモ帳で修正するよりは、Visual Studio Code で XML を編集して、不要となったサーバー情報の Element をブロック単位で削除したほうが効率が良いかと。
SQL Server では フィルター選択されたインデックス (フィルター化インデックス) というインデックスを作成することができます。
このインデックスはインデックスの作成を行う際に、以下のクエリのように、インデックス作成時に WHERE 句を指定することで、特定の範囲のデータのみが含まれたインデックスを作成することができます。
CREATE NONCLUSTERED INDEX [NCIX_accesslog2_01] ON [frontdoor].[accesslog2] ( [time] ASC ) WHERE ([time]>='2020-01-01' AND [time]<'2021-01-01')
フィルター選択されたインデックスは、特定のデータ範囲のみがインデックスに含まれますので次のようなメリットがあります。
特定のデータ範囲の検索向けに作成するインデックスとして便利な機能となるのですが、作成したインデックスが使用されるかどうかについては考慮が必要な点がありますので、本投稿で触れておきたいと思います。
フィルター選択されたインデックスの詳細な情報については次のドキュメントが参考となります。
ストアドプロシージャを明示的にリコンパイルさせる方法として ストアド プロシージャの再コンパイル に記載されている sp_recompile を使用するという方法があります。
ストアドプロシージャはコンパイル時に指定されたパラメーターによって実行プランが生成されるため、コンパイル時に指定されたパラメーターが大多数の実行に対してマイノリティな設定の場合、頻繁に実行するクエリに対しては効率の悪い実行プランが生成されることがあります。
このような場合は、ストアドプロシージャをリコンパイルさせることで新しい実行プランを生成することがあります。
このリコンパイルを同時実行性の低下をできるだけ抑えて実行するにはどのような方法が考えられるでしょうか。
SSMS からクエリを実行した場合と、アプリケーションからクエリを実行した場合の違いとして、Qiita で書いた アプリから動かすと遅いが SSMS から動かすと速いのは ARITHABORT の違いという情報の動作を理解する というような動作があります。
SET オプションが異なっていると、異なる実行プランとしてキャッシュが行われるため、SSMS とアプリケーションで同一のオプションを使用するというのが記載した内容となります。
この投稿では、「SET ARITHABORT OFF」を SSMS から実行し、アプリケーションと同一の SET オプションの状態とすることで SSMS とアプリケーションで同一のプランキャッシュを使用していました。
クエリの多重実行と SSMS から実行したクエリで同一のプランキャッシュを使用したかったので「SQLQueryStress」と「SET ARITHABORT OFF に設定した SSMS」でクエリを実行したところ、同一のプランキャッシュが使用されないという事象が発生しました。
そこで、同一の SET オプション以外にどのような要因が同一のプランキャッシュが使用されないことにつながっているのかを確認してみました。
SQL Server ではコンパイル時間を確認する方法としては次のような方法があります。
これらの情報からクエリのコンパイルにかかった時間を確認することができるのですが、値を正しく把握しておかないとコンパイル時間についてミスリードをする可能性があります。