Lưu trữ tệp trong SQL Server


80

Đó là một câu hỏi cũ mà tôi biết, nhưng với SQL Server 2012 liệu cuối cùng có thể lưu trữ các tệp trong cơ sở dữ liệu hay chúng thực sự nên được giữ trong hệ thống tệp với chỉ tham chiếu đến chúng trong cơ sở dữ liệu?

Nếu ngày nay việc lưu trữ chúng trong cơ sở dữ liệu được coi là có thể chấp nhận được, thì cách hiệu quả nhất để làm điều đó là gì?

Tôi dự định áp dụng mã hóa nên tôi đánh giá cao quá trình xử lý sẽ không nhanh như chớp.


6
Không chắc nếu tôi làm. Tôi chỉ muốn biết liệu đó có phải là một lựa chọn khả thi bây giờ hay không.
CompanyDroneFromSector7G,

Câu trả lời:


116

Có một bài báo thực sự tốt của Microsoft Research được gọi là To Blob hoặc Not To Blob .

Kết luận của họ sau một số lượng lớn các bài kiểm tra và phân tích hiệu suất là:

  • nếu ảnh hoặc tài liệu của bạn thường có kích thước dưới 256K, lưu trữ chúng trong cột VARBINARY của cơ sở dữ liệu sẽ hiệu quả hơn

  • nếu ảnh hoặc tài liệu của bạn thường có kích thước trên 1 MB, thì việc lưu trữ chúng trong hệ thống tệp sẽ hiệu quả hơn (và với thuộc tính FILESTREAM của SQL Server 2008, chúng vẫn nằm dưới sự kiểm soát giao dịch và là một phần của cơ sở dữ liệu)

  • ở giữa hai điều đó, có một chút rắc rối tùy thuộc vào việc sử dụng của bạn

Nếu bạn quyết định đặt ảnh của mình vào bảng SQL Server, tôi thực sự khuyên bạn nên sử dụng một bảng riêng để lưu trữ những ảnh đó - không lưu ảnh nhân viên trong bảng nhân viên - hãy giữ chúng trong một bảng riêng. Bằng cách đó, bảng Nhân viên có thể luôn gọn gàng, có ý nghĩa và rất hiệu quả, giả sử bạn không phải lúc nào cũng cần chọn ảnh nhân viên như một phần của các truy vấn của mình.

Đối với nhóm tệp , hãy xem Tệp và Kiến trúc nhóm tệp để biết phần giới thiệu. Về cơ bản, bạn sẽ tạo cơ sở dữ liệu của mình với một nhóm tệp riêng biệt cho các cấu trúc dữ liệu lớn ngay từ đầu hoặc thêm một nhóm tệp bổ sung sau đó. Hãy gọi nó là "LARGE_DATA".

Bây giờ, bất cứ khi nào bạn tạo một bảng mới cần lưu trữ các cột VARCHAR (MAX) hoặc VARBINARY (MAX), bạn có thể chỉ định nhóm tệp này cho dữ liệu lớn:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

Hãy xem phần giới thiệu MSDN trên các nhóm tệp và chơi với nó!


1
Nói hay lắm. Tất nhiên, tất cả phụ thuộc vào trường hợp sử dụng, nhưng filestream thường là một lựa chọn tốt.
TimothyAWiseman

3
Bài báo nghiên cứu bạn đã trích dẫn là từ tháng 4 năm 2006. Chắc chắn có rất nhiều thứ đã thay đổi kể từ đó.
Oxon

2
@ 1576573987: không có, không thực sự - những kết luận vẫn còn có giá trị, như xa như tôi có thể nói
marc_s

Về việc lưu trữ VARBINARY(MAX)trong một nhóm tệp riêng, nếu bạn có một bảng "tệp" riêng, bạn chỉ lưu toàn bộ bảng đó trong nhóm tệp riêng hay bạn lưu trữ dữ liệu "meta" tệp trong (các) nhóm tệp chuẩn và chỉ lưu trữ VARBINARY(MAX)trong nhóm tệp mới?
RemarkLima

@RemarkLima: bạn đang nói về FILETABLEtính năng trong SQL Server 2012? Ở đó, chỉ có các siêu dữ liệu về các tập tin được lưu trữ bên trong SQL Server (như với FILESTREAM) - tập tin thực tế (các byte mà làm cho nó trở lên) được lưu trữ bên ngoài cơ sở dữ liệu, trên một ổ đĩa
marc_s

29

vẫn không có câu trả lời đơn giản. Nó phụ thuộc vào kịch bản của bạn. MSDN có tài liệu để giúp bạn quyết định.

Có các tùy chọn khác được đề cập ở đây. Thay vì lưu trữ trong hệ thống tệp trực tiếp hoặc trong BLOB, bạn có thể sử dụng FileStream hoặc Bảng Tệp trong SQL Server 2012. Những ưu điểm đối với Bảng Tệp có vẻ như không có trí tuệ (nhưng phải thừa nhận rằng tôi không có kinh nghiệm trực tiếp cá nhân với chúng .)

Bài báo chắc chắn rất đáng đọc.


11

Bạn có thể đọc trên FILESTREAM . Dưới đây là một số thông tin từ tài liệu sẽ giúp bạn quyết định:

Nếu các điều kiện sau là đúng, bạn nên xem xét sử dụng FILESTREAM:

  • Các đối tượng đang được lưu trữ trung bình lớn hơn 1 MB.
  • Truy cập đọc nhanh là quan trọng.
  • Bạn đang phát triển các ứng dụng sử dụng tầng giữa cho logic ứng dụng.

Đối với các đối tượng nhỏ hơn, việc lưu trữ các BLOB varbinary (max) trong cơ sở dữ liệu thường cung cấp hiệu suất phát trực tuyến tốt hơn.


Trên thực tế, tôi có thể làm cả hai / một trong hai, tùy thuộc vào kích thước tệp. Cảm ơn!
CompanyDroneFromSector7G
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.