ในขณะที่ฉันไม่เห็นว่า BLOB ควรอยู่ในตารางอื่น แต่ไม่ควรอยู่ในฐานข้อมูลเลย เก็บตัวชี้ไปยังตำแหน่งที่ไฟล์ใช้งานบนดิสก์จากนั้นรับจากฐานข้อมูล ...
ปัญหาหลักที่ทำให้เกิด (สำหรับฉัน) คือการทำดัชนี การใช้ XML กับแผนแบบสอบถามเนื่องจากทุกคนมีส่วนร่วมกันทำตาราง:
SELECT TOP 1000
ID = IDENTITY(INT,1,1),
deq.query_plan
INTO dbo.index_test
FROM sys.dm_exec_cached_plans AS dec
CROSS APPLY sys.dm_exec_query_plan(dec.plan_handle) AS deq
ALTER TABLE dbo.index_test ADD CONSTRAINT pk_id PRIMARY KEY CLUSTERED (ID)
มีเพียง 1,000 แถว แต่ตรวจสอบขนาด ...
sp_BlitzIndex @DatabaseName = 'StackOverflow', @SchemaName = 'dbo', @TableName = 'index_test'
มากกว่า 40 MB เพียง 1,000 แถวเท่านั้น สมมติว่าคุณเพิ่ม 40 MB ทุก ๆ 1,000 แถวที่สามารถทำให้สวยน่าเกลียดได้อย่างรวดเร็ว จะเกิดอะไรขึ้นเมื่อคุณไปถึง 1 ล้านแถว นั่นคือข้อมูลประมาณ 1 TB
แบบสอบถามใด ๆ ที่จำเป็นต้องใช้ดัชนีคลัสเตอร์ของคุณตอนนี้จำเป็นต้องอ่านข้อมูล BLOB ทั้งหมดนั้นลงในการชี้แจงหน่วยความจำ:เมื่อมีการอ้างอิงคอลัมน์ข้อมูล BLOB
คุณนึกถึงวิธีที่ดีกว่าในการใช้หน่วยความจำ SQL Server มากกว่าการจัดเก็บ BLOB หรือไม่ เพราะฉันสามารถ
การขยายไปยังดัชนีที่ไม่ได้เป็นคลัสเตอร์:
CREATE INDEX ix_noblob ON dbo.index_test (ID)
CREATE INDEX ix_returnoftheblob ON dbo.index_test (ID) INCLUDE (query_plan)
คุณสามารถออกแบบดัชนี nonclustered ของคุณเพื่อหลีกเลี่ยงคอลัมน์ BLOB เป็นส่วนใหญ่ดังนั้นการสืบค้นปกติสามารถหลีกเลี่ยงดัชนีคลัสเตอร์ แต่ทันทีที่คุณต้องการคอลัมน์ BLOB คุณจำเป็นต้องมีดัชนีคลัสเตอร์
หากคุณเพิ่มเป็นINCLUDED
คอลัมน์ในดัชนี nonclustered เพื่อหลีกเลี่ยงสถานการณ์การค้นหาคีย์คุณท้ายด้วยดัชนี nonclustered ยักษ์:
ปัญหาอื่น ๆ ที่พวกเขาทำให้:
- ถ้าใครเรียกใช้
SELECT *
แบบสอบถามพวกเขาได้รับข้อมูล BLOB ทั้งหมด
- พวกเขาใช้พื้นที่ในการสำรองข้อมูลและเรียกคืนทำให้ช้าลง
- พวกเขาช้าลง
DBCC CHECKDB
เพราะฉันรู้ว่าคุณกำลังตรวจสอบการทุจริตใช่ไหม
- และถ้าคุณทำการบำรุงรักษาดัชนีใด ๆ พวกเขาก็จะชะลอตัวลงเช่นกัน
หวังว่านี่จะช่วยได้!