Trang này được dịch bằng máy. Đọc bản gốc tiếng Anh. English

Thư viện IBSurgeon

Chỉ mục (InterBase và Firebird)

Alexey Kovyazin, cập nhật lần cuối 07-Th9-2005

Khái niệm được dùng làm nền tảng cho chỉ mục (index) rất đơn giản và trực quan, đồng thời là một trong những nền tảng quan trọng nhất của thiết kế cơ sở dữ liệu. Dựa trên chỉ mục, nhiều đối tượng cơ bản của cơ sở dữ liệu được xây dựng, và hơn nữa, việc sử dụng chỉ mục đúng cách là chìa khóa để cải thiện năng suất của các ứng dụng cơ sở dữ liệu. Tuy nhiên, chỉ mục là gì? Chỉ mục là một con trỏ có thứ tự trỏ đến các bản ghi trong bảng. “Con trỏ” có nghĩa là chỉ mục chứa các giá trị của một hoặc nhiều trường trong bảng và địa chỉ của các trang dữ liệu nơi các giá trị này được lưu trữ (để biết chi tiết về các trang dữ liệu, hãy xem chương “Cấu trúc cơ sở dữ liệu InterBase”) (phần 4). Nói cách khác, chỉ mục bao gồm các cặp giá trị “giá trị trường” - “vị trí vật lý của trường này”.

Do đó, bằng giá trị của trường (hoặc các trường) được đưa vào chỉ mục, chúng ta có thể nhanh chóng tìm thấy vị trí trong bảng nơi bản ghi chứa giá trị này được phân bổ. “Có thứ tự” có nghĩa là các giá trị của các trường được lưu trong chỉ mục được sắp xếp theo thứ tự. Rất thường xuyên, chỉ mục được so sánh với một danh mục thư viện, trong đó tất cả các cuốn sách được ghi vào thẻ và được sắp xếp theo một cách nào đó: theo bảng chữ cái hoặc theo chủ đề, và mỗi thẻ chứa thông tin về vị trí chính xác của cuốn sách đó trong kho lưu trữ.

Tại sao chúng ta cần chỉ mục?

Điều duy nhất mà chỉ mục thúc đẩy là tăng tốc độ truy xuất bản ghi theo trường được đánh chỉ mục của nó (được đánh chỉ mục - có nghĩa là được đưa vào chỉ mục). Chức năng chính của chỉ mục là cung cấp khả năng truy xuất bản ghi nhanh chóng trong bảng. Mọi việc sử dụng chỉ mục đều quy về điều này.

Chức năng truy xuất này được thực hiện như thế nào? Đầu vào của chức năng này là giá trị của trường được đánh chỉ mục (hoặc một số trường). Kết quả của việc truy xuất, chúng ta sẽ nhận được toàn bộ bản ghi, trong đó trường được đánh chỉ mục có giá trị đặt trước. Đầu tiên, trong chỉ mục (nói chính xác hơn, trong mảng có thứ tự các giá trị của trường được đánh chỉ mục), giá trị cần tìm được tìm kiếm, sau đó địa chỉ của trang dữ liệu nơi bản ghi cần tìm được lưu trữ sẽ được lấy ra, máy chủ đi đến trang này và đọc bản ghi được tìm thấy. Điều này nghe có vẻ khá bất tiện, tuy nhiên, việc tìm kiếm bằng chỉ mục nhanh hơn nhiều lần so với việc liệt kê tuần tự tất cả các giá trị từ bảng.

Nếu chúng ta tiếp tục so sánh chỉ mục với danh mục thư viện, chúng ta sẽ thấy rằng việc truy xuất bản ghi bằng chỉ mục rất giống với việc tìm sách bằng thẻ. Khi chúng ta tìm thấy một cuốn sách trong một danh mục khá nhỏ (so với toàn bộ kho thư viện), chúng ta ngay lập tức nhận được thông tin về vị trí chính xác của cuốn sách và có thể đến thẳng đó. Tìm kiếm mà không sử dụng chỉ mục có thể được so sánh với việc liệt kê tuần tự tất cả các cuốn sách trong thư viện!

