ラベル SQL Server 2008 の投稿を表示しています。 すべての投稿を表示
ラベル SQL Server 2008 の投稿を表示しています。 すべての投稿を表示

2011年1月5日水曜日

SQL Serverのクエリプランをクエリと一緒に取得する便利スクリプト

元ネタはこちら:SQL SERVER – Get Query Plan Along with Query Text and Execution Count

稼働中のSQL Serverの状態をチェックしたくなることはままあることで、パフォーマンスを計る上でも各オブジェクトのクエリプランやら実行回数を知っておくのは悪くない。というわけで下記クエリを実行すると下図の結果が得られる。
(Where句をいじることで必要なオブジェクトのみ参照もできる)

SELECT cp.objtype AS ObjectType,
OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
cp.usecounts AS ExecutionCount,
st.TEXT AS QueryText,
qp.query_plan AS QueryPlan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
--WHERE OBJECT_NAME(st.objectid,st.dbid) = 'YourObjectName'

上記のクエリからこういう結果がでる。

上図でQueryPlanのリンクをクリックすると下図のクエリプランが表示される。

2010年3月24日水曜日

SQL Server 2008で初めてDBをリストアしたときの罠

自分のPCに環境を構築するさいにDBのバックアップファイル(.bak)を受け取ってリストアして利用することがままあると思う。そんな際にログインユーザ周りでうまくいかないときがあるので解説する。

初めてDBをバックアップファイルからリストアしたときに高確率で遭遇するのが、そのDBのユーザでログインできないという現象だ。下記に事例をあげる。

<例>
SouthWindというDBをリストアしたとする。SouthWindのユーザとしてdb_ownerのhogeがいる。開発中はhogeを使ってTableのデザイン変更などを行いたい。そのため、<Your PC>/Security/Loginsにhogeを追加しDefault databaseをSouthWindとする。しかし、hogeでいざログインしようとするとDefault databaseがうんたらかんたらというエラーが出てログインできない。WTF。

SouthWindのUsersにhogeが追加されていないせいかとあたりをつけて、<Your PC>/SouthWind/Security/Usersを参照するもすでにhogeがいる。すでにhogeがいるのにログインできない。WTF again。

ということがまま起こるのだが、これはLoginsのhogeと<Your PC>/SouthWind/Security/Users配下のhogeの紐付けが切れてしまっているために起こる。なので下記のクエリを実行して権限をむりくり付与してやればよい。

ALTER AUTHORIZATION ON DATABASE::SouthWind TO hoge

これで問題なくログインできるはずだ。また、まれにログインはできるがデータベースダイアグラムを作成できない場合がある。その場合も上記のクエリを実行すると解決する。