24/05/2018, 22:09

Thiết kế cơ sở dữ liệu vật lý và những điều chỉnh thiết kế

Cách một DBMS thực thi những truy vấn và cập nhật thông thường là thước đo cuối cùng để đánh giá phần thiết kế cơ sở dữ liệu. DBA có thể cải thiện khả năng thực thi bằng cách xác định những nút cổ chai trong quá trình thực hiện và điều chỉnh một vài tham số ...

Cách một DBMS thực thi những truy vấn và cập nhật thông thường là thước đo cuối cùng để đánh giá phần thiết kế cơ sở dữ liệu. DBA có thể cải thiện khả năng thực thi bằng cách xác định những nút cổ chai trong quá trình thực hiện và điều chỉnh một vài tham số của DBMS (ví dụ, kích thước của buffer pool hoặc tần số của checkpointing) hoặc thêm phần cứng để loại bỏ những nút cổ chai. Tuy nhiên, bước đầu tiên để đạt được hiệu quả trong thực thi là lựa chọn được thiết kế cơ sở dữ liệu tốt, đây là nội dung chính của chương này.

Sau khi chúng ta thiết kế lược đồ khái niệm và lược đồ ngoài, tức là, tạo ra một tập các quan hệ và các khung nhìn cùng với một tập các ràng buộc tham chiếu, chúng ta sẽ tiến hành thiết kế cơ sở dữ liệu vật lý qua việc thiết kế lược đồ vật lý. Vì những yêu cầu của người dùng thường thay đổi nên phần thiết kế này cũng phải điều chỉnh thường xuyên.

Chương này được tổ chức như sau. Phần 1 cung cấp tổng quan về thiết kế cơ sở dữ liệu vật lý và các điều chỉnh. Phần quan trọng nhất trong thiết kế cơ sở dữ liệu vật lý là lựa chọn các chỉ mục. Chúng tôi trình bày phần hướng dẫn lựa chọn chỉ mục trong Phần 2. Những hướng dẫn này được minh hoạ thông qua một số ví dụ và phát triển thêm trong Phần 3. Phần 4 xem xét xem vấn đề phân cụm quan trọng như thế nào một cách cẩn thận; tiếp đến chúng tôi trình bày cách chọn các chỉ mục phân cụm và trả lời câu hỏi có nên lưu trữ các bộ giá trị trong các quan hệ khác nhau nằm cạnh nhau hay không (lựa chọn này được một số DBMS hỗ trợ). Phần 5 tập trung vào giải thích việc lựa chọn chỉ mục tốt có thể thực hiện một số truy vấn mà không cần phải tìm kiếm trong phần dữ liệu thực. Phần 6 bàn về các công cụ có thể giúp DBA tự động lựa chọn chỉ mục.

Phần 7 nghiên cứu những vấn đề chính của việc điều chỉnh cơ sở dữ liệu. Để điều chỉnh các chỉ mục, chúng ta có lẽ phải điều chỉnh lược đồ khái niệm cũng như tần số sử dụng truy vấn và việc định nghĩa các khung nhìn. Chúng tôi trình bày cách điều chỉnh truy vấn và các định nghĩa khung nhìn trong Phần 9. Chúng tôi trình bày tóm tắt ảnh hưởng của truy cập tương tranh trong Phần 10. Phần 11 minh hoạ việc điều chỉnh trên ví dụ cửa hàng Internet. Chúng tôi tổng kết chương này bằng việc trình bày những tiêu chuẩn giúp đánh giá DBMS trong Phần 12; các tiêu chuẩn này hỗ trợ đánh giá khả năng thực thi của DBMS.

Giống như tất cả các phần thiết kế cơ sở dữ liệu khác, thiết kế vật lý phải được định hướng bởi yếu tố tự nhiên của dữ liệu và những chức năng gì mà người dùng mong muốn sử dụng. Cụ thể, chúng ta phải hiểu về những luồng công việc điển hình mà cơ sở dữ liệu phải hỗ trợ, luồng công việc bao gồm cả các truy vấn và cập nhật dữ liệu. Người dùng cũng có một số yêu cầu về việc tốc độ thực hiện các truy vấn hoặc việc những cập nhật nào phải được thực thi hoặc có bao nhiêu giao dịch phải được xử lý mỗi giây. Biểu diễn luồng công việc và những yêu cầu thực thi của người dùng là cơ sở để tiến hành thiết kế cơ sở dữ liệu vật lý.

Xác định những nút cổ chai: Tất cả các hệ thống thương mại đều cung cấp các công cụ phù hợp dùng để điều chỉnh các tham số hệ thống. Những công cụ này có thể giúp xác định các nút cổ chai và đề xuất các khía cạnh liên quan đến thiết kế cơ sở dữ liệu và phần chương trình ứng dụng cần thiết giúp điều chỉnh việc thực thi. Ví dụ, chúng ta có thể yêu cầu DBMS giám sát quá trình thực hiện của cơ sở dữ liệu trong một khoảng thời gian và báo số lượng các cụm được quét, số con trỏ được mở, các yêu cầu khoá, checkpoints, số các buffer được quét, thời gian đợi trung bình của các khoá, và nhiều những thống kê khác. Trong Oracle, một báo cáo chứa những thông tin này có thể được đưa ra bằng cách chạy một script gọi là UTLBSTAT.SQL để khởi động việc giám sát và một script UTLBSTAT.SQL để dừng việc này. Danh mục hệ thống sẽ chứa thông tin chi tiết về các bảng, phân bố các giá trị trong các chỉ mục khóa. Một kế hoạch mà DBMS đưa ra nhằm thực hiện một truy vấn nào đó có thể được nhìn thấy trong một màn hình cùng với giá ước lượng đối với mỗi phép toán. Tuỳ vào từng nhà cung cấp, những thông số chi tiết có thể khác nhau, nhưng tất cả các sản phẩm DBMS phổ biến trên thị trường ngày nay đều cung cấp các công cụ nói trên.

Để tạo ra một thiết kế cơ sở dữ liệu vật lý tốt và điều chỉnh sao cho hệ thống này thực hiện phù hợp với những yêu cầu nảy sinh mới của người dùng, người thiết kế phải hiểu được những công việc của một DBMS, đặc biệt là những công nghệ xử lý truy vấn và chỉ mục mà nó hỗ trợ. Nếu cơ sở dữ liệu này có nhiều người sử dụng đồng thời, hoặc nó là cơ sở dữ liệu phân tán, thì các công việc trở nên phức tạp hơn.

Chúng tôi trình bày những ảnh hưởng của tương tranh đối với việc thiết kế cơ sở dữ liệu trong Phần 10 và cơ sở dữ liệu phân tán trong Chương 22.

Luồng công việc của cơ sở dữ liệu

Chìa khoá để thiết kế vật lý tốt là phải có được một biểu diễn chính xác của các luồng công việc mong muốn. Biểu diễn luồng công việc bao gồm:

  1. Danh sách các truy vấn (cùng với tần suất của chúng).
  2. Danh cách các cập nhật và tần suất của chúng.
  3. Những đích cần đạt đến của mỗi kiểu truy vấn và cập nhật.

Với mỗi truy vấn trong một luồng công việc, chúng ta phải xác định:

  • Các quan hệ nào cần phải truy cập.
  • Những thuộc tính nào phải giữ lại (trong mệnh đề SELECT).
  • Những thuộc tính nào phải lấy hoặc các điều kiện kết nối (trong mệnh đề WHERE).

