SE の雑記

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

SQL Server 2012 RC0 で照合順序に _SC を使用していると DTA が実行できない

leave a comment

本投稿は SQL Server 2012 RC0 (Release Candidate) での現象となります。
RTM 版の動作について記載したものではありません。

昨日、SQL Server 2012 RC0 の データベースエンジン チューニング アドバイザ (Database Engine Tuning Advisor : DTA) を起動したところエラーが発生し、DTA を実行することができませんでした。

なんでだろうと思って調べたことを残しておきたいと思います。
# 英語がものすごい苦手なので、Bing Translator さんに翻訳こんにゃくしてもらい、Connect に報告してみました。

■DTA が起動できない原因


DTA を起動して、インスタンスに接続をしたところ以下のエラーが。
image

ストアド プロシージャ ‘msdb..sp_DTA_help_session’ が見つかりませんでした。 (Microsoft SQL Server、エラー: 2812)

DTA の初回起動時には初期化が行われ、msdb にテーブルやストアドプロシージャが作成されます。

msdb を確認したところ、確かにメッセージで表示されているストアドプロシージャは存在しませんでした。
image

さて、なんでだろうと思って調べてみたところ、照合順序に _SC を設定していると発生する現象のようでした。

今回はインストール時に [Japanese_XJIS_100_CI_AS_SC] を照合順序として設定しています。
そのため、msdb の照合順序も上記のものになります。

_SC の照合順序を使用している場合、ntext を使用することができないようです。
初期化時に msdb で作成されるオブジェクトには ntext が含まれており、一部のオブジェクトの作成時にで以下のエラーが発生しています。

メッセージ 4188、レベル 16、状態 0、プロシージャ sp_DTA_add_session、行 1
列またはパラメーター ‘@TuningOptions’ は、型が ‘ntext’ で照合順序が ‘Japanese_XJIS_100_CI_AS_SC’ です。従来の LOB 型では、コードポイントが U+10000 以上の Unicode 補助文字はサポートされていません。列またはパラメーターの型を varchar(max) または nvarchar(max) に変更するか、_SC flag を含まない照合順序を使用してください。

このエラーが発生しているため、オブジェクトが作成できず 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’)
    drop procedure dbo.sp_DTA_end_xmlprefix
if exists (select name from msdb.dbo.sysobjects    where name = ‘sp_DTA_start_xmlprefix’ and type = ‘P’)
    drop procedure dbo.sp_DTA_start_xmlprefix
if exists (select name from msdb.dbo.sysobjects    where name = ‘fn_DTA_unquote_dbname’ and type = ‘FN’)
    drop function dbo.fn_DTA_unquote_dbname

RC 0 で DTA を実行したいときは _SC 以外の照合順序を使用しておいた方が良さそうです。

ntext を使用している場合に照合順序に気を付ける必要があるというのは勉強になりました。
下位バージョンから移行する際には注意が必要そうですね。

Written by masayuki.ozawa

1月 21st, 2012 at 11:56 pm

Posted in SQL Server

Tagged with ,

Leave a Reply

*