Việc liệt kê tất cả các bản ghi trong bảng được gọi là trực tiếp hoặc tự nhiên. Chúng ta nên nói rằng mặc dù sức mạnh của máy tính hiện đại, việc liệt kê tự nhiên có thể rất lâu nếu bảng chứa một số lượng lớn các bản ghi.

Chúng được tổ chức như thế nào?

Chỉ mục không phải là một phần của bảng, nó là một đối tượng riêng biệt được kết nối với bảng và các đối tượng cơ sở dữ liệu khác. Đây là một điểm rất quan trọng trong việc triển khai DBMS cho phép tách biệt việc lưu trữ thông tin khỏi việc trình bày thông tin.

InterBase giống như bất kỳ cơ sở dữ liệu quan hệ nào khác lưu trữ các bản ghi trong bảng theo cách không có thứ tự, tức là không quan tâm đến việc các bản ghi được phân bổ vật lý như thế nào trong bảng. Lưu trữ không có thứ tự có nghĩa là hai bản ghi được thêm vào bảng lần lượt có thể không nằm cạnh nhau. Hơn nữa, dữ liệu được trích xuất từ bảng cũng không có thứ tự nào ngoài thứ tự được người dùng chỉ định rõ ràng khi thực hiện truy vấn truy xuất.

Tuy nhiên, chúng ta không thể thiếu việc sắp xếp dữ liệu được lưu trữ: người dùng cuối của các ứng dụng muốn xem dữ liệu theo một thứ tự xác định - ví dụ, họ của mọi người theo bảng chữ cái. Chỉ mục giải quyết vấn đề trình bày dữ liệu theo cách có thứ tự. Các giá trị trường được đưa vào chỉ mục được sắp xếp theo thứ tự và được trình bày dưới dạng đặc biệt, được tối ưu hóa để tìm kiếm các giá trị cần thiết (cụ thể, điều này rất cần thiết để tạo ra các chuỗi có thứ tự).

Việc tách biệt lưu trữ dữ liệu khỏi trình bày dữ liệu mang lại những lợi ích bổ sung so với việc sắp xếp trực tiếp - có thể bạn sẽ cần sắp xếp bảng ban đầu theo nhiều cách khác nhau. Khi đó, chỉ mục sẽ giúp bạn - có thể có tới 64 chỉ mục cho mỗi bảng!

Nếu chúng ta nói về việc triển khai chỉ mục ở mức vật lý, chúng đại diện cho một cây nhị phân mà các nút của nó đại diện cho các cặp “giá trị trường trong chỉ mục” - “vị trí dữ liệu trong bảng”. Việc truy xuất bản ghi cần tìm trong chỉ mục được thực hiện bằng cơ chế tìm kiếm băm (hash-search) - một trong những thuật toán tìm kiếm nhanh nhất.

Ứng dụng của chỉ mục

Bây giờ, khi đã rõ những gì chúng ta có thể yêu cầu từ chỉ mục, đã đến lúc tìm hiểu về chức năng của chúng trong cơ sở dữ liệu. Chỉ mục được sử dụng trong ba trường hợp chính:

  1. Tăng tốc độ thực thi truy vấn. Chỉ mục được tạo cho các trường được sử dụng trong các điều kiện tìm kiếm của các truy vấn SQL.

  2. Hỗ trợ tính duy nhất của các giá trị trong trường; ràng buộc khóa chính (đã được đề cập trong chương “Bảng. Khóa chính”) yêu cầu rằng trong bảng không được có hai giá trị giống hệt nhau của các trường được đưa vào khóa chính. Để đáp ứng điều kiện này, khi chèn một bản ghi mới, bạn nên tìm kiếm cùng một giá trị sẽ được chèn. Để truy xuất bản ghi, một loại chỉ mục đặc biệt được sử dụng - chỉ mục duy nhất (xem bên dưới).

  3. Hỗ trợ tính toàn vẹn tham chiếu. Các ràng buộc khóa ngoại (được xem xét trong chương “Các ràng buộc cơ sở dữ liệu”) được sử dụng để kiểm tra rằng các giá trị được chèn vào bảng chắc chắn tồn tại trong một bảng khác. Khi tạo khóa ngoại, chỉ mục được tự động tạo. Chỉ mục này được áp dụng để tăng tốc độ các truy vấn sử dụng phép nối bảng, cũng như để kiểm tra các điều kiện của khóa ngoại. Chúng ta đã đề cập ngắn gọn về tất cả các ứng dụng có thể có của chỉ mục. Bây giờ chúng ta sẽ xem xét chi tiết hơn các đặc điểm của từng trường hợp và trả lời các câu hỏi thường gặp nhất liên quan đến việc sử dụng chỉ mục.

