2008-12-02 34 views
14

Nhiều cơ sở dữ liệu tôi đã gặp (Giống như SQL Server) sử dụng một tệp duy nhất để lưu trữ toàn bộ cơ sở dữ liệu. Đây có vẻ là một cách tiếp cận khá phổ biến. Những lợi thế để lưu trữ toàn bộ cơ sở dữ liệu trong một tệp duy nhất, như trái ngược với việc chia nhỏ dữ liệu thành các đơn vị hợp lý hơn, chẳng hạn như một bảng cho mỗi tệp.Tại sao và làm thế nào để Cơ sở dữ liệu sử dụng một tệp duy nhất để lưu trữ tất cả dữ liệu?

Ngoài ra, cơ sở dữ liệu hoạt động như thế nào trong nội bộ. Làm thế nào để nó xử lý đồng thời ghi vào cùng một tập tin bằng các chủ đề khác nhau. Trong hầu hết các ứng dụng tôi đã thấy bạn chỉ có thể có 1 mở ghi xử lý trên một tập tin tại một thời điểm. Làm thế nào để các công cụ cơ sở dữ liệu khác nhau xử lý việc ghi đồng thời.

Trả lời

22

Một tệp lớn không phân mảnh có thể được xử lý bởi ứng dụng máy chủ giống như đĩa thô được xử lý bởi hệ điều hành: một khối byte có thể tìm kiếm ngẫu nhiên. Các máy chủ cơ sở dữ liệu có thể, nếu nó đã chọn, thực hiện một hệ thống tập tin toàn bộ trên đầu trang của khối byte, nếu có một lợi ích để thực hiện các bảng như các tập tin riêng biệt.

Ghi đồng thời vào các phần khác nhau của cùng một tệp không phải là vấn đề. Cơ sở dữ liệu sử dụng các chiến lược khóa để đảm bảo rằng nhiều luồng không cố truy cập vào cùng một phần của tệp và đây là một trong những lý do chính khiến giao dịch cơ sở tồn tại: tách biệt các hiệu ứng có thể nhìn thấy của một giao dịch với một giao dịch khác.

Ví dụ: máy chủ cơ sở dữ liệu có thể theo dõi những hàng nào được truy cập theo đó các giao dịch trong chuyến bay; khi một giao dịch nghỉ hưu, các hàng mà nó đã chạm được phát hành để chúng có thể được truy cập tự do bởi các giao dịch khác. Trong trường hợp này, các giao dịch khác có thể chỉ chặn - tức là chờ - khi họ cố truy cập các hàng hiện đang là một phần của giao dịch khác. Nếu giao dịch khác không hoàn thành trong thời gian hợp lý (có thể cấu hình được), thì giao dịch chờ đợi có thể bị hủy bỏ. Thường thì lý do cho điều này là bế tắc. Sau đó, ứng dụng sử dụng cơ sở dữ liệu có thể chọn, nếu muốn, để thử lại giao dịch.

Khóa này có thể được triển khai bằng cách sử dụng các ẩn dụ hoặc các cơ chế đồng bộ hóa khác, tùy thuộc vào sự cân bằng hiệu suất.

+1

Vì vậy, tất cả ghi vào cơ sở dữ liệu phải chảy qua một semaphore phổ biến để chỉ viết 1 được thực hiện tại một thời điểm hoặc là có một số cách mà nó có nhiều ghi xử lý mở trên cùng một tệp? – Kibbee

+0

Không, việc triển khai đúng nhưng không thực hiện có thể sử dụng một semaphore duy nhất cho mỗi hàng. Lưu ý rằng mặc dù bộ nhớ đệm được sử dụng rất nhiều bởi các công cụ cơ sở dữ liệu, do đó, có khả năng chỉ có một luồng duy nhất đẩy các trang bẩn vào đĩa, giống như cơ chế tệp trang của hệ điều hành. –

+0

Tuy nhiên, những thứ như I/O/phân tán/thu thập I/O không đồng bộ chồng chéo có thể được sử dụng để có các hoạt động I/O đồng thời cho các phần khác nhau của cùng một tệp trên chuyến bay, vẫn chỉ sử dụng một luồng đơn. Các cơ chế chính xác được sử dụng phụ thuộc vào hệ thống, vì sự cân bằng sẽ khác nhau giữa các nền tảng –

5

Phải, một tệp nhất định chỉ có thể có một quy trình với bộ mô tả tệp mở, nếu không thì các quy trình khác nhau có thể ghi đè tác phẩm của nhau. Thông thường tất cả các I/O trên một cơ sở dữ liệu phải được thực hiện bởi quá trình RDBMS. Tất cả các ứng dụng sau đó gửi truy vấn của họ thông qua một số thông tin liên lạc quá trình (bao gồm cả mạng), và nhận được kết quả. Do đó, I/O vật lý của tệp cơ sở dữ liệu được tập trung. Nó cũng khá phổ biến, trong thực tế, cho việc triển khai RDBMS để có một chuỗi quản lý khóa để quản lý quyền truy cập vào các phần phụ của tệp, một trong hai bảng, trang hoặc hàng, tùy thuộc vào việc thực hiện RDBMS. Điều đó tạo ra một "nút cổ chai" bởi vì trong khi RDBMS có thể có nhiều luồng thực hiện truy vấn và thực hiện giao tiếp mạng, nhưng truy cập đồng thời vào một phần nhất định của cơ sở dữ liệu vẫn phải xếp hàng để lấy khóa. Sẽ rất khó khăn để quản lý khóa hoàn toàn song song.

