Mặc dù tôi không đồng ý rằng các BLOB chỉ nên ở trong một bảng khác - chúng hoàn toàn không nên có trong cơ sở dữ liệu . Lưu trữ một con trỏ đến nơi tệp nằm trên đĩa, và sau đó chỉ cần lấy nó từ cơ sở dữ liệu ...
Vấn đề chính mà họ gây ra (đối với tôi) là với việc lập chỉ mục. Sử dụng XML với các gói truy vấn, vì mọi người đều hiểu, hãy tạo một bảng:
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)
Chỉ có 1000 hàng, nhưng kiểm tra kích thước ...
sp_BlitzIndex @DatabaseName = 'StackOverflow', @SchemaName = 'dbo', @TableName = 'index_test'
Đó là hơn 40 MB cho chỉ 1000 hàng. Giả sử bạn thêm 40 MB mỗi 1000 hàng, điều đó có thể trở nên khá xấu xí khá nhanh chóng. Điều gì xảy ra khi bạn đạt 1 triệu hàng? Đó chỉ là khoảng 1 TB dữ liệu.
Bất kỳ truy vấn nào cần sử dụng chỉ mục được nhóm của bạn bây giờ cần phải đọc tất cả dữ liệu BLOB đó vào phần làm rõ bộ nhớ : khi cột dữ liệu BLOB được tham chiếu.
Bạn có thể nghĩ ra những cách tốt hơn để sử dụng bộ nhớ SQL Server hơn là lưu trữ BLOB không? Bởi vì tôi chắc chắn có thể.
Mở rộng nó thành các chỉ mục không bao gồm:
CREATE INDEX ix_noblob ON dbo.index_test (ID)
CREATE INDEX ix_returnoftheblob ON dbo.index_test (ID) INCLUDE (query_plan)
Bạn có thể thiết kế các chỉ mục không bao gồm của mình để tránh phần lớn cột BLOB để các truy vấn thông thường có thể tránh chỉ mục được nhóm, nhưng ngay khi bạn cần cột BLOB đó, bạn cần chỉ mục được nhóm.
Nếu bạn thêm nó dưới dạng một INCLUDED
cột vào một chỉ mục không bao gồm để tránh một kịch bản tra cứu chính, bạn sẽ kết thúc với các chỉ mục không bao gồm khổng lồ:
Nhiều vấn đề họ gây ra:
- Nếu bất cứ ai chạy
SELECT *
truy vấn, họ sẽ nhận được tất cả dữ liệu BLOB đó.
- Chúng chiếm không gian trong các bản sao lưu và khôi phục, làm chậm chúng
- Họ chậm lại
DBCC CHECKDB
, vì tôi biết bạn đang kiểm tra tham nhũng, phải không?
- Và nếu bạn thực hiện bất kỳ chỉ số bảo trì, họ cũng làm chậm điều đó.
Hi vọng điêu nay co ich!