Tăng tốc độ thực thi truy vấn bằng chỉ mục

Ở trên đã mô tả rằng việc sử dụng chỉ mục có thể tăng tốc độ thực thi truy vấn rất nhiều. Điều này thực sự đúng trong hầu hết các trường hợp, nhưng có một số điều kiện nhất định. Đầu tiên, chúng ta sẽ trả lời câu hỏi thường gặp ở những người mới làm quen với chỉ mục. Nếu chỉ mục tăng tốc độ truy xuất từ cơ sở dữ liệu, tại sao chúng ta không đánh chỉ mục tất cả các trường trong bảng? Có hai điểm cản trở việc đánh chỉ mục tổng thể - dung lượng đĩa và chi phí khi sửa đổi dữ liệu trong bảng. Mỗi chỉ mục được tạo có kích thước bằng kích thước dữ liệu trong trường được đánh chỉ mục, cộng với kích thước dữ liệu của vị trí bản ghi. Nếu chúng ta tạo chỉ mục cho mọi trường trong bảng, tổng kích thước của chúng sẽ lớn hơn kích thước dữ liệu trong bảng! Do đó, việc tạo một số lượng lớn chỉ mục dẫn đến chi phí rất lớn về dung lượng đĩa.

Điểm thứ hai quan trọng hơn. Đó là chi phí khi sửa đổi dữ liệu trong bảng. Trong một DBMS quan hệ, như bạn đã biết, các bản ghi trong bảng không có thứ tự và do đó việc thêm/xóa bản ghi diễn ra mà không tốn nhiều tài nguyên của máy chủ. Ngay cả khi một bản ghi bị xóa khỏi giữa cơ sở dữ liệu, không có việc di chuyển dữ liệu để lấp đầy khoảng trống đó - điều này không cần thiết: máy chủ sẽ chỉ đánh dấu vị trí trống và sẽ ghi thứ gì đó vào đó khi cần. Đối với việc thêm, trong hầu hết các trường hợp, nó được thực hiện ở cuối bảng. Tuy nhiên, mặc dù máy chủ không di chuyển dữ liệu chính trong bảng khi sửa đổi, dữ liệu được lưu trữ trong các chỉ mục được sắp xếp lại mỗi khi thêm/xóa bản ghi! Nói cách khác, máy chủ phải xây dựng lại chỉ mục khi thêm một bản ghi vào giữa bảng. Chắc chắn, việc triển khai chỉ mục bằng cách nào đó được thiết kế cho các lần tổ chức lại thường xuyên, nhưng các thao tác này vẫn tốn thời gian và tài nguyên bộ xử lý và khi có một số lượng lớn chỉ mục trong bảng, việc sửa đổi dữ liệu trong đó có thể chậm hơn nhiều so với cùng một bảng không có chỉ mục!