Đối với tệp đơn so với nhiều tệp, ưu và nhược điểm cũng phụ thuộc vào việc triển khai RDBMS. Một ví dụ là InnoDB của MySQL mà theo mặc định sử dụng cách tiếp cận một tập tin. Nhưng nó không biết làm thế nào để thu nhỏ tập tin nếu bạn xóa một bó dữ liệu; nó chỉ đánh dấu một số không gian trong tệp là "miễn phí", được sử dụng bởi các lần chèn tiếp theo. Ngay cả khi bạn thả toàn bộ một bảng, tập tin không bao giờ co lại. Nhưng nếu bạn đã chọn tùy chọn tệp mỗi bảng khi bạn thiết lập không gian bảng InnoDB của mình và bạn thả một bảng, InnoDB có thể xóa tệp cho bảng đó và do đó giải phóng dung lượng đĩa.

4

Tôi nghĩ câu trả lời của Barry khá tuyệt vời. Tôi sẽ chỉ thêm một vài suy nghĩ nữa. Lưu ý loại mờ này giữa hệ thống tệp và thiết bị thô, điều này hoàn toàn khác nhau nhưng có thể được nghĩ về cùng một khái niệm.

Tại sao nhà cung cấp DBMS sẽ tự quản lý I/O của riêng họ, v.v. ??

kiểm soát

Khi hầu hết các hệ thống DBMS lớn lên (Oracle, DB2, Sybase ASE {SQL Server là một người anh họ để Sybase ASE}) Hệ thống tập tin hệ điều hành không phát triển như họ ngày hôm nay nhưng đang tiến triển nhanh chóng (Oracle được viết vào năm 1979 !!, Sybase năm 1987). Giả sử hệ điều hành có thể làm đủ mọi thứ ưa thích vừa nhanh vừa an toàn thì không phải lúc nào cũng được. Các nhà cung cấp DBMS đã viết các thư viện I/O của riêng họ để giúp giảm khả năng họ sẽ không bị ảnh hưởng bởi các hệ điều hành quirks hoặc trở nên lỗi thời khi công nghệ tiến triển.

Điều này ít phổ biến hơn (MySQL, PostgreSQL, SQLite, v.v. không làm điều này) - ngay cả SQL Server đã chuyển một phần lớn quản lý trở lại Windows vì nhóm Windows đã làm việc chặt chẽ với SQL Server để tối ưu hóa khối lượng công việc DBMS.

an

Giữ kiểm soát chặt chẽ của toàn bộ tập tin dữ liệu cho phép các DBMS để đảm bảo rằng viết xảy ra khi nó muốn nó và không phải khi hệ điều hành cảm thấy như nó. Giữ bộ đệm dữ liệu của riêng họ đảm bảo rằng hệ điều hành sẽ không nghĩ rằng một số trang công việc xoay vòng cấp thấp có dữ liệu cơ sở dữ liệu quan trọng.

quán

Oracle, Sybase ASE, vv là hệ thống rất đắt mà rất phức tạp. Nếu bạn đã bỏ ra 10 triệu đô la cho việc cài đặt DBMS và nó chạy chậm (hoặc tệ hơn, dữ liệu bị hỏng!) Vì một số lỗi điên rồ trong bản sửa đổi hạt nhân hệ điều hành của bạn, bạn sẽ đổ lỗi cho ai? Nhà cung cấp DBMS. Việc điều khiển I/O, quản lý khóa, kiểm soát đồng thời, luồng, vv của bạn chắc chắn là cách khó để thực hiện - nhưng khi bạn hoàn toàn cần lặp lại, hành vi nhất quán từ DBMS của bạn trên một loạt các hệ điều hành bạn phải thực hiện hệ điều hành ra khỏi phương trình càng nhiều càng tốt.

Một lần nữa, như hệ điều hành đã trưởng thành và phát triển, rất nhiều các hệ thống mới đã cố gắng sử dụng hệ điều hành cấp tính năng càng nhiều càng tốt, nhưng ngay cả MySQL có một số hồ đệm mà bạn có thể cấu hình trong my.cnf

0

Một lưu ý liên quan. Tôi tin rằng đó là khuyến nghị của MSFT rằng bạn tạo một nhóm tệp cho các bảng hệ thống của bạn và một cho các đối tượng khác của bạn. Một cái khác cũng có thể được tạo ra để lưu trữ các chỉ mục. Chúng tôi không làm điều này, vì không có ứng dụng nào của chúng tôi yêu cầu hiệu suất cao như vậy. Nó cũng sẽ làm tăng tính phức tạp của bảo trì.

Các vấn đề liên quan