คำถามนี้เป็นคำถามเกี่ยวกับประสิทธิภาพของดัชนี 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] )
จากสิ่งที่ฉันได้อ่าน BAD คือการวางเขตข้อมูลขนาดใหญ่ในดัชนี ฉันอ่านบทความต่าง ๆ รวมถึงhttp://msdn.microsoft.com/en-us/library/ms190806.aspxซึ่งพูดถึงผลกระทบของการเพจและขนาดดิสก์ต่อประสิทธิภาพของดัชนี สิ่งนี้ถูกกล่าวถึงแผนแบบสอบถามใช้ดัชนีครอบคลุมแน่นอน ฉันไม่มีข้อมูลเพียงพอที่จะพิจารณาว่านี่คือต้นทุนของฉันในแง่ของการโหลดระบบ ฉันรู้ว่าโดยรวมแล้วระบบทำงานได้ไม่ดีและฉันกังวลว่านี่เป็นหนึ่งในปัญหา คำถาม:
การวาง
varchar(2000)
คอลัมน์นี้ในดัชนีINCLUDE
เคยเป็นความคิดที่ดีหรือไม่?เนื่องจาก
INCLUDE
ฟิลด์จะถูกเก็บไว้ในโหนดใบไม้พวกมันมีผลกระทบต่อดัชนีประสิทธิภาพหรือไม่
ปรับปรุง: ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม! นี่เป็นคำถามที่ไม่ยุติธรรมในบางวิธี - อย่างที่คุณพูดไม่มีคำตอบที่ถูกต้องแน่นอนหากไม่มีสถิติและการทำโปรไฟล์จริง เช่นเดียวกับปัญหาเรื่องประสิทธิภาพฉันเดาว่าคำตอบคือ "มันขึ้นอยู่กับ"
VARCHAR(2000)
ซึ่งโดยปกติเก็บเพียงสิบตัวอักษรเป็นสิ่งหนึ่ง; ทึบ 2,000 ไบต์ต่อบันทึกเป็นอย่างอื่น