Этот вопрос касается производительности индекса SQL Server со varchar(2000)
встроенным INCLUDE
индексом.
Я пытаюсь улучшить производительность в медленном и нестабильном приложении базы данных. В некоторых случаях доступ к данным осуществляется через большие строки VARCHAR, с запросами , включая multple строковых операций , как 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, в которых обсуждается влияние подкачки и размера диска на производительность индекса. При этом план запроса определенно использует индекс покрытия. У меня недостаточно информации, чтобы определить, сколько это на самом деле стоит мне с точки зрения загрузки системы. Я знаю, что в целом система работает плохо, и я обеспокоен тем, что это одна из проблем. Вопросов:
Является ли эта
varchar(2000)
колонка в индексеINCLUDE
хорошей идеей?Поскольку
INCLUDE
поля хранятся в конечных узлах, сильно ли они влияют на производительность индекса?
Обновление: спасибо за отличные ответы! В некотором смысле это несправедливый вопрос - как вы, ребята, говорите, что нет абсолютно правильного ответа без реальной статистики и профилирования. Как и многие другие проблемы с производительностью, я думаю, что ответ "это зависит".
VARCHAR(2000)
который обычно хранит только десять символов, это одно; твердые 2000 байтов на запись - это нечто другое.