Đây là hai lý do chính cản trở việc đánh chỉ mục tổng thể. Ngoài ra, còn có một số nhận xét khác hạn chế việc sử dụng chỉ mục. Đầu tiên là quy tắc 20%. Quy tắc này nói rằng nếu truy vấn truy xuất trả về hơn 20% số bản ghi từ bảng, việc sử dụng chỉ mục có thể làm chậm quá trình truy xuất dữ liệu! Chắc chắn, tình huống phụ thuộc vào truy vấn cụ thể và các điều kiện được đặt ra cho việc truy xuất, nhưng chúng ta nên nhớ rằng 20% số bản ghi là ngưỡng mà hiệu quả của việc sử dụng chỉ mục trở nên đáng ngờ. Nhận xét thứ hai không được xây dựng rõ ràng như vậy. Nó liên quan đến hoạt động của bộ tối ưu hóa InterBase.

Bộ tối ưu hóa là một tập hợp các cơ chế phát triển lịch trình thực thi truy vấn. Khi người dùng đưa bất kỳ truy vấn SQL nào cho InterBase, anh ta chỉ định những gì máy chủ nên trả về sau khi thực hiện truy vấn, nhưng không xác định CÁCH máy chủ nên thực hiện truy vấn. Bộ tối ưu hóa dựa trên truy vấn đã cho tạo ra lịch trình thực thi của nó, tức là dữ liệu sẽ được lấy từ đâu và theo thứ tự nào để thực hiện truy vấn, những chỉ mục nào sẽ được sử dụng. Khi máy chủ phân tích các điều kiện truy xuất (chủ yếu là các phần của biểu thức WHERE, ORDER BY, v.v.) cho mỗi trường được đưa vào điều kiện, máy chủ cố gắng sử dụng chỉ mục. Thật không may, thuật toán tạo lịch trình chưa hoàn chỉnh và bộ tối ưu hóa thường sử dụng các chỉ mục không hiệu quả lắm cho truy vấn cụ thể, do đó thời gian thực thi có thể bị chậm lại đáng kể. Do đó, việc tạo các chỉ mục không cần thiết có thể dẫn đến việc tạo ra các lịch trình không tối ưu.

Cần lưu ý rằng trong bản sao Yaffil, vấn đề này được giải quyết nhờ sử dụng các thuật toán hiện đại để tạo lịch trình. Trường hợp thứ ba khi chỉ mục không cần thiết là các trường có tập giá trị hạn chế - ví dụ, trường lưu trữ thông tin về giới tính của người và chỉ chứa hai giá trị có thể - “F” và “M”; không có ý nghĩa gì khi đánh chỉ mục trường này. Vì vậy, chúng ta đã xem xét các hạn chế chính khi tạo chỉ mục. Bây giờ chúng ta nên đề cập đến vấn đề khi nào cần sử dụng chỉ mục để đạt được sự cải thiện năng suất. Có 3 trường hợp chính khi một trường cần được đánh chỉ mục:

  • Khi trường này được sử dụng trong các điều kiện truy xuất trong truy vấn
  • Khi các phép nối bảng sử dụng trường này
  • Khi trường này được sử dụng trong mệnh đề sắp xếp ORDER BY

Nếu trường được sử dụng theo cách nêu trên, việc tạo chỉ mục cho nó có thể dẫn đến cải thiện năng suất truy vấn.

Hãy xem xét cú pháp tạo chỉ mục. Dưới đây là định dạng đầy đủ của lệnh DDL cho phép tạo chỉ mục:

CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX index ON table (col [, col …]);

Biểu thức tối thiểu để tạo chỉ mục như sau:

CREATE INDEX my_index ON Table_example(ID)