Tương tự, với mỗi cập nhật trong luồng công việc, chúng ta phải xác định:

  • Lựa chọn những thuộc tính nào và các điều kiện nối (trong mệnh đề WHERE).
  • Kiểu cập nhật (INSERT, DELETE, hoặc UPDATE) và các quan hệ được cập nhật.
  • Với các lệnh cập nhật, những trường (cột) nào sẽ thay đổi.

Ghi nhớ rằng các truy vấn và các cập nhật có thể có các tham số, ví dụ một thao tác ghi nợ hoặc thanh toán sẽ có tham số là số tài khoản cụ thể của một người nào đó.

Việc cập nhật bao giờ cũng chứa thành phần truy vấn để tìm ra các bộ giá trị cần được cập nhật. Thành phần này có thể được thực hiện tốt nếu chúng ta thiết kế vật lý tốt và có sự hiện diện của các chỉ mục.

Mặt khác, cập nhật luôn kéo theo một công việc khác đó là cập nhật các chỉ mục chứa các thuộc tính tính đã bị thay đổi. Vì thế, trong khi các truy vấn có thể được hưởng lợi từ sự hiện diện của chỉ mục thì các chỉ mục lại có thể làm tăng hoặc giảm tốc độ cập nhật. Người thiết kế luôn phải lưu ý đến điều này khi tạo ra các chỉ mục.

Các quyết định khi thiết kế vật lý và điều chỉnh

Những quyết định quan trong trong quá trình thiết kế cơ sở dữ liệu vật lý và điều chỉnh cơ sở dữ liệu bao gồm:

1. Lựa chọn những chỉ mục nào được tạo:

  • Những quan hệ nào được chỉ mục và trường nào hoặc kết hợp một số trường để tạo ra chỉ mục khoá tìm kiếm.
  • Với mỗi chỉ mục, xác định xem nó nên được phân cụm hay không phân cụm?

2. Điều chỉnh lược đồ khái niệm:

  • Lựa chọn lược đồ chuẩn hoá: Chúng ta có nhiều hơn một cách để phân rã một lược đồ thành các quan hệ con ở dạng chuẩn mong muốn (BCNF hoặc 3NF). Quyết định chọn lược đồ nào sẽ dựa vào các điều kiện trong quá trình thực thi.
  • Phi chuẩn hoá: Để cải thiện tốc độ thực thi các truy vấn, chúng ta sẽ xem xét lại các lược đồ phân rã đưa ra do việc chuẩn hoá khi thiết kế lược đồ khái niệm.
  • Phân tách theo chiều dọc: Tuỳ theo tình trạng hiện tại, chúng ta có thể muốn quan hệ được phân rã sâu hơn nữa nhằm cải thiện tốc độ thực hiện các truy vấn chỉ bao gồm một vài thuộc tính.
  • Khung nhìn: Chúng ta có lẽ muốn thêm một vài khung nhìn để che giấu những thay đổi trong lược đồ khái niệm.

3. Điều chỉnh truy vấn và giao dịch: Các truy vấn được thực hiện một cách liên tục và các giao dịch có lẽ cần được viết lại để chạy nhanh hơn.

Trong cơ sở dữ liệu phân tán và song song chúng ta sẽ bàn đến trong Chương 22, có một số lựa chọn để xem xét như phân chia một quan hệ ra các site khác nhau hay là lưu trữ bản sao của nó ở nhiều site.

Sự cần thiết phải điều chỉnh cơ sở dữ liệu

Những thông tin chi tiết về luồng thực thi có lẽ khó có được ngay từ khi bắt đầu thiết kế. Do đó, điều chỉnh một cơ sở dữ liệu sau khi nó đã được thiết kế và phát triển là một việc làm quan trọng- chúng ta phải cải tiến thiết kế ban đầu để đạt được hiệu quả thực thi tốt nhất.

Sự khác nhau giữa thiết kế cơ sở dữ liệu và điều chỉnh cơ sở dữ liệu đôi khi mang tính chất chủ quan. Chúng ta có thể coi kết quả của quá trình thiết kế là lược đồ khái niệm ban đầu, tập các chỉ mục và các phân cụm sẽ được tạo. Bất kể sự thay đổi nào tới lược đồ khái niệm và các lựa chọn chỉ mục và phân cụm trên đều được coi là chỉnh sửa. Chúng ta có thể coi một vài điều chỉnh của lược đồ khái niệm (và các quyết định thiết kế vật lý tạo ra do những điều chỉnh này) là một phần của quá trình thiết kế vật lý. Việc đánh giấu giữa thiết kế và hiệu chỉnh là không quan trọng, và khi chúng ta trình bày về những lựa chọn chỉ mục và điều chỉnh cơ sở dữ liệu không cần đề cập tới những điều chỉnh này đã thực hiện khi nào.

Khi xem xét những chỉ mục nào nên được tạo, chúng ta bắt đầu từ danh sách các truy vấn (bao gồm cả các truy vấn là một phần của thao tác cập nhật). Trước hết, chỉ những quan hệ được một vài truy vấn truy cập đến mới được xem là các ứng cử viên để đánh chỉ mục, và việc lựa chọn thuộc tính nào làm chỉ mục tuỳ thuộc vào các điều kiện xuất hiện trong các mệnh đề WHERE. Sự hiện diện của các chỉ mục thích hợp có thể cải thiện đáng kể khả năng thực thi truy vấn, như đã trình bày trong Chương 8 và 12.

Một cách tiếp cận để lựa chọn chỉ mục là xem xét những truy vấn quan trọng nhất và với mỗi truy vấn chúng ta sẽ chỉ định sử dụng các chỉ mục nào trong kế hoạch thực hiện của nó. Sau đó chúng ta cân nhắc xem liệu có thể có được một kế hoạch thực hiện tốt hơn không nếu chúng ta bổ sung thêm một số chỉ mục nữa; nếu có, những chỉ mục bổ sung này sẽ là ứng cử viên trong danh sách chỉ mục của chúng ta. Nói chung, những truy cập phạm vi hưởng lợi từ chỉ mục B+tree, và những truy cập so-sánh-chính-xác hưởng lợi từ chỉ mục băm. Việc phân cụm có lợi cho những truy vấn phạm vi, và nó có lợi cho những truy vấn so-sánh-chính-xác nếu một vài cổng vào dữ liệu chứa cùng giá trị khoá.

Tuy nhiên, trước khi thêm một chỉ mục vào danh sách chúng ta phải xem xét tác động của nó đối với thao tác cập nhật. Như chúng ta đã lưu ý ở phía trên, mặc dù chỉ mục có thể làm tăng tốc độ của thành phần truy vấn trong câu lệnh cập nhật, nhưng tất cả các chỉ mục có liên quan đến thuộc tính đã thay đổi phải được cập nhật theo. Vì thế, chúng ta phải cân nhắc khả năng một số phép toán cập nhật chịu tốc độ chậm để tăng tốc độ của những truy vấn khác.

Rõ ràng, để lựa chọn các chỉ mục tốt cho một luồng công việc nào đó yêu cầu chúng ta phải có những hiểu biết về các công nghệ chỉ mục và những gì bộ tối ưu hoá truy vấn làm. Những hướng dẫn sau về lựa chọn chỉ mục tổng kết những tranh luận của chúng ta:

Có nên chỉ mục (Hướng dẫn 1): Không nên xây dựng một chỉ mục nào đó nếu nó không phục vụ cho một vài truy vấn – bao gồm cả các truy vấn là thành phần của lệnh cập nhật - hưởng lợi từ nó. Bất cứ khi nào có thể, hãy lựa chọn các chỉ mục làm tăng tốc độ của nhiều hơn một truy vấn.

