SQL Azure のデータベースは複数作成することができます。
見かけ上は一つのサーバーに複数のデータベースが作成されているように管理されていますが、実際には複数の SQL Server インスタンスに分かれて作成がされています。
# アクセスポイントとしては一つの論理サーバー名となりますが、データベース単位に異なる SQL Server インスタンスにホストされている形になっています。
詳細に関しては SQL Azure と言えばこのブログ。蒼の王座さんの以下の記事が参考になります。
TechEDNAセッション:SQL Azureパフォーマンスの考察とトラブルシューティングまとめ
Inside SQL Azure ? データベース
また、TechNet Wiki の Inside SQL Azure の [Logical Databases on a SQL Azure Server] にも記載されています。
Inside SQL Azure
# TechNet Wiki の情報は Kalen Delaney さんが書かれているということを最近知りました。
TechNet の以下の情報にも記載がありますね。
SQL Azure におけるデータベースとログインの管理
今回の投稿では SQL Azure にはどのようなデータベースが存在しているのかを確認してみたいと思います。
■存在するデータベースの確認
システムデータベースである [master] と ユーザーデータベースである [TESTDB] [TESTDB2] が存在していることが確認できます。
master に接続した状態で [sys.databases] を検索してみます。
同様の結果が取得できますね。
それでは、[DB_NAME] を使用してデータベース名を取得するとどうなるでしょう。
以下のクエリを実行してみます。
DECLARE @tmp table( SELECT * FROM @tmp WHERE db_name IS NOT NULL |
master に接続している状態で DB_ID() を実行するとデータベース ID は 79 が返ってきました。
通常、master データベースは db_id = 1 となるのですが、SQL Azure では master データベースに接続した場合、この master データベースではなくもう一つの master データベースに接続がされるようですね。
# ユーザーデータベースとしての master に接続をしているというイメージなのかもしれないですね。
また、msdb データベースが存在していないことも確認ができます。
SQL Agent が使用できないので、msdb が存在していなくても問題はないのかなと。
model に関してはユーザーデータベースの作成と起動時の tempdb の作成時に使用しますので、これは必要なのでしょうね。
それでは、ユーザーデータベースに対して接続をして同じクエリを実行してみたいと思います。
まずは sys.databases の値から。
ユーザーデータベースに接続した場合、自データベースと master データベースしか、sys.databases には格納されていません。
他のユーザーベースは認識がされていないため、複数のデータベースをまたいだクエリを実行することができないということになるようですね。
それでは DB_ID でデータベースの情報を取得してみたいと思います。
先ほどは master が 2 個ありましたが今回作成したユーザーデータベースが認識されています。
この時の DB_ID の値ですが、sys.databases の値とは異なっているようです。
この辺は TDS Gateway が入っているからなのかな~と勝手に想像しているのですが、SQL Azure を使用する場合、DB_ID() の値はシステムテーブルや DMV の値とは異なってきそうなので、クエリで使うときは、sys.databases から database_id を取得する方が良さそうですね。
# ロックやラッチ Wait の表示は、DB_ID ではなく、sys.databases のデータベース ID で表示されていたはずです。
今回の環境ではもう一つユーザーデータベースを作成しているのでこちらでも情報を取得してみたいと思います。
先ほどと結果はほとんど同じですね。
自データベースと master 以外は認識をしていないようです。
DB_ID だけでなく @@SPID の値もオンプレミスの SQL Server と少し違ってくるみたいですね。
通常 SSMS のタブ上の数字 (() 内の数字) はセッション ID が表示されます。
上記のタブの場合、セッション ID が207 になるかと思い、[@@SPID] を取得してみると
[197] となっていることが確認できます。
Session ID に関しては @@SPID で取得できる値が DMV 上で認識されているセッション ID になりますので、SQL Azure に接続している場合はタブからではなく、@@SPID からセッション ID を取得するのが良さそうですね。
簡単ではありますが SQL Azure のデータベースの一覧を調べてみました。
SQL Azure のデータベースは master / tempdb / model / ユーザーデータベースの構成になるみたいですね。