Trong ví dụ này, chỉ mục có tên my_index được tạo cho bảng Table_example và trường ID là trường được đánh chỉ mục. Chỉ mục là tăng dần, tức là các giá trị trong đó được sắp xếp theo thứ tự tăng dần, cũng như không duy nhất, và điều đó có nghĩa là trường ID có thể có một số giá trị giống hệt nhau. Đây chắc chắn là ví dụ đơn giản nhất về chỉ mục - phổ biến nhất. Như chúng ta có thể thấy từ mô tả cú pháp, chỉ mục có thể chứa không chỉ một mà là một vài trường. Chỉ mục như vậy được sử dụng khi các truy vấn được thực hiện thường xuyên và chứa sự kết hợp của các trường được đánh chỉ mục trong các điều kiện tìm kiếm hoặc sắp xếp. Ví dụ: nếu chúng ta có một bảng chứa các trường Họ, Tên, Tên đệm, chỉ mục như vậy sẽ được áp dụng khi thực hiện truy vấn sử dụng sắp xếp theo Họ, Tên và Tên đệm. Nói chung, không cần thiết phải chỉ định các điều kiện cho cả 3 trường được sử dụng trong chỉ mục để tận dụng lợi ích của nó. Nếu chúng ta muốn sắp xếp kết quả của truy vấn, chỉ mục sẽ được sử dụng trong trường hợp trường đầu tiên trong điều kiện sắp xếp trùng với trường đầu tiên trong chỉ mục. Ví dụ: chỉ mục của chúng ta sẽ được áp dụng trong trường hợp sắp xếp theo Họ và Tên.

Theo tài liệu, để tối ưu hóa việc thực thi truy vấn chứa trong mệnh đề WHERE một phép nối các trường với điều kiện OR, chúng ta nên sử dụng không phải chỉ mục tổng hợp mà là một vài chỉ mục đơn lẻ cho tất cả các trường được đưa vào điều kiện OR.

Về vấn đề thứ tự sắp xếp của chỉ mục, nó có thể là tăng dần hoặc giảm dần. Tại sao chúng ta cần các thứ tự sắp xếp khác nhau? Rõ ràng, cho các cách sắp xếp khác nhau! Nếu chúng ta muốn sắp xếp mọi người theo họ theo thứ tự tăng dần, chúng ta tạo chỉ mục tăng dần (ASC), và nếu giảm dần (từ Z đến A) - thì tạo chỉ mục giảm dần! Nếu chúng ta muốn cả hai, chúng ta phải tạo cả hai chỉ mục.

Hỗ trợ tính toàn vẹn tham chiếu bằng chỉ mục

Có một tùy chọn nữa trong định nghĩa chỉ mục - UNIQUE. Nếu chúng ta chỉ định nó, chỉ mục sẽ chỉ cho phép chèn các giá trị duy nhất vào bảng. Thực tế, đây là cơ sở để triển khai các khóa duy nhất. Khóa duy nhất được sử dụng rộng rãi trong cơ sở dữ liệu. Đó là РК là một chỉ mục khóa duy nhất, nhưng không phải mọi UK đều là РК. Ở trên chúng ta chỉ nói về РК. Khóa chính là loại khóa duy nhất được sử dụng phổ biến nhất. Khi tạo khóa chính cho bảng, một chỉ mục duy nhất được tự động tạo. Nó được đặt tên bao gồm RDB$PRIMARYNNN, trong đó NNN là số duy nhất tuần tự trong cơ sở dữ liệu. Do đó, hai ràng buộc chính của tính toàn vẹn tham chiếu - khóa duy nhất và khóa chính được thực hiện nhờ sử dụng chỉ mục duy nhất. Rõ ràng, khái niệm tính duy nhất không tương thích với khái niệm giá trị không xác định. Nói cách khác, không nên có bất kỳ giá trị NULL nào trong các trường chứa trong chỉ mục duy nhất. Trước khi tạo chỉ mục duy nhất cho một trường, cần phải đặt ràng buộc NOT NULL. Nếu chỉ mục được tạo cho dữ liệu đã tồn tại, thì khi tạo, trường được lập chỉ mục sẽ được kiểm tra xem có chứa bất kỳ giá trị lặp lại nào không. Nếu có, bạn sẽ bị cấm tạo chỉ mục.

Ngoài các ràng buộc khóa duy nhất và khóa chính, cơ chế chỉ mục là nền tảng cho việc triển khai một ràng buộc tính toàn vẹn tham chiếu nữa - khóa ngoại. Ràng buộc khóa ngoại được đặt cho một hoặc nhiều trường của bất kỳ bảng nào và ngăn chặn việc chèn vào các trường này các giá trị không nằm trong khóa chính của bảng khác, bảng cha. Để triển khai khóa ngoại, tức là để thực hiện kiểm tra xem có giá trị nào trong bảng cha hay không, một chỉ mục đặc biệt được tự động tạo. Tên của nó là RDB$FOREIGNNN, trong đó NNN là số duy nhất tuần tự trong cơ sở dữ liệu.

