Meskipun saya tidak setuju bahwa BLOB seharusnya ada di tabel lain - mereka tidak boleh ada di database sama sekali . Menyimpan pointer ke tempat file tinggal di disk, dan kemudian dapatkan dari database ...
Masalah utama yang mereka sebabkan (bagi saya) adalah pengindeksan. Menggunakan XML dengan paket kueri, karena semua orang mengerti, mari kita buat tabel:
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)
Ini hanya 1000 baris, tetapi memeriksa ukuran ...
sp_BlitzIndex @DatabaseName = 'StackOverflow', @SchemaName = 'dbo', @TableName = 'index_test'
Ini lebih dari 40 MB hanya untuk 1000 baris. Dengan asumsi Anda menambahkan 40 MB setiap 1000 baris, itu bisa menjadi sangat jelek dengan cepat. Apa yang terjadi ketika Anda menekan 1 juta baris? Itu hanya sekitar 1 TB data, di sana.
Setiap pertanyaan yang perlu menggunakan indeks berkerumun Anda sekarang harus membaca semua data BLOB itu menjadi klarifikasi memori : ketika kolom data BLOB direferensikan.
Bisakah Anda memikirkan cara yang lebih baik untuk menggunakan memori SQL Server daripada menyimpan BLOB? Karena saya yakin bisa.
Memperluasnya ke indeks nonclustered:
CREATE INDEX ix_noblob ON dbo.index_test (ID)
CREATE INDEX ix_returnoftheblob ON dbo.index_test (ID) INCLUDE (query_plan)
Anda dapat mendesain indeks nonclustered Anda untuk sebagian besar menghindari kolom BLOB sehingga permintaan reguler dapat menghindari indeks clustered, tetapi segera setelah Anda membutuhkan kolom BLOB itu, Anda memerlukan indeks clustered.
Jika Anda menambahkannya sebagai INCLUDED
kolom pada indeks yang tidak dikelompokkan untuk menghindari skenario pencarian kunci, Anda akan berakhir dengan indeks raksasa yang tidak tercakup:
Lebih banyak masalah yang mereka sebabkan:
- Jika ada yang menjalankan
SELECT *
kueri, mereka mendapatkan semua data BLOB itu.
- Mereka mengambil ruang dalam cadangan dan memulihkan, memperlambatnya
- Mereka melambat
DBCC CHECKDB
, karena saya tahu Anda sedang memeriksa korupsi, kan?
- Dan jika Anda melakukan pemeliharaan indeks, mereka memperlambatnya juga.
Semoga ini membantu!