Cách tốt nhất để chống phân mảnh / thu gọn cơ sở dữ liệu cho mục đích lưu trữ


9

Chúng tôi đã có một phiên bản SQL Server được sử dụng để lưu trữ email (nhờ gói lưu trữ của bên thứ 3). Mỗi lần như vậy, phần mềm được chuyển sang một cơ sở dữ liệu trống mới. Chúng tôi đã thực hiện hàng quý này trong quá khứ, nhưng chúng tôi đang tìm cách thực hiện hàng tháng ngay bây giờ. Lượng dữ liệu được lưu trữ là khoảng 15 - 20 GB mỗi tháng và phần lớn dữ liệu chỉ nằm trong một số ít bảng (thường là 2 - 4).

Khi chúng tôi chuyển sang cơ sở dữ liệu mới, cơ sở dữ liệu cũ sẽ được sử dụng trên cơ sở chỉ đọc nghiêm ngặt. Những gì tôi muốn làm là tối ưu hóa nó thành một tệp dữ liệu chặt chẽ, đẹp mắt, với tất cả các bảng / chỉ mục liền kề và có hệ số lấp đầy rất cao và không có nhiều khoảng trống ở cuối tệp dữ liệu. Ngoài ra, chúng tôi đang sử dụng Phiên bản Chuẩn trên máy chủ này, với tất cả các giới hạn ngụ ý (nếu không tôi đã sử dụng nén dữ liệu).

Một vài khả năng tôi có thể nghĩ ra:

  1. Các chỉ mục REBUILD / REORGANIZE, DBCC SHRINKFILE (Được rồi, đây không phải là một lựa chọn hợp lý, vì DBCC SHRINKFILE sẽ phân chia sự tức giận ra khỏi bất cứ thứ gì nó chạm vào, nhưng tôi bao gồm nó để hoàn thiện.)
  2. Tạo một cơ sở dữ liệu mới với các số liệu thống kê tự động tắt. Script và tạo lại tất cả các bảng từ cơ sở dữ liệu nguồn. Sử dụng bcp để xuất / nhập dữ liệu vào cơ sở dữ liệu mới, theo thứ tự khóa cụm. Script và tạo lại tất cả các chỉ mục. Tính toán lại tất cả các số liệu thống kê với quét toàn bộ.
  3. Tạo một cơ sở dữ liệu mới với các số liệu thống kê tự động tắt. Script và tạo lại tất cả các bảng từ cơ sở dữ liệu nguồn. Sử dụng SSIS hoặc T-SQL để chuyển dữ liệu sang cơ sở dữ liệu mới. Script và tạo lại tất cả các chỉ mục. Tính toán lại tất cả các số liệu thống kê với quét toàn bộ.

Bước cuối cùng trong mọi trường hợp sẽ là thiết lập cơ sở dữ liệu ở chế độ chỉ đọc.

Có những lựa chọn tốt / tốt hơn nào khác để làm điều này? Mối quan tâm của tôi là chuyển dữ liệu theo cách như vậy để bảo toàn hệ số lấp đầy cao và theo cách tiếp giáp logic.

Biên tập:

Tôi nên đề cập rằng khoảng 75% dữ liệu dường như được lưu trữ trong các cột hình ảnh (LOB).


3
Bạn có (hoặc ứng dụng) quan tâm nếu các bảng vật lý kết thúc trong một nhóm khác PRIMARYkhông?
Jon Seigel

@JonSeigel Tôi cho rằng không, và thực sự đó là một ý tưởng khá hay, vì nó sẽ giúp tôi tránh được rắc rối khi phải tạo cơ sở dữ liệu mẫu và di chuyển tất cả dữ liệu.
db2

Bạn đang xem xét chỉ các giải pháp bạn tự viết mã hoặc bạn cũng có thể xem xét một số ứng dụng để giúp bạn với điều đó? Bạn có thể sử dụng Nén lưu trữ SQL của RedGate để nén dữ liệu trực tiếp. Hoặc bạn có thể thử Virtual Restore để tạo các bản sao lưu nén có sẵn dưới dạng dbs trực tuyến (mà không thực sự có đủ không gian cần thiết). Tất cả đều dựa trên trình điều khiển tệp cửa sổ Hyperbac cũ, rất tốt trong việc nén dữ liệu trực tiếp và sao lưu.
Mary

@Marian Nghe có vẻ thú vị, nhưng bây giờ tôi muốn sử dụng các khả năng của SQL Server gốc. Tôi chỉ cần chống phân mảnh rất hiệu quả các cơ sở dữ liệu, không có nhiều không gian chưa sử dụng còn lại trong (các) tệp. Nếu đó là một công cụ của bên thứ ba thực hiện công việc thay vì viết kịch bản thủ công, thì tốt thôi.
db2

Đó chỉ là một ý nghĩ, nhưng tại sao không tạo một nhóm mới, thêm tệp, đặt mức tăng trưởng hợp lý (giả sử 500MB) và sau đó xây dựng lại các bảng của bạn vào nhóm mới đó. Sau đó thu nhỏ tệp chính xuống gần như không có gì. Bạn sẽ không quan tâm đến việc phân mảnh trên các bảng hệ thống.
Nic

