Pertanyaan ini adalah tentang kinerja indeks SQL Server dengan varchar(2000)
sebagai INCLUDE
dalam indeks yang meliputi.
Saya mencoba untuk meningkatkan kinerja dalam aplikasi database yang lambat dan tidak stabil. Dalam beberapa kasus, data yang diakses melalui string varchar besar, dengan query termasuk operasi string multple seperti SUBSTRING()
, SPACE()
, dan DATALENGTH()
. Berikut ini contoh akses yang disederhanakan;
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
Skema terlihat seperti ini:
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, ...
Indeks berikut telah ditentukan, dengan bidang penutup pada kolom teks besar.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
Dari apa yang saya baca itu BAD untuk meletakkan bidang data besar dalam indeks. Saya telah membaca beberapa artikel, termasuk http://msdn.microsoft.com/en-us/library/ms190806.aspx yang membahas dampak ukuran halaman dan disk pada kinerja indeks. Ini dikatakan, rencana permintaan pasti menggunakan indeks penutup. Saya tidak memiliki informasi yang cukup untuk menentukan berapa sebenarnya biaya saya dalam hal beban sistem. Saya tahu bahwa secara keseluruhan, sistem berkinerja buruk, dan saya khawatir ini adalah salah satu masalah. Pertanyaan:
Apakah menempatkan
varchar(2000)
kolom ini dalam indeksINCLUDE
merupakan ide yang bagus?Karena
INCLUDE
bidang disimpan dalam node daun, apakah mereka memiliki banyak dampak kinerja indeks?
Pembaruan: Terima kasih atas balasan yang sangat baik! Ini adalah pertanyaan yang tidak adil dalam beberapa hal - seperti yang Anda katakan, tidak ada jawaban benar mutlak tanpa statistik dan profil yang sebenarnya. Seperti banyak masalah kinerja, saya kira jawabannya adalah "itu tergantung".
VARCHAR(2000)
yang biasanya menyimpan hanya sepuluh karakter adalah satu hal; 2.000 byte per rekaman yang solid adalah sesuatu yang lain.