Lựa chọn Khoá tìm kiếm (Hướng dẫn 2): Các thuộc tính có trong một mệnh đề WHERE nào đó là các ứng cử viên được đánh chỉ mục.

  • Điều kiện lọc so-sánh-chính-xác khuyên chúng ta xem xét một chỉ mục trên các thuộc tính được lọc, lý tưởng là một chỉ mục băm.
  • Điều kiện lọc phạm vi khuyên chúng ta xem xét một chỉ mục B+tree (hoặc ISAM) trên các thuộc tính được lọc. Một chỉ mục B+tree thường tốt hơn một chỉ mục ISAM. Lựa chọn một chỉ mục ISAM nếu quan hệ này thường xuyên được cập nhật, nhưng để đơn giản chúng ta thừa nhận rằng một chỉ mục B+tree luôn được ưu tiên lựa chọn trước chỉ mục ISAM.

Các khoá tìm kiếm là đa-thuộc-tính (Hướng dẫn 3): Các chỉ mục với khoá tìm kiếm là đa-thuộc-tính nên được xem xét trong hai trường hợp sau:

  • Mệnh đề WHERE chứa các điều kiện gồm nhiều hơn một thuộc tính của một quan hệ.
  • Hệ thống cung cấp các chiến lược đánh giá chỉ-chỉ-số (tức là, việc truy cập các quan hệ có thể được tránh) đối với những truy vấn quan trọng. (Trường hợp này có thể dẫn đến một số thuộc tính nằm trong khoá tìm kiếm mặc dù chúng không xuất hiện trong mệnh đề WHERE.)

Khi khoá tìm kiếm là đa-thuộc-tính, các truy vấn phạm vi phải thận trọng với thứ tự các thuộc tính trong khoá tìm kiếm để tương ứng với các truy vấn.

Cân nhắc khi phân cụm (Hướng dẫn 4): Có nhiều nhất một chỉ mục phân cụm trên một quan hệ, và việc phân cụm ảnh hưởng rất lớn đến quá trình thực thi; vì thế lựa chọn chỉ mục nào được phân cụm là rất quan trọng.

  • Các truy vấn phạm vi dường như được hưởng lợi nhiều nhất từ việc phân cụm. Nếu một số truy vấn phạm vi được đưa ra trên một quan hệ nào đó, lấy ra các tập thuộc tính khác nhau, hãy xem xét điều kiện lọc trong các truy vấn và tần suất thực hiện của chúng trong luồng công việc để đi đến quyết định chỉ mục nào được phân cụm.
  • Nếu một chỉ mục nào đó được dùng trong một chiến lược đánh giá chỉ-chỉ-số, thì chỉ mục này không cần phân cụm. (Chỉ phân cụm khi chỉ mục này được sử dụng để truy cập các bộ giá trị ở các quan hệ nằm phía dưới).

Chỉ mục băm hay chỉ mục cây (Hướng dẫn 5): Chỉ mục B+tree thường tốt hơn cho các truy vấn miền và truy vấn bằng. Chỉ mục băm là tốt hơn trong những trường hợp sau:

  • Chỉ mục được hy vọng sẽ hỗ trợ nối lặp lồng nhau chỉ mục; quan hệ chỉ mục là quan hệ phía trong, và khoá tìm kiếm chứa các cột có tính năng kết nối.
  • Luồng công việc có một truy vấn bằng rất quan trọng chứa các thuộc tính khoá tìm kiếm, và không có các truy vấn phạm vi.

Cân đối với giá phải trả để duy trì chỉ mục (Hướng dẫn 6): Khi đưa ra quyết định tạo chỉ mục, chúng ta phải cân nhắc ảnh hưởng của mỗi chỉ mục đối với việc cập nhật trong các luồng công việc.

  • Nếu việc duy trì một chỉ mục nào đó làm chậm đi các phép toán cập nhật thường xuyên thì chúng ta phải xem xét để xoá chỉ mục này.
  • Tuy nhiên, việc thêm một chỉ mục nào đó có thể làm tăng tốc độ thực hiện của một phép cập nhật. Ví dụ, một chỉ mục trên Emloyee IDs có thể làm tăng tốc độ của việc tăng lương cho một nhân viên nào đó (được xác định bằng ID).

Các ví dụ sau minh hoạ cách lựa chọn chỉ mục trong quá trình thiết kế cơ sở dữ liệu, tiếp tục với những tranh luận trong Chương 8, nơi chúng ta đã tập trung bàn về lựa chọn chỉ mục đối với các truy vấn trên một bảng đơn. Lược đồ được sử dụng trong các ví dụ sau không được biểu diễn một cách chi tiết, chúng chỉ chứa tên các thuộc tính. Các thông tin bổ sung được biểu diễn khi cần thiết.

Hãy cùng chúng tôi bắt đầu với một ví dụ đơn giản:

SELECT E.ename, D.mgr
FROM Employees E, Departments D
WHERE D.dname= ‘Toy’ AND E.dno=D.dno

Các quan hệ được đề cập trong truy vấn này là Employees và Departments, và cả hai điều kiện trong mệnh đề WHERE đều là điều kiện bằng. Những hướng dẫn chúng ta đã nghiên cứu ở trên khuyên chúng ta nên xây dựng một chỉ mục băm trên thuộc tính dname của quan hệ Departments. Nhưng cân nhắc đến điều kiện bằng E.dno=D.dno, chúng ta nên xây dựng một chỉ mục (tất nhiên là chỉ mục băm) trên thuộc tính dno của Departments hoặc Employees (hoặc cả hai)? Thực chất chúng ta muốn truy cập các bộ giá trị trong Departments sử dụng chỉ mục trên dname vì chỉ có một vài bộ giá trị thoả mãn điều kiện D.dname=‘Toy’. Với mỗi bộ giá trị Departments thoả mãn, chúng ta tìm các bộ giá trị tương ứng trong Employees bằng việc sử dụng một chỉ mục trên thuộc tính dno của Employees. Vì thế, chúng ta nên xây dựng một chỉ mục trên trường dno của Employees. (Ghi nhớ rằng chẳng có ích lợi gì khi xây dựng một chỉ mục nữa trên trường dno của Departments vì các bộ giá trị Departments được truy cập sử dụng chỉ mục dname).

Việc lựa chọn chỉ mục được định hướng bởi kế hoạch đánh giá truy vấn mà chúng ta muốn sử dụng. Quá trình lựa chọn kế hoạch đánh giá truy vấn sẽ được thực hiện cùng với lựa chọn thiết kế vật lý vì tối ưu hoá truy vấn thực sự rất hữu ích cho thiết kế vật lý. Chúng tôi chỉ ra một kế hoạch tốt đối với truy vấn này trong Hình 1.