Tại sao cơ chế chỉ mục được sử dụng để triển khai các ràng buộc tính toàn vẹn tham chiếu? Vấn đề là các chỉ mục trong InterBase ở vị trí đặc biệt, được ưu tiên - người ta nói rằng chúng được thực thi ngoài ngữ cảnh của các giao dịch. Đây là một thuộc tính rất quan trọng. Chúng ta sẽ nói về các giao dịch sau, trong chương dành riêng cho chúng. Bây giờ chúng ta chỉ đề cập rằng khi các chỉ mục nằm ngoài giao dịch, điều đó có nghĩa là tất cả người dùng làm việc đồng thời với dữ liệu trong cùng một bảng phải tuân thủ các ràng buộc tính toàn vẹn tham chiếu.

Tối ưu hóa hiệu suất chỉ mục

Trong tiêu đề của phần này, chúng ta có thể thấy một nghịch lý - các chỉ mục, như đã nói ở trên, dùng để tăng tốc thực thi truy vấn, và hóa ra, chúng cũng cần được tối ưu hóa! Nhưng phải làm gì (cuộc sống là vậy) - ai đó phải chăm sóc các chỉ mục. Điều gì xảy ra với các chỉ mục? Tại sao chúng “mất dáng”? Chúng ta sẽ phải nói lại một lần nữa rằng các chỉ mục được triển khai dưới dạng cây nhị phân. Và khi một bản ghi mới được thêm (cập nhật, xóa - tùy bạn) vào bảng, một nhánh mới được thêm vào cây. Các nhánh này không được thêm vào giữa cây, mà vào ngọn của các nhánh khác. Dần dần cây trở nên nhiều nhánh hơn (hoặc mất cân bằng), và việc tìm kiếm - kém hiệu quả hơn. Việc xây dựng lại cây hoặc (trong một số trường hợp) tính toán lại thống kê có thể cải thiện tình hình.

Định kỳ cần phải tạo lại chỉ mục để khôi phục hiệu suất của nó. Việc tạo lại chỉ mục xảy ra trong các trường hợp sau:

  • Khi xây dựng lại chỉ mục bằng lệnh ALTER INDEX.
  • Khi xóa và tạo lại chỉ mục bằng các lệnh DROP INDEX và CREATE INDEX.
  • Khi sao lưu và khôi phục từ bản sao lưu bằng công cụ gbak.

Bạn cũng có thể sử dụng việc tính toán lại thống kê. Nhưng phải hiểu rằng thao tác này không thay đổi trạng thái của chỉ mục, nó chỉ thông báo cho trình tối ưu hóa thông tin chính xác về trạng thái của chỉ mục, cho phép sử dụng chỉ mục này một cách chính xác. Nói cách khác, tính toán lại thống kê không phải là “phương thuốc” cho chỉ mục, mà chỉ là chẩn đoán chính xác về trạng thái của nó. Hãy xem xét tất cả các cách tối ưu hóa chỉ mục này chi tiết hơn. Việc sử dụng lệnh ALTER INDEX có định dạng sau:

ALTER INDEX name {ACTIVE | INACTIVE};

Ở đây name là tên của chỉ mục, và ACTIVE và INACTIVE - hai trạng thái của chỉ mục mà nó có thể được chuyển đổi bằng lệnh ALTER INDEX. Tham số ACTIVE có nghĩa là chỉ mục đang hoạt động và có thể được áp dụng trong tất cả các truy vấn và thủ tục. Nếu bạn đặt chỉ mục ở trạng thái INACTIVE, điều đó sẽ dẫn đến việc ngắt kết nối việc sử dụng nó. Để sắp xếp lại cây, hai lệnh nên được thực thi tuần tự:

