Bu soru, bir kaplama dizininde varchar(2000)
bir ile SQL Server dizin performansı hakkındadır INCLUDE
.
Yavaş ve kararsız bir veritabanı uygulamasında performansı artırmaya çalışıyorum. Bazı durumlarda, veri gibi multple dize operasyonları gibi sorgu ile büyük varchar dizeleri üzerinden erişilen SUBSTRING()
, SPACE()
ve DATALENGTH()
. İşte basitleştirilmiş erişim örneği;
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
Şema şöyle görünür:
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, ...
Aşağıdaki metin büyük metin sütununda bir kaplama alanı ile tanımlanmıştır.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
Okuduğum kadarıyla büyük veri alanlarını bir dizine koymak KÖTÜ. Disk belleği ve disk boyutunun dizin performansı üzerindeki etkisini tartışan http://msdn.microsoft.com/en-us/library/ms190806.aspx dahil birkaç makale okudum . Bununla birlikte, sorgu planı kesinlikle örtme endeksini kullanır. Bunun sistem yükü açısından bana ne kadara mal olacağını belirlemek için yeterli bilgim yok. Genel olarak, sistemin kötü performans gösterdiğini biliyorum ve bunun sorunlardan biri olduğundan endişeliyim. Sorular:
Bu
varchar(2000)
sütunu dizine koymakINCLUDE
hiç iyi bir fikir midir?Yana
INCLUDE
alanları yaprak düğümlerin saklanır, bunlar kadar etkisi endeksi performansını var mı?
Güncelleme: Mükemmel cevaplar için teşekkürler! Bu bazı yönlerden haksız bir sorudur - siz söylediğiniz gibi, gerçek istatistikler ve profil oluşturma olmadan mutlak bir doğru cevap yoktur. Pek çok performans sorunu gibi, sanırım cevap "bağlıdır".
VARCHAR(2000)
hangi tipik mağazaları sadece on karakter bir şeydir; kayıt başına 2.000 bayt katı başka bir şeydir.