Diese Frage bezieht sich auf die SQL Server-Indexleistung mit einem varchar(2000)
als INCLUDE
in einem abdeckenden Index.
Ich versuche, die Leistung in einer langsamen und instabilen Datenbankanwendung zu verbessern. In einigen Fällen werden die Daten durch großen varchar Strings zugegriffen wird , mit den Abfragen einschließlich multple String - Operationen wie SUBSTRING()
, SPACE()
und DATALENGTH()
. Hier ist ein vereinfachtes Beispiel für den Zugriff.
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
Das Schema sieht folgendermaßen aus:
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, ...
Der folgende Index wurde mit einem überdeckenden Feld in der großen Textspalte definiert.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
Nach dem, was ich gelesen habe, ist es SCHLECHT, große Datenfelder in einen Index aufzunehmen. Ich habe mehrere Artikel gelesen, darunter http://msdn.microsoft.com/en-us/library/ms190806.aspx denen die Auswirkungen von Paging und Festplattengröße auf die Indexleistung erläutert werden. Vor diesem Hintergrund verwendet der Abfrageplan definitiv den Deckungsindex. Ich habe nicht genügend Informationen, um zu bestimmen, wie viel mich das in Bezug auf die Systemlast tatsächlich kostet. Ich weiß, dass das System insgesamt schlecht funktioniert, und ich bin besorgt, dass dies eines der Probleme ist. Fragen:
Ist es jemals eine gute Idee , diese
varchar(2000)
Spalte in den Index aufzunehmenINCLUDE
?INCLUDE
Haben die Felder, da sie in Blattknoten gespeichert sind, große Auswirkungen auf die Indexleistung?
Update: Danke für die tollen Antworten! Dies ist in gewisser Hinsicht eine unfaire Frage - wie Sie sagen, gibt es keine absolut richtige Antwort ohne tatsächliche Statistiken und Profilerstellung. Wie so viele Leistungsprobleme lautet die Antwort vermutlich "es kommt darauf an".
VARCHAR(2000)
der normalerweise nur zehn Zeichen speichert, ist eine Sache; Feste 2.000 Bytes pro Datensatz sind etwas anderes.