900バイトを超えるサイズのインデックスを作成できないのはなぜですか?この質問は、誰にも答えられなかったプレゼンテーションで提起されました。
私はこの質問に答えるこの方法を考えることができます。
ページサイズ8K、使用可能な8060 900バイト* 8 = 7200バイト(900 * 9 = 8100)であるため、最大で1ページに収まるレコードは8つだけです。このインデックスが非クラスター化されている場合、クラスター化されたインデックスキーも保存する必要があります。これも、900バイトの長さになる可能性があります。つまり、単一レコードの場合、必要なメモリは(900 + 900バイト)となります。つまり、ページごとに4つのレコードを保存できます。
1ページに4つのレコードしか保存できない場合、IOパフォーマンスの向上と比較した操作のオーバーヘッドは無効になるため、インデックスサイズの制限は900バイトです。
From Microsoft SQL Server 2008 Internals :
実際、スケーラビリティの向上が、900バイトまたは16列のインデックスキーに制限が生じる主な理由です。
キーごとに900バイトで、ページごとに最大8つのインデックスエントリを持つことができます。ページあたりのインデックスエントリの最大数を減らすと、特定のインデックスを格納するために必要なレベルの数が大幅に増えます。キーのサイズが小さいほど、必要なデータのページが少なくなるため、インデックスの効率が上がります。
SQL Server 2016 の時点で、非クラスター化インデックスの最大バイトサイズが1,700バイト、32列に増えました。
この点については大きな議論があるかもしれません。しかし、マイクロソフト自身が提供できるのは正しい答えだけです。
https://msdn.Microsoft.com/en-us/library/ms188783.aspx?f=255&MSPPError=-2147217396
1700バイトに関する情報は上記のリンクで提供されていますが、残念ながらこれまでのところ、インデックス長の1700バイトのうちの900の制限については理由が提供されていません。