Xem xét một thay đổi của truy vấn này, giả sử rằng mệnh đề WHERE được sửa thành WHERE D.dname = ‘Toy’ AND E.dno=D.dno AND E.age=25. Hãy cùng chúng tôi xem xét một số kế hoạch khác. Một kế hoạch tốt ở đây là truy cập các bộ giá tri trong Departments thoả mãn điều kiện chọn của dname, sau đó truy cập các bộ giá trị tương ứng trong Employees bằng cách sử dụng một chỉ mục trên trường dno; phép chọn trên age sau đó được áp dụng theo kiểu on-the-fly. Tuy nhiên, không như những thay đổi trước của truy vấn này, chúng ta không thực sự cần có một chỉ mục trên trường dno của Employees nếu chúng ta có một chỉ mục nào đó trên trường age. Trong trường hợp này chúng ta có thể truy cập các bộ giá trị của Departments thoả mãn điều kiện chọn trên dname (bằng việc sử dụng chỉ mục trên dname, như phần trước), truy cập các bộ giá trị của Employees thoả mãn điều kiện chọn trên age sử dụng chỉ mục trên age, và kết nối những tập giá trị này lại. Vì các tập giá trị chúng ta nối lại là nhỏ, nên chúng có thể nằm vừa trong bộ nhớ và việc xem xét cách thức kết nối không còn quan trọng nữa. Kế hoạch này dường như không tốt như kế hoạch sử dụng một chỉ mục trên dno, nhưng nó cũng là một lựa chọn hợp lý. Vì thế, nếu chúng ta đã có một chỉ mục trên age (đã được sử dụng trong một truy vấn nào đó trong luồng công việc), thì chúng ta nên sử dụng chỉ mục này.

Một kế hoạch đánh giá truy vấn lý tưởng

Truy vấn tiếp theo của chúng ta có chứa một điều kiện chọn phạm vi:

SELECT E.ename, D.dname
FROM 	Employees E, Departments D
WHERE E.sal BETWEEN 10000 AND 20000 AND E.hobby='Stamps'
AND E.dno=D.dno	

10000 < E.sal AND E.sal < 20000

Người ta khuyến khích sử dụng phép toán BETWEEN để biểu diễn các điều kiện phạm vi vì nó dễ dàng cho cả người dùng và cả bộ tối ưu hoá.

Trở lại với ví dụ truy vấn này, cả hai điều kiện chọn đều ở trên quan hệ Employees. Vì thế, dễ dành nhận ra rằng kế hoạch tốt nhất trong trường hợp này là Employees sẽ đóng vai trò là quan hệ phía ngoài và Departments là quan hệ phía trong giống như trong truy vấn trước, và chúng ta nên xây dựng một chỉ mục băm trên thuộc tính dno của Departments. Nhưng chỉ mục nào trên Employees là tốt nhất? Một chỉ mục B+tree trên thuộc tính sal sẽ phù hợp với phép chọn phạm vi, đặc biệt nếu nó là một chỉ mục được phân cụm. Một chỉ mục băm trên thuộc tính hobby sẽ phù hợp với điều kiện chọn bằng. Nếu một trong những chỉ mục này đang sẵn sàng, thì chúng ta có thể truy cập các bộ giá trị trong Employees bằng cách sử dụng chỉ mục này, truy cập các bộ giá trị tương ứng trong Departments sử dụng chỉ mục trên dno, và thực hiện tất cả các điều kiện chọn còn lại và các phép chiếu theo kiểu on-the-fly. Nếu cả hai chỉ mục này đang sẵn sàng, bộ tối ưu hoá sẽ lựa chọn chỉ mục thích hợp hơn để thực hiện truy vấn, tức là nó sẽ xem xét điều kiện chọn nào (điều kiện chọn phạm vi trên salary hoặc điều kiện chọn bằng trên hobby) có ít bộ giá trị thoả mãn hơn. Nói chung, chỉ mục nào thích hợp hơn tuỳ thuộc vào dữ liệu. Nếu có rất ít người có salary nằm trong phạm vi đã cho và có rất nhiều người có sở thích là stamps thì chỉ mục B+tree là lựa chọn tốt nhất. Ngược lại, chỉ mục băm trên hobby là tốt nhất.

Các chỉ mục phân cụm có thể trở nên đặc biệt quan trọng trong khi truy cập các quan hệ phía trong của một nối lặp lồng nhau chỉ mục nào đó. Để hiểu được mối quan hệ giữa các chỉ mục phân cụm và các liên kết, hãy cùng chúng tôi xem lại ví dụ đầu tiên của chúng ta:

SELECT E.ename, D.mgr
FROM Employees E, Departments D	
WHERE D.dname= ‘Toy’ AND E.dno=D.dno

Chúng ta đã kết luận rằng một kế hoạch tốt để thực hiện truy vấn này là sử dụng một chỉ mục trên dname để truy cập các bộ giá trị trong Departments thoả mãn điều kiện trên dname và tìm những bộ giá trị tương ứng của Employees sử dụng chỉ mục trên dno.

Các chỉ mục này có nên được phân cụm?

Giả sử số lượng các bộ giá trị thoả mãn điều kiện D.dname= ‘Toy’ nhỏ, thì chúng ta nên xây dựng một chỉ mục phân cụm trên dname. Mặc khác, Employees là bảng phía trong của nối lặp lồng nhau chỉ mục và dno không phải là khoá dự tuyển. Trường hợp này rất nên sử dụng chỉ mục phân cụm trên trường dno của Employees. Thực tế vì liên kết này chứa các phép chọn bằng lặp đi lặp lại trên trường dno của quan hệ phía trong, truy vấn kiểu này được khuyến khích là tạo ra một chỉ phân cụm trên trường dno hơn là kiểu truy vấn đơn giản trên trường hobby như trong ví dụ trước. (Tất nhiên, hai yếu tố là dữ liệu nào cần được lấy ra (phép lọc) và tần số của truy vấn cũng phải được đưa vào xem xét.)

Ví dụ tiếp theo cũng tự như ví dụ trước, minh hoạ các chỉ mục phân cụm được sử dụng như thế nào trong các liên kết sắp-xếp-trộn (sort-merge joins):

SELECT E.ename, D.mgr
FROM Employees E, Departments D
WHERE E.hobby='Stamps' AND E.dno=D.dno

Truy vấn này khác với truy vấn trước ở chỗ điều kiện E.hobby = ‘Stamps’ thay thế D.dname ='Toy'. Dựa trên giả thiết rằng chỉ có một vài nhân viên trong phòng ‘Toy’, chúng ta đã lựa chọn các chỉ mục phù hợp với phép nối lặp lồng nhau chỉ mục cùng với Departments là quan hệ phía ngoài. Bây giờ, hãy cùng chúng tôi giả sử rằng có rất nhiều nhân viên có sở thích là stamps. Trong trường hợp này, một phép lặp lồng nhau trên khối hoặc nối sắp-xếp-trộn có lẽ hiệu quả hơn. Nối sắp-xếp-trộn có thể sử dụng các lợi thế của chỉ mục phân cụm B+tree trên thuộc tính dno của Departments để truy cập các bộ giá trị và do đó tránh phải sắp xếp bảng Departments. Lưu ý rằng nếu sử dụng chỉ mục không phân cụm sẽ không hiệu quả - vì tất cả các bộ giá trị sẽ được truy cập, việc thực hiện một thao tác I/O đối với mỗi bộ giá trị dường như phải trả giá quá đắt. Nếu không có chỉ mục trên trường dno của Employees, chúng ta có thể truy cập các bộ giá trị của Employees (có thể sử dụng một chỉ mục trên trường hobby, đặc biệt khi chỉ mục này được phân cụm), áp dụng phép lọc E.hobby='Stamps' theo kiểu on-the-fly, và sắp xếp những bộ giá trị thoả mãn theo trường dno.

