Це питання про продуктивність індексу SQL сервера з 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] )
З того, що я прочитав, це BAD ставити великі поля даних в індекс. Я читав кілька статей, серед яких http://msdn.microsoft.com/en-us/library/ms190806.aspx, в яких обговорюється вплив підкачки та розміру диска на продуктивність індексу. При цьому, план запитів, безумовно, використовує індекс покриття. У мене недостатньо інформації, щоб визначити, скільки це насправді коштує мені з точки зору завантаження системи. Я знаю, що в цілому система працює погано, і я стурбований тим, що це одне з питань. Запитання:
Чи ставити цей
varchar(2000)
стовпець в індексINCLUDE
завжди корисною ідеєю?Оскільки
INCLUDE
поля зберігаються у вузлах листів, чи мають вони великий показник впливу показника?
Оновлення: Дякую за чудові відповіді! Це в чомусь несправедливе запитання - як ви кажете, не існує абсолютної правильної відповіді без фактичної статистики та профілювання. Як і стільки питань щодо продуктивності, я думаю, що відповідь "це залежить".
VARCHAR(2000)
, Який зазвичай зберігає тільки десять символів одна річ; міцні 2000 байтів за запис - це щось інше.