ALTER INDEX name INACTIVE; ALTER INDEX name ACTIVE;

Do đó, chỉ mục sẽ được xây dựng lại. Việc sử dụng ALTER INDEX có một số hạn chế: bạn không thể xây dựng lại các chỉ mục được sử dụng trong khóa chính, khóa duy nhất và khóa ngoại; bạn không thể xây dựng lại chỉ mục nếu nó đang được sử dụng bởi bất kỳ truy vấn nào tại thời điểm hiện tại; và cũng để thay đổi chỉ mục, cần phải có quyền của quản trị viên (SYSDBA) hoặc là người tạo ra chỉ mục đó.

Việc tạo lại chỉ mục bằng các lệnh DROP INDEX và CREATE INDEX dẫn đến việc xóa hoàn toàn chỉ mục khỏi cơ sở dữ liệu, sau đó tạo lại nó từ đầu. Cú pháp của lệnh DROP INDEX rất rõ ràng:

DROP INDEX имя_индекса;

Sau khi xóa, cần phải tạo lại chỉ mục với cùng tên và tham số bằng lệnh CREATE INDEX mà chúng ta đã xem xét cú pháp. Cách xây dựng lại chỉ mục bằng cách tạo lại hoàn toàn có các hạn chế tương tự như các hạn chế khi sử dụng ALTER INDEX.

Cách thứ ba để xây dựng lại chỉ mục dựa trên thuộc tính của các bản sao lưu cơ sở dữ liệu InterBase được tạo bởi tiện ích gbak. Vấn đề là khi sao lưu, dữ liệu bao gồm trong chỉ mục không được lưu trong bản sao lưu, chỉ có định nghĩa chỉ mục được lưu trữ. Khi khôi phục từ bản sao lưu, chỉ mục được tạo lại. Nếu bạn muốn biết thêm chi tiết về sao lưu, hãy xem chương “Sao lưu và khôi phục từ bản sao lưu” (phần 4).

Cách thứ tư để cải thiện hiệu suất chỉ mục là thu thập thống kê trên các chỉ mục bằng lệnh SET STATISTICS. Thống kê bảng là một giá trị trong phạm vi từ 0 đến 1, giá trị của nó phụ thuộc vào số lượng bản ghi khác nhau trong bảng. Trình tối ưu hóa InterBase sử dụng thống kê để xác định hiệu quả của việc áp dụng chỉ mục này hay chỉ mục khác trong truy vấn. Khi số lượng bản ghi trong bảng có thể thay đổi đáng kể (ví dụ, do một số lượng lớn các thao tác chèn hoặc xóa), thì việc tính toán lại thống kê có thể cải thiện đáng kể hiệu suất. Lệnh tính toán lại thống kê như sau:

SET STATISTICS INDEX name;

Ở đây name là tên của chỉ mục mà thống kê được tính toán lại. Việc tính toán lại thống kê không xây dựng lại chỉ mục và do đó nó không bị hầu hết các hạn chế được đặt cho các cách cải thiện hiệu suất được mô tả ở trên, ngoại trừ việc chỉ người tạo chỉ mục hoặc quản trị viên hệ thống (người dùng có tên SYSDBA) mới có thể tính toán lại thống kê. Thống kê chính xác cho phép trình tối ưu hóa đưa ra quyết định đúng đắn về việc sử dụng bất kỳ chỉ mục nào hay không.

Chúng ta đã xem xét một vài cách cải thiện hiệu suất của các chỉ mục. Sử dụng các lệnh ALTER INDEX và DROP/CREATE INDEX, chúng ta có thể xây dựng lại bất kỳ chỉ mục nào ngoại trừ các chỉ mục hệ thống được tạo tự động, nhằm hỗ trợ tính toàn vẹn tham chiếu. Nếu bạn muốn xây dựng lại các chỉ mục này, bạn nên sử dụng các lệnh thay đổi và tạo bảng - ALTER TABLE và CREATE TABLE vì các chỉ mục này là một phần không thể tách rời của các khóa bảng.