Những tranh luận của chúng ta chỉ ra rằng khi chúng ta truy cập các bộ giá trị sử dụng một chỉ mục nào đó, ảnh hưởng của việc phân cụm phụ thuộc vào số lượng các bộ giá trị được truy cập, tức là, số lượng các bộ giá trị thoả mãn các điều kiên chọn thích hợp với chỉ mục đó. Một chỉ mục không phân cụm chỉ tốt bằng một chỉ mục phân cụm khi phép chọn chỉ truy cập đến một bộ giá trị duy nhất (ví dụ, một phép chọn bằng trên một khoá dự tuyển). Khi số lượng các bộ giá trị được truy cập tăng lên, sử dụng chỉ mục không phân cụm phải trả giá đắt hơn vượt xa so với việc quét tuần tự toàn bộ quan hệ. Việc quét tuần tự truy cập toàn bộ các bộ giá trị, nhưng mỗi trang được truy cập chính xác một lần, trong khi đó mỗi trang có thể được truy cập nhiều lần bằng số lượng các bản ghi bên trong nó nếu chúng ta sử dụng một chỉ mục không phân cụm. Nếu blocked I/O được thực hiện (như phổ biến), những ưu điểm của quét tuần tự so với sử dụng chỉ mục không phân cụm tăng dần lên.

Chúng ta minh hoạ mối quan hệ giữa số lượng các bộ giá trị truy cập biểu diễn bằng tỷ lệ so với tổng số bộ giá trị có trong quan hệ, và giá của các phương pháp truy cập khác nhau trong Hình 2. Để đơn giản, chúng ta giả sử rằng truy vấn này là một phép chọn trên chỉ một quan hệ. (Hình này phản ánh giá của việc viết ra kết quả; và đường của quét tuần tự là một mặt phẳng.)

Ảnh hưởng của việc phân cụm

Đồng-phân-cụm hai quan hệ

Trong phần trình bày về kiến trúc hệ thống cơ sở dữ liệu ở Chương 9, chúng ta đã giải thích về một quan hệ được lưu trữ trong một file như thế nào. Mặc dù một file thường chỉ chứa các bản ghi của một quan hệ, nhưng một vài hệ thống cho phép các bản ghi của nhiều hơn một quan hệ được lưu trong một file. Với cách này, người dùng cơ sở dữ liệu có thể yêu cầu các bản ghi của hai quan hệ có thể được đặt cạnh nhau theo một quy luật tự nhiên. Cách sắp đặt dữ liệu như thế này đôi khi được nói tới như là đồng-phân-cụm của hai quan hệ. Bây giờ chúng ta bàn về vấn đề khi nào đồng-phân-cụm có thể mang lại lợi ích.

Ví dụ, xem xét hai quan hệ với lược đồ như sau:

Parts(pid: integer, pname: string, cost: integer, supplierid: integer)

Assembly(partid: integer, componentid: integer, quantity: integer)

Trong lược đồ này, trường componentid của Assembly (Sản phẩm kết hợp) tham chiếu tới pid của một Parts (Sản phẩm) nào đó. Vì thế, bảng Assembly biểu diễn mối liên kết 1:N giữa Parts và Subparts (Sản phẩm con) của nó; một sản phẩm có thể có nhiều sản phẩm con, nhưng mỗi sản phẩm là một sản phẩm con của nhiều nhất một sản phẩm. Trong bảng Parts, pid là khoá. Với các sản phẩm kết hợp (những sản phẩm được lắp giáp từ các sản phẩm khác, như nội dung của bảng Assembly chỉ ra), trường cost được tính từ giá của các sản phẩm con của nó.

Giả sử rằng có một truy vấn thường xuyên xảy ra là tìm ra (ngay lập tức) các sản phẩm con của tất cả các sản phẩm do một nhà sản xuất nào đó cung cấp:

SELECT P.pid, A.componentid 
FROM Parts P, Assembly A		
WHERE P.pid = A.partid AND P.supplierid = ‘Acme’

Một kế hoạch tốt để thực hiện truy vấn này là áp điều kiện chọn trên bảng Parts và sau đó truy cập các bản ghi phù hợp của Assembly thông qua một chỉ mục nào đó trên trường partid. Chỉ mục này trên partid nên được phân cụm là tốt nhất. Chúng tôi khẳng định kế hoạch này là tốt. Tuy nhiên, nếu chúng ta muốn tối ưu hoá chúng thêm nữa, thì chúng ta có thể đồng-phân-cụm trên hai bảng này. Với cách tiếp cận này, chúng ta sẽ lưu các bản ghi của hai bảng cùng với nhau, với mỗi bản ghi Part(P) sẽ có tất cả các bản ghi của Assembly(A) thoả mãn P.pid = A.partid theo sau. Cách tiếp cận này cải thiện được việc lưu trữ hai quan hệ tách rời nhau và việc có một chỉ mục phân cụm trên partid bởi vì nó không cần một chỉ mục giúp tìm ra các bản ghi ở Assembly tương ứng với một bản ghi nào đó của Parts. Vì thế, với mỗi truy vấn, chúng ta ghi lại một vài (điển hình là hai hoặc ba) trang chỉ mục I/Os.

Nếu chúng ta quan tâm đến việc tìm ra các sản phẩm con của tất cả các sản phẩm ngay lập tức (tức là, truy vấn trước không có điều kiện chọn trên supplierid),việc tạo ra một chỉ mục phân cụm trên partid và thực hiện một nối lặp lồng nhau chỉ mục trong đó Assembly là quan hệ phía trong được coi là một kế hoạch tốt. Thậm chí có một chiến lược tốt hơn nữa là tạo ra một chỉ mục phân cụm trên trường partid của Assembly và trường pid của Parts, sau đó thực hiện một sắp-xếp-trộn, sử dụng các chỉ mục để truy cập các bộ giá trị theo thứ tự được sắp. Chiến lược này có thể so sánh được với việc sử dụng đồng-phân-cụm, cách mà chỉ việc quét trên tập các bản ghi (của Parts và Assembly, nơi lưu trữ cùng nhau theo cơ chế xen lẫn).

Lợi ích thực sự của đồng-phân-cụm được minh hoạ trong truy vấn sau:

SELECT P.pid, A.componentid
FROM Parts P, Assembly A		
WHERE P.pid = A.partid AND P.cost=10

Giả sử rằng có rất nhiều Part có cost=10. Truy vấn này về bản chất sẽ đưa ra một tập các bản ghi của Parts và các bản ghi tương ứng của Assembly. Nếu chúng ta có một chỉ mục nào đó trên trường cost của Parts, chúng ta có thể truy cập các bộ giá trị thoả mãn của Parts. Với mỗi bộ giá trị, chúng ta phải sử dụng chỉ mục này trên Assembly để xác định vị trí các bản ghi có pid đã biết. Nếu chúng ta sử dụng tổ chức đồng-phân-cụm chúng ta có thể tránh được chỉ mục này trên Assembly. (Tất nhiên, vẫn cần một chỉ mục trên thuộc tính cost của Parts).

Như vậy tối ưu hoá đặc biệt quan trọng khi chúng ta muốn duyệt qua một vài mức của phân cấp sản phẩm-sản phẩm con (part-subpart). Ví dụ, một truy vấn phổ biến là tìm tổng giá thành của một sản phẩm nào đó, truy vấn này yêu cầu chúng ta thực hiện lặp đi lặp lại kết nối giữa Parts và Assembly. Thêm nữa, chúng ta có thể không biết số lượng các mức trong phân cấp, số lượng các kết nối khác nhau và truy vấn này không thể được biểu diễn trong SQL. Truy vấn này có thể được thực hiện bằng cách kết hợp sử dụng ngôn ngữ lập trình. Như vậy, đồng-phân-cụm mang lại những lợi ích đặc biệt trong trường hợp một kết nối nào đó thường xuyên được thực hiện.