Câu trả lời:


1

Để loại bỏ sự phân mảnh vật lý trong các tệp, bạn có thể di chuyển chỉ mục được nhóm với thả hiện có vào một nhóm mới. Vì chúng sẽ là RO, làm cho tất cả chúng trở thành fillfactor 100% vì không cần khoảng trống để chèn, chia trang gây ra bởi các cập nhật.

Điều này cũng sẽ cho phép bạn thực hiện khôi phục từng phần và đưa cơ sở dữ liệu trực tuyến rất nhanh nếu bạn quyết định đến Enterprise. Enterprise cũng cho phép các chỉ mục của cột ngoài việc giảm ồ ạt thời gian truy vấn cho dữ liệu Chỉ đọc này, đây là phần fillet lớn.

Bạn có thể sử dụng tùy chọn thu nhỏ một lần trước khi chuyển sang chỉ đọc mà không gặp sự cố nghiêm trọng nào với phân mảnh để xóa khoảng trống ở cuối tệp như bạn muốn.

Bên cạnh đó, chỉ cần kiểm tra xem bạn có đang sử dụng các kiểu dữ liệu mới nhất cho LOBS của bạn không. tức là nvarchar (max) hoặc varchar (max) thay vì ntext hoặc text, varbinary (max) thay vì hình ảnh?


Nó chủ yếu sử dụng văn bản và hình ảnh, không may. Đây là ứng dụng của bên thứ 3, vì vậy tôi không có khả năng thay đổi điều đó.
db2

@ thực sự minh bạch cho ứng dụng, với máy chủ SQL lưu trữ thông tin liên tiếp nếu <8k. Nếu nhà cung cấp nói rằng nó không được hỗ trợ, tôi sẽ hỏi họ tại sao họ vẫn sử dụng các kiểu dữ liệu ban đầu không dùng nữa trong SQL Server 2005!
Damagedoods

Tôi không thể hoàn toàn chắc chắn rằng ứng dụng không thực hiện các công cụ cụ thể bằng văn bản / hình ảnh như WRITETEXT sẽ bị lỗi sau khi thay đổi loại dữ liệu. Nhưng trở lại điểm chính, có vẻ như việc tạo lại chỉ mục được nhóm sẽ không thực sự di chuyển dữ liệu LOB với nó.
db2

bạn có thể làm điều này nhưng bạn phải đi vào nhà thiết kế trong GUI, sau đó mở rộng các thuộc tính, sau đó bạn có một 'không gian dữ liệu thông thường' nhưng cũng là một tập tin văn bản, thay đổi điều này, nhưng hãy cẩn thận điều này sẽ tạo lại bảng! rõ ràng bạn có thể viết kịch bản này và chạy trong cửa sổ bảo trì nếu có thể
Damagedoods

Có nó, đó có thể là một cách hữu ích để tạo ra các kịch bản xây dựng lại phù hợp, ít nhất là.
db2

0

Tôi đã gặp phải một vấn đề tương tự với một công cụ của bên thứ ba cũng đang sử dụng kiểu dữ liệu hình ảnh để lưu trữ dữ liệu phi cấu trúc và tôi đã giải quyết nó bằng cách chuyển đổi cột để sử dụng filestream . Bạn sẽ cần thực hiện một số thử nghiệm để đảm bảo ứng dụng vẫn hoạt động như bạn mong đợi, nhưng điều này sẽ cung cấp cho bạn khả năng viết quy trình lưu trữ của riêng bạn để chuyển dữ liệu của bạn sang db lưu trữ một cách hiệu quả.


Tôi nghi ngờ filestream sẽ không có quy mô tốt trong trường hợp này. Chúng tôi đã có hơn 14 triệu hàng trên 17 cơ sở dữ liệu và chúng tôi nhận được tin nhắn vào khoảng 15.000 mỗi ngày. Một phần đáng kể của các nội dung thư dưới 4 KB, do đó, chất thải cụm NTFS có thể rất tàn bạo (và ngay cả khi chúng ta thêm một ổ đĩa mới với kích thước khối nhỏ hơn 64KB).
db2

Trong trường hợp đó, bạn có thể chuyển đổi kiểu dữ liệu thành một cái gì đó như nvarchar (max) và sử dụng mệnh đề TEXTIMAGE_ON để chỉ định một nhóm tệp khác cho các đối tượng lớn này không? Điều đó sẽ cho phép bạn lưu trữ dữ liệu ngoài hàng và cho phép tạo quy trình của riêng bạn để quản lý việc lưu trữ.
Liam Confrey

việc sử dụng filestream thực sự phụ thuộc vào mức độ lớn của mỗi LOBS. Tôi nghĩ> 1MB cho mỗi hồ sơ sẽ được xem xét. Vì vậy, tôi đồng ý trong trường hợp này không phải là một lựa chọn
Damagedoods
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.