この質問は、とSQL Serverのインデックスのパフォーマンスについてですvarchar(2000)
としてINCLUDE
の被覆指数インチ
低速で不安定なデータベースアプリケーションのパフォーマンスを改善しようとしています。いくつかのケースでは、データのようなmultple文字列操作を含むクエリで、大VARCHAR列を介してアクセスされるSUBSTRING()
、SPACE()
とDATALENGTH()
。アクセスの簡単な例を次に示します。
update fattable set col3 =
SUBSTRING(col3,1,10) + '*' +
SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2
スキーマは次のようになります。
CREATE TABLE [dbo].[FatTable](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[col1] [nchar](12) NOT NULL,
[col2] [int] NOT NULL,
[col3] [varchar](2000) NOT NULL, ...
次のインデックスが定義されており、大きなテキスト列にカバーフィールドがあります。
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
私が読んだことから、インデックスに大きなデータフィールドを置くのは悪いです。インデックスのパフォーマンスに対するページングとディスクサイズの影響について説明しているhttp://msdn.microsoft.com/en-us/library/ms190806.aspxなど、いくつかの記事を読んでいます。そうは言っても、クエリプランは必ずカバーインデックスを使用します。システム負荷に関して実際にどれだけのコストがかかるかを判断するのに十分な情報がありません。全体として、システムのパフォーマンスが低下していることは知っていますが、これが問題の1つであることを心配しています。質問:
この
varchar(2000)
列をインデックスに入れるのINCLUDE
は良い考えですか?INCLUDE
フィールドはリーフノードに格納されるため、インデックスのパフォーマンスに大きな影響がありますか?
更新:すばらしい返信をありがとう!これはいくつかの点で不公平な質問です-皆さんが言うように、実際の統計とプロファイリングなしに絶対的な正しい答えはありません。多くのパフォーマンスの問題と同様に、答えは「それは依存する」と思います。
VARCHAR(2000)
一般的にちょうど10文字を格納一つのことです。1レコードあたり2,000バイトの固体は別のものです。