Tổng kết về đồng-phân-cụm:

  • Nó có thể làm tăng tốc độ các kết nối, cụ thể là các kết nối khoá-khoá ngoại tương ứng với mối liên kết 1:N:
  • Việc quét tuần tự một trong hai quan hệ trở nên chậm hơn. (Trong ví dụ của chúng ta, vì một số bộ giá trị của Assembly được lưu trữ giữa các bộ giá trị Parts kề nhau, nên việc quét tất cả các bộ giá trị của Parts trong trường hợp này chậm hơn khi nó được lưu trữ tách rời. Tương tự, việc quét tuần tự tất cả các bộ giá trị của Assembly cũng chậm hơn).
  • Tất cả các thao tác thêm, xoá, và cập nhật làm biến đổi chiều dài bản ghi cũng chậm hơn do phải duy trì việc phân cụm. (Chúng ta không bàn về các vần đề thực thi của đồng-phân-cụm ở đây).

Phần này xem xét một số truy vấn mà chúng ta có thể tìm ra được các kế hoạch thực hiện chúng hiệu quả hơn bằng cách tránh truy cập các bộ giá trị trong các quan hệ tham chiếu; kế hoạch này sẽ quét một chỉ mục liên quan nào đó (chỉ mục này dường như nhỏ hơn nhiều). Chỉ mục được sử dụng chỉ trong việc quét chỉ-chỉ-số không phải phân cụm vì các bộ giá trị trong quan hệ chỉ mục này không cần được truy cập.

Truy vấn này đưa ra các người quản lý của các phòng/ban có ít nhất một nhân viên:

SELECT D.mgr
FROM Departments D, Employees E
WHERE D.dno=E.dno

Quan sát thấy rằng không có thuộc tính nào của Employees được giữ lại. Nếu chúng ta có một chỉ mục nào đó trên trường dno của Employees, chúng ta nên thực hiện một nối lặp lồng nhau chỉ mục sử dụng quét chỉ-chỉ-số cho quan hệ phía bên trong. Trong trường hợp này, xây dựng một chỉ mục không phân cụm trên trường dno của Employees sẽ tốt hơn một chỉ mục phân cụm.

Truy vấn tiếp theo thực hiện ý tưởng này ở mức cao hơn:

SELECT D.mgr, E.eid
FROM Departments D, Employees E
WHERE D.dno=E.dno

Nếu chúng ta có một chỉ mục nào đó trên trường dno của Employees, chúng ta có thể sử dụng nó để truy cập các bộ giá trị của Employees trong quá trình kết nối (cùng với Departments là quan hệ phía bên ngoài), nhưng nếu chỉ mục này không được phân cụm thì cách tiếp cận này sẽ không hiệu quả. Mặc khác, giả sử chúng ta có một chỉ mục B+tree trên (dno, eid). Bây giờ tất cả thông tin chúng ta cần về một bộ giá trị nào đó của Employees đều chứa trong cổng vào dữ liệu của bộ giá trị đó trong chỉ mục này. Chúng ta có thể sử dụng chỉ mục này để tìm ra cổng vào dữ liệu đầu tiên có dno đã cho; tất cả các cổng vào dữ liệu có cùng giá trị dno được lưu trữ cùng nhau trong chỉ mục này. (Ghi nhớ rằng một chỉ mục băm trên khoá (dno, eid) không thể được sử dụng để xác định vị trí của một entry có dno nào đó). Vì thế, chúng ta có thể thực hiện được truy vấn này sử dụng nối lặp lồng nhau chỉ mục với Departments là quan hệ phía ngoài và quét chỉ-chỉ mục của quan hệ phía trong.

Số lượng các chỉ mục tiềm năng rất lớn: Với mỗi quan hệ, chúng ta có thể xem xét tất cả các tập con các thuộc tính như là một chỉ mục khoá; chúng ta phải quyết định thứ tự của các thuộc tính trong chỉ mục này; và chúng ta cũng phải quyết định xem chỉ mục này có nên phân cụm hay không phân cụm. Rất nhiều các ứng dụng lớn- việc tạo ra hàng chục ngàn các quan hệ khác nhau và việc lựa chọn thủ công các chỉ mục là việc làm không khả thi.

Sự quan trọng của chỉ mục và những khó khăn trong lựa chọn chỉ mục đã dẫn đến việc phải phát triển các công cụ để hỗ trợ người quản trị cơ sở dữ liệu lựa chọn được chỉ mục thích hợp cho từng luồng công việc. Đầu tiên là công cụ hỗ trợ lựa chọn chỉ mục - index tuning wizards, hay còn gọi là cố vấn chỉ mục - index advisors, là các công cụ tách biệt bên ngoài database engine; chúng đề nghị các chỉ mục nào nên được xây dựng cho từng luồng công việc với các truy vấn SQL khác nhau. Hạn chế chính của những hệ thống này là phải sao chép lại mô hình lượng giá tối ưu hoá truy vấn để đảm bảo rằng bộ tối ưu hoá sẽ chọn các kế hoạch đánh giá truy vấn giống với công cụ thiết kế. Vì bộ tối ưu hoá truy vấn luôn thay đổi trong từng phiên bản của hệ thống cơ sở dữ liệu thương mại, nên rất cần tích hợp công cụ hỗ trợ lựa chọn chỉ mục với bộ tối ưu hoá cơ sở dữ liệu. Sự ra đời gần đây nhất của công cụ này đã được tích hợp với database engine và sử dụng sử dụng bộ tối ưu hoá truy vấn để ước lượng giá của một luồng công việc cùng với tập các chỉ mục của nó, tránh được việc phải sao chép lại như ở trên.

Lựa chọn chỉ mục tự động

Chúng ta gọi tập các chỉ mục của một lược đồ cơ sở dữ liệu là một cấu hình chỉ mục. Giả sử rằng một luồng truy vấn là một tập các truy vấn trên một lược đồ cơ sở dữ liệu. Cho một lược đồ cơ sở dữ liệu và một luồng công việc, giá của một cấu hình chỉ mục là giá phải trả để thực thi những truy vấn này. Cho một lược đồ cơ sở dữ liệu và một luồng truy vấn, bây giờ chúng ta có thể định nghĩa vấn đề lựa chọn chỉ mục tự động chính là việc tìm ra một cấu hình chỉ mục có giá thành thực thi nhỏ nhất.

Vì sao lựa chọn chỉ mục tự động là một vấn đề khó? Hãy cùng chúng tôi tính toán số lượng các chỉ mục khác nhau cùng với c thuộc tính, giả sử rằng bảng này có n thuộc tính. Với thuộc tính đầu tiên trong chỉ mục này, có n lựa chọn, với thuộc tính thứ hai có n-1 thuộc tính, vì thế với thuộc tính thức ta sẽ có n.(n−1)...(n−c+1)=n!(n−c)! size 12{n "." ( n - 1 ) "." "." "." ( n - c+1 ) = { {n!} over { ( n - c ) !} } } {} lựa chọn. Tổng số các chỉ mục khác nhau với c thuộc tính là: ∑i=1cn!(n−1)! size 12{ Sum cSub { size 8{i=1} } cSup { size 8{c} } { { {n!} over { ( n - 1 ) !} } } } {}

Với một bảng có 10 thuộc tính sẽ có 10 chỉ mục khác nhau có 1 thuộc tính, 90 chỉ mục khác nhau có hai thuộc tính, và 30240 chỉ mục khác nhau có 5 thuộc tính. Với các luồng công việc phức tạp bao gồm hàng trăm bảng, số lượng các cấu hình chỉ mục rõ ràng sẽ rất lớn.

