概要
Microsoft SQL Server 2000 および Microsoft SQL Server 2005 では、"照合順序" を使用して、文字列の比較や並べ替えを行う方法、および非 Unicode データに対して使用する文字セットを指定します。SQL Server 2000 では、次の 2 種類の照合順序がサポートされています。
-
SQL 照合順序
-
Windows 照合順序
それぞれの種類の照合順序の詳細、および使用する照合順序の選択に役立つ参考資料については、SQL Server 2000 Books Online のトピック「SQL 照合順序の選択」、または SQL Server 2005 Books Online のトピック「照合順序の種類」を参照してください。
この資料では、SQL Server 2000 や SQL Server 2005 をインストールする際に、Windows 照合順序と SQL 照合順序のどちらを選択するかの決定に影響を及ぼす可能性がある、追加の検討事項について説明します。
詳細
照合順序のセマンティクス
Windows 照合順序の場合、非 Unicode データの比較は、Unicode データと同じアルゴリズムを使用して実装されています。Unicode と非 Unicode の並べ替えには、いずれも、特定のバージョンの Windows 文字列比較規則との互換性があります。これにより、SQL Server の各データ型間の一貫性が提供されます。また、Win32 API 関数の CompareString を使用する開発者は、SQL Server が使用する規則と同じ規則を使用して、アプリケーションで文字列の並べ替えを行うことができます。
SQL 照合順序の場合、非 Unicode データに対しては SQL Server で別の比較セマンティクスが定義されています。SQL Server の比較セマンティクスは、SQL の "並べ替え順序" に基づきます。並べ替え順序と SQL 照合順序の対応については、SQL Server Books Online のトピック「SQL 照合順序名」を参照してください。
非 Unicode データを並べ替えるための SQL 照合順序の規則には、Microsoft Windows オペレーティング システムによって提供される並べ替えルーチンとの互換性がありません。しかし、Unicode データの並べ替えは、特定バージョンの Windows の並べ替え規則と互換性があります。非 Unicode データと Unicode データとで比較規則が異なるため、SQL 照合順序を使用すると、基になるデータ型によっては、同じ文字を比較した結果が異なる場合があります。たとえば、SQL 照合順序 "SQL_Latin1_General_CP1_CI_AS" を使用している場合、非 Unicode 文字列の 'a-c' は文字列 'ab' よりも小さくなります。これは、ハイフン ("-") が "b" の前に出現する独立した文字として並べ替えが行われるためです。しかし、これらの文字列を Unicode に変換し、同じ比較を実行した場合、Unicode 文字列 N'a-c' は、N'ab' よりも大きいものと見なされます。これは、Unicode の並べ替え規則では、ハイフンを無視する "単語での並べ替え" が使用されるためです。
文字列比較のパフォーマンス
Unicode の並べ替え規則は、非 Unicode の SQL 並べ替え順序の規則よりもはるかに複雑です。SQL Server が Unicode データを比較する際、照合順序のロケールに基づいて動的に変更される重みが文字に割り当てられます。このデータは、文字の 1 バイト表現と 2 バイト表現の区別、文字のアクセントの有無の区別、日本語のひらがなとカタカナの区別など、比較スタイルの設定によっても変更されます。Unicode の並べ替えルーチンは、単語での並べ替えのような、より高度なソート処理をサポートしています。
また、このルーチンは Unicode データを処理する必要があるため、ほとんどの SQL Server の並べ替え順序で処理できる最大 255 文字ではなく、数千の異なる文字の並べ替えと比較を処理するために十分な柔軟性を持っています。これらの理由から、Unicode の並べ替え規則を使用する直接の文字比較処理は、通常、非 Unicode の SQL 並べ替え順序を使用する類似の文字列比較よりも、時間と CPU 使用率の両方の点で負荷が高くなります。
これは、SQL Server のデータ型と照合順序の種類の可能な組み合わせに関して、次のようなことを意味しています。
-
非 Unicode のデータ型 (char、varchar、text) を使用してデータの並べ替えと処理を行い、かつ SQL 照合順序を使用している場合、文字列比較は、非 Unicode の SQL 並べ替え順序を使用して実行されます。
-
非 Unicode のデータ型 (char、varchar、text) を使用してデータの並べ替えと処理を行い、かつ Windows 照合順序を使用している場合、文字列比較は、Unicode の並べ替え規則を使用して実行されます。これが原因で、文字列の並べ替えのパフォーマンスに極端に依存する特定の操作について、SQL 照合順序を使用して実行される同等の操作よりも長い時間と高い CPU 利用率が必要になる場合があります。
-
Unicode のデータ型 (nchar、nvarchar、ntext) を使用している場合、SQL 照合順序と Windows 照合順序の並べ替え処理に差異はありません。どちらも、Unicode の並べ替え規則を使用します。
通常、Windows 照合順序と SQL 照合順序の間のパフォーマンスの差異はそれほど大きくありません。違いが現れるのは、処理負荷が I/O やネットワーク速度に制限されるのではなく CPU に依存し、かつ、この CPU 負荷の大半が、SQL Server で実行される文字列操作や比較処理のオーバーヘッドによって発生している場合に限られます。パフォーマンスの違いが顕著になる可能性があるアプリケーションの例は、アプリケーションが長い文字列値を SQL Server のストアド プロシージャに渡すシステムです。文字列が渡されると、ストアド プロシージャは、CHARINDEX や PATINDEX などの Transact-SQL 文字列操作関数を幅広く使用して文字列の解析を行います。負荷に影響する他の要因がほとんどなく、この文字列解析ストアド プロシージャの実行がその大半を占めている場合、SQL 照合順序と Windows 照合順序の間のパフォーマンスの違いが顕著になる可能性があります。しかし、ほとんどのアプリケーションの設計では、パフォーマンスに大きな違いが発生する状況に至ることはありません。
推奨事項
-
SQL 照合順序は、以前のバージョンの SQL Server との下位互換性のために提供されています。Windows 照合順序は、SQL Server で Unicode テキストと非 Unicode テキストの両方に対して一貫した文字列比較を提供します。これは、Windows オペレーティング システムの文字列比較とも一貫性を持っています。以上の理由により、下位互換性の問題や、SQL 照合順序を必要とする特定のパフォーマンスの問題がある場合を除き、Windows 照合順序が推奨されます。
-
SQL 照合順序のパフォーマンス特性だけに基づいて SQL 照合順序を検討しているのであれば、ほとんどのアプリケーションのパフォーマンスは、照合順序を変更してもそれほど向上しないことを認識する必要があります。SQL 照合順序によるメリットが得られるクエリは分離するようにしてください。影響があるクエリがわかったら、照合順序の変更の代わりになる以下の方法を検討してください。どちらの方法も、照合順序を SQL 照合順序に変更した場合よりも大きなパフォーマンスの向上が得られる可能性があります。
-
Windows 照合順序のオーバーヘッドが、明示的な文字列操作や解析を実行する Transact-SQL ルーチンに影響を与える場合で、かつ非 Unicode のデータ型を使用している場合、高い頻度で実行される非常に負荷の大きい操作に対しては、SQL 照合順序またはバイナリ Windows 照合順序を指定することもできます。PATINDEX 関数を使用して、テーブルのテキスト列に文字 "x" が含まれているかどうかを判別するとします。特定の比較操作では強制的に SQL 照合順序を使用し、データベースやアプリケーションの残りの部分には引き続き Windows 照合順序を使用するようにした場合、システム全体の照合順序を変更する必要はありません。
SELECT PATINDEX ('%x%', MemoFld COLLATE SQL_Latin1_General_Cp1_CI_AS) FROM ...
-
Windows 照合順序の影響が、複雑な文字列操作関数を使用しない、もっと一般的なクエリにも影響を及ぼす場合は、インデックスやクエリの設計を改良することで、SQL 照合順序の変更によって得られる効果を大きく超える性能向上が得られる可能性があります。適切なインデックスに基づく選択性の高い探索で結果が求められるクエリでは、文字列の比較コストのわずかな変更にはあまり影響を受けません。対照的に、テーブルのスキャンを実行し、特定の値を膨大な数の行に対して比較する必要があるクエリでは、文字列比較におけるわずかなオーバーヘッドが急激に積算される可能性があります。インデックスやクエリ自体を変更することで、クエリ プランで巨大なテーブルやインデックスのスキャンが行われないようにすれば、クエリの実行は SQL 照合順序に変更した場合よりもはるかに高速になります。
-
注 : SQL 照合順序の変形である第 3 の種類の照合順序があります。この第 3 の照合順序は、"互換性照合順序" または "旧式の照合順序" と呼ばれています。互換性照合順序は、SQL Server 2000 では定義済みの照合順序名を持たない、並べ替えと比較の規則のセットです。たとえば、Unicode データと非 Unicode データに対して、一貫性のない大文字小文字の区別の設定を使用して SQL Server 7.0 をセットアップした場合、この SQL Server 7.0 のインスタンスを SQL Server 2000 にアップグレードすると、互換性照合順序となります。この資料で説明してきた内容で、SQL 照合順序に関する情報は、互換性照合順序にも適用されます。
互換性照合順序の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
270042 SQL Server の互換性照合順序について