本投稿は SQL Server 2012 RC0 (Release Candidate) での現象となります。
RTM 版の動作について記載したものではありません。
昨日、SQL Server 2012 RC0 の データベースエンジン チューニング アドバイザ (Database Engine Tuning Advisor : DTA) を起動したところエラーが発生し、DTA を実行することができませんでした。
なんでだろうと思って調べたことを残しておきたいと思います。
# 英語がものすごい苦手なので、Bing Translator さんに翻訳こんにゃくしてもらい、Connect に報告してみました。
■DTA が起動できない原因
DTA を起動して、インスタンスに接続をしたところ以下のエラーが。
ストアド プロシージャ ‘msdb..sp_DTA_help_session’ が見つかりませんでした。 (Microsoft SQL Server、エラー: 2812) |
DTA の初回起動時には初期化が行われ、msdb にテーブルやストアドプロシージャが作成されます。
msdb を確認したところ、確かにメッセージで表示されているストアドプロシージャは存在しませんでした。
さて、なんでだろうと思って調べてみたところ、照合順序に _SC を設定していると発生する現象のようでした。
今回はインストール時に [Japanese_XJIS_100_CI_AS_SC] を照合順序として設定しています。
そのため、msdb の照合順序も上記のものになります。
_SC の照合順序を使用している場合、ntext を使用することができないようです。
初期化時に msdb で作成されるオブジェクトには ntext が含まれており、一部のオブジェクトの作成時にで以下のエラーが発生しています。
メッセージ 4188、レベル 16、状態 0、プロシージャ sp_DTA_add_session、行 1 |
このエラーが発生しているため、オブジェクトが作成できず DTA を実行することができていないようです。
現状、_SC を使用している場合の回避策としては初期化時に作成されるオブジェクトを ntext ではなく nvarchar(max) を使用して事前に作成することで DTA を起動することができます。
ただし無理やり作成しているので挙動がいまいちでした…。
# うまくワークロードの解析ができず DTA が落ちてしまいました。
手動でオブジェクトを作成した際に使用したスクリプトは以下に保存しておきました。
非サポートですが興味ある方がいらっしゃったら中を見ていただければと。
SQL Server 2012 RC0 DTA 用スクリプト
深く追っていないので起動してみたいというニーズでしか使用することができないですが。
作成したオブジェクトを削除したい場合は以下の技術情報のクエリを使用すると良いかと。
SQL Server 2005 のデータベース チューニング アドバイザ (DTA) クリーンアップ スクリプトの説明
SQL Server 2012 ではオブジェクトが増えていますので、
if exists (select name from msdb.dbo.sysobjects where name = ‘sp_DTA_end_xmlprefix’ and type = ‘P’) |
RC 0 で DTA を実行したいときは _SC 以外の照合順序を使用しておいた方が良さそうです。
ntext を使用している場合に照合順序に気を付ける必要があるというのは勉強になりました。
下位バージョンから移行する際には注意が必要そうですね。