Hiệu quả của các công cụ lựa chọn chỉ mục tự động có thể được đánh giá bởi hai yếu tố: (1) số lượng các cấu hình chỉ mục dự tuyển được xem xét, và (2) số lượng các bộ tối ưu cần gọi đến để ước lượng giá của một cấu hình. Ghi nhớ rằng việc giảm không gian tìm kiếm của các chỉ mục dự tuyển tương ứng với việc giới hạn không gian tìm kiếm của bộ tối ưu hoá truy vấn với các kế hoạch sâu-trái (deep-left). Trong rất nhiều trường hợp, kế hoạch tốt nhất không phải là kế hoạch sâu-trái, nhưng trong tất cả các kế hoạch sâu-trái thường có một kế hoạch có giá gần bằng kế hoạch tốt nhất.

Chúng ta có thể dễ dàng giảm thời gian lựa chọn chỉ mục tự động bằng cách giảm số lượng các cấu hình chỉ mục dự tuyển, hoặc chỉ xem xét các chỉ mục có một hoặc hai thuộc tính.

Lựa chọn chỉ mục tự động làm việc như thế nào?

Lựa chọn chỉ mục tự động tìm ra một tập các chỉ mục là ứng cử viên cho một cấu hình chỉ mục có chi phí thấp nhất. Chúng tôi trình bày một thuật toán tiêu biểu; những công cụ thực thi đang tồn tại là biến thể của thuật toán này, nhưng sự thực hiện của chúng có cùng cấu trúc cơ bản.

Trước khi trình bày thuật toán lựa chọn chỉ mục, chúng ta sẽ cùng xem xét vấn đề ước lượng giá của một cấu hình chỉ mục nào đó. Ghi nhớ rằng sẽ không khả thi nếu tạo ra một tập các chỉ mục cho một cấu hình ứng cử viên và sau đó tối ưu truy vấn dựa vào các cấu hình này. Việc tạo ra dù chỉ một cấu hình ứng cử viên có một vài chỉ mục cũng có thể mất hàng giờ đối với các cơ sở dữ liệu lớn. Vì thế, kiểm tra một số lượng lớn các cấu hình ứng cử viên có khả năng là cách tiếp cận không khả thi.

Bây giờ chúng tôi trình bày một thuật toán lựa chọn chỉ mục điển hình. Thuật toán này có hai bước, lựa chọn chỉ mục ứng cử viênliệt kê cấu hình. Trong bước đầu tiên, chúng ta lựa chọn một tập các chỉ mục ứng cử viên để xem xét trong toàn bộ bước hai, sau đó bước hai sẽ xây dựng các khối của các cấu hình chỉ mục. Hãy cùng chúng tôi trình bày hai bước này chi tiết hơn.

Cố vấn chỉ mục của DB2. Cố vấn chỉ mục của DB2 là một công cụ giúp đề cử các chỉ mục một cách tự động cho một luồng công việc. Luồng công việc này được lưu trữ trong một bảng gọi là ADVISE_WORKLOAD của hệ thống cơ sở dữ liệu. Cố vấn chỉ mục của DB2 cho phép người dùng chỉ định dung lượng tối đa của khoảng trống đĩa cho các chỉ mục mới và khoảng thời gian tối đa cho việc tính toán một cấu hình chỉ mục.

Cố vấn chỉ mục của DB2 có một chương trình giúp tìm kiếm tập con của các cấu hình chỉ mục một cách thông minh. Cho một cấu hình chỉ mục ứng cử viên, nó gọi tới bộ tối ưu hoá truy vấn ứng với mỗi truy vấn trong bảng ADVISE_WORKLOAD ở chế độ RECOMMEND_INDEXES, ở chế độ này bộ tối ưu hoá đề cử một tập các chỉ mục và lưu chúng trong bảng ADVISE_INDEXES (các chỉ mục khuyên dùng). Trong chế độ EVALUATE_INDEXES, bộ tối ưu hoá đánh giá lợi ích của các cấu hình chỉ mục này ứng với mỗi truy vấn trong bảng ADVISE-WORKLOAD. Đầu ra của bước lựa chọn chỉ mục là các câu lệnh SQL DDL cho phép tạo ra các chỉ mục đề cử.

Chọn chỉ mục tự động của Microsoft SQL Server 2000. Microsoft là hãng đi tiên phong trong việc tích hợp chọn chỉ mục tự động với bộ tối ưu hoá truy vấn. Công cụ này có ba chế độ cho phép người dùng thoả thuận giữa thời gian phân tích và số lượng các cấu hình chỉ mục ứng cử viên được kiểm tra: nhanh, trung bình và trọn vẹn, trong đó cấu hình nhanh có thời gian phân tích ít nhất và cấu hình trọn vẹn có số lượng các cấu hình nhiều nhất. Các tham số khác bao gồm khoảng không tối đa cấp cho các chỉ mục đề cử, số lượng tối đa các thuộc tính của mỗi chỉ mục, và các bảng có thể sử dụng các chỉ mục này. Công cụ này cho phép co giãn bảng, người dùng có thể xác định số lượng các bản ghi của bảng sẽ cần trong luồng công việc. Điều này cho phép người dùng lập kế hoạch phát triển các bảng trong tương lai.

Lựa chọn chỉ mục ứng cử viên

Chúng ta đã nhìn thấy trong phần trước là không thể xem xét tất cả các chỉ mục có khả năng, do có một số lượng quá lớn các ứng cử viên chỉ mục trong một lược đồ cơ sở dữ liệu lớn. Một cách làm ở đây là tỉa không gian rất lớn các chỉ mục có khả năng của mỗi truy vấn trong luồng công việc một cách độc lập, sau đó phép hợp của các chỉ mục được chọn trong bước đầu tiên này sẽ là đầu vào của bước thứ hai.

Với một truy vấn, hãy cùng chúng tôi tìm hiểu về khái niệm của một thuộc tính có khả năng làm chỉ mục, đó là thuộc tính mà sự xuất hiện của nó trong một chỉ mục có thể làm thay đổi giá của truy vấn. Thuộc tính có khả năng làm chỉ mục là thuộc tính nằm trong mệnh đề WHERE của truy vấn có điều kiện hoặc trong mệnh đề GROUP BY hoặc ORDER BY của truy vấn SQL. Một chỉ mục có thể được chấp nhận cho một truy vấn nào đó là một chỉ mục chứa các thuộc tính có khả năng làm chỉ mục trong truy vấn đó.

Chúng ta chọn các chỉ mục ứng cử viên cho một truy vấn cụ thể nào đó như thế nào? Một cách tiếp cận là liệt kê tất cả các chỉ mục của k thuộc tính. Chúng ta bắt đầu với việc chọn tất cả các thuộc tính đơn đều là chỉ mục ứng cử viên, sau đó là sự kết hợp của hai chỉ mục, và lặp cho đến khi đạt đến kích thước k do người dùng định nghĩa. Thủ tục này rất tốn kém vì chúng ta sẽ có n+n.(n−1)+...+n.(n−1)...(n−k+1) size 12{n+n "." ( n - 1 ) + "." "." "." +n "." ( n - 1 ) "." "." "." ( n - k+1 ) } {} chỉ mục ứng cử viên. Những tài liệu tham khảo ở cuối chương này trình bày về các thuật toán tìm kiếm heuristical nhanh hơn (nhưng không trọn vẹn bằng).

Liệt kê các cấu hình chỉ mục

Trong bước thứ hai, chúng ta sử dụng các chỉ mục ứng cử viên để liệt kê các cấu hình chỉ mục. Như ở bước thứ nhất, chúng ta có thể liệt kê toàn bộ tất cả các cấu hình chỉ mục có kích thước k. Như trình bày ở phía trước, các chiến lược tìm kiếm phức tạp có thể làm giảm số lượng các cấu hình trong khi vẫn đưa ra được một cấu hình cuối cùng có chất lượng cao.

Sau khi thiết kế cơ sở dữ liệu được đưa vào sử dụng, quá trình sử dụng thực tế này cung cấp nhiều thông tin chi tiết đáng giá giúp chúng ta điều chỉnh thiết kế ban đầu sao cho nó trở nên hiệu quả hơn. Rất nhiều giả định ban đầu về các luồng công việc có trong ứng dụng có thể đúng, và một số có thể sai. Những ước lượng ban đầu của chúng ta về kích thước dữ liệu có thể được thay thế bằng các thống kê thực tế từ các danh mục hệ thống. Việc kiểm tra cẩn thận các truy vấn có thể giải quyết được những vấn đề không mong muốn; ví dụ, khi thực hiện các kế hoạch của truy vấn, bộ tối ưu hoá có lẽ không sử dụng một vài chỉ mục như ta mong đợi.

Tiếp tục điều chỉnh cơ sở dữ liệu là việc làm quan trọng để đạt được hiệu quả trong thực thi. Trong phần này, chúng tôi giới thiệu ba kiểu điều chỉnh: điều chỉnh các chỉ mục, điều chỉnh lược đồ khái niệm và điều chỉnh các truy vấn. Những tranh luận của chúng ta về lựa chọn chỉ mục cũng được áp dụng để đưa ra những quyết định điều chỉnh chỉ mục. Điều chỉnh lược đồ khái niệm và truy vấn được trình bày kỹ hơn trong Phần 8 và 9.

Điều chỉnh chỉ mục

Những lựa chọn chỉ mục ban đầu có thể phải điều chỉnh vì một số lý do. Lý do đơn giản nhất là luồng công việc chứa một số truy vấn và các cập nhật được coi là quan trọng trong thiết kế ban đầu nhưng trên thực tế nó lại không xuất hiện thường xuyên. Luồng công việc thực tế quan sát được bây giờ cũng có thể chứa một số truy vấn mới và các cập nhật quan trọng. Những lựa chọn chỉ mục ban đầu phải được điều chỉnh lại dựa vào những thông tin mới này. Một số chỉ mục ban đầu có thể phải xoá đi và thêm vào đó một số chỉ mục mới.

Chúng ta cũng khám phá ra rằng bộ tối ưu hoá trong một hệ thống nào đó không tìm ra được các kế hoạch như ta mong muốn. Ví dụ, xem xét truy vấn sau, truy vấn này chúng ta đã bàn luận ở trên:

SELECT D.mgr
FROM Employees E, Departments D
WHERE D.dname= ‘Toy’ AND E.dno=D.dno

Một kế hoạch tốt ở đây là sử dụng một chỉ mục trên dname để truy cập các bộ giá trị của Departments có dname ='Toy' và thực hiện quét chỉ-chỉ-số trên chỉ mục của trường dno của Employees. Chúng ta nhận thấy rằng bộ tối ưu hoá sẽ tìm ra được một kế hoạch như vậy, nên chúng ta có thể tạo ra một chỉ mục không phân cụm trên trường dno của Employees.

Bây giờ giả sử thực hiện các truy vấn dạng này mất một thời gian rất lâu. Chúng ta có thể yêu cầu hệ thống cho xem các kế hoạch mà bộ tối ưu hoá đã chọn. (Hầu hết các hệ thống thương mại cung cấp một lệnh đơn giản để làm điều này). Nếu các kế hoạch không sử dụng quét chỉ-chỉ-số (do những hạn chế của hệ thống gây ra), thì trừ phi những bộ giá trị của Employees đang được truy cập, còn không chúng ta phải xem xét lại việc lựa chọn chỉ mục ban đầu. Trong trường hợp này, chúng ta phải xoá chỉ mục không phân cụm trên trường dno của Employees và thay thế nó bằng một chỉ mục được phân cụm.

Một vài hạn chế phổ biến của các bộ tối ưu hoá là nó không thực hiện tốt các phép chọn có chứa các biểu thức xâu ký tự, số học, và các giá trị rỗng. Chúng ta sẽ bàn luận sâu hơn về vấn đề này trong nội dung điều chỉnh truy vấn ở Phần 9. Hơn nữa, việc kiểm tra lại các lựa chọn chỉ mục có thể giúp chúng ta tổ chức lại một số chỉ mục trước. Ví dụ, một chỉ mục tĩnh, như chỉ mục ISAM có thể sinh ra các chuỗi tràn dài. Việc xoá các chỉ mục này và xây dựng lại nó- nếu khả thi, cung cấp các truy cập ngắt quãng tới quan hệ được chỉ mục- do đó có thể cải thiện được thời gian truy cập thông qua chỉ mục này. Đối với cấu trúc động như là B+tree, nếu quá trình thực thi không tiến hành trộn các trang đã bị xoá, không gian bị chiếm có thể tăng lên đáng kể trong một số trường hợp. Điều này làm kích thước của chỉ mục này (trong các trang) lớn hơn cần thiết, và có thể làm tăng thời gian truy cập. Việc xây dựng lại chỉ mục này nên được xem xét. Các phép cập nhật phạm vi tới một chỉ mục phân cụm nào đó có lẽ cùng dẫn đến phải sử dụng các trang tràn, vì thế chúng ta nên cố gắng giảm bậc của phân cụm. Khẳng định thêm một lần nữa, việc xây dựng lại chỉ mục là việc nên làm.

Cuối cùng, ghi nhớ rằng tối ưu hoá truy vấn được cân nhắc dựa vào các thống kê thực tế trong các danh mục hệ thống. Những thống kê này được cập nhật chỉ khi một chương trình tiện ích đặc biệt đang chạy; vì thế phải đảm bảo rằng các tiện ích này được chạy một cách thường xuyên đủ để duy trì những thống kê này một cách hợp lý.

Điều chỉnh lược đồ khái niệm

Trong các khoá học về thiết kế cơ sở dữ liệu, chúng ta đã được biết rằng lược đồ quan hệ được xây dựng ban đầu có thể không phù hợp với các mục đích thực thi của các luồng công việc. Vì thế, chúng ta có thể phải thiết kế lại lược đồ khái niệm (và những quyết định liên quan đến thiết kế vật lý cũng phải kiểm tra lại).

Chúng ta cũng biết rằng việc thiết kế lại là cần thiết trong suốt quá trình thiết kế ban đầu hoặc sau đó, khi mà hệ thống đã đi vào sử dụng. Khi một cơ sở dữ liệu đã được thiết kế và đã có chứa dữ liệu, việc thay đổi lược đồ khái niệm dẫn đến việc phải thay đổi nội dung của các quan hệ có liên quan. Bây giờ chúng ta xem xét các vấn đề của thiết kế lại lược đồ đứng trên quan điểm thực thi.

Một điểm quan trọng cần hiểu là việc lựa chọn lược đồ khái niệm nên dựa vào việc xem xét các truy vấn và các cập nhật nào có trong luồng công việc của chúng ta, và các vấn đề liên quan đến dư thừa dữ liệu (chúng ta đã bàn đến trong Chương 19). Có một số công việc phải được xem xét trong khi tiến hành điều chỉnh lược đồ khái niệm:

  • Chúng ta cân nhắc xem các quan hệ nên ở 3NF thay vì BCNF không.
  • Nếu có hai cách để phân rã một lược đồ quan hệ về 3NF hoặc
0