Tạo chỉ mục đồng thời trong Firebird 5
Hiện tại, khi chỉ mục đang được xây dựng, mọi thay đổi dữ liệu trong bảng đều không được phép. Điều này là cần thiết để tạo chỉ mục chính xác, không bỏ sót các khóa mới được chèn vào trong quá trình xây dựng.
Thuật toán xây dựng chỉ mục đồng thời cho phép rút ngắn đáng kể thời gian cần khóa đọc như vậy. Mặc dù nó không hoàn toàn loại bỏ nhu cầu chặn các thay đổi dữ liệu đồng thời trong bảng, nhưng thời gian chặn như vậy ngắn hơn nhiều so với thuật toán không đồng thời truyền thống. Điều này đặc biệt hữu ích trong môi trường sản xuất, nơi việc chặn hoạt động của người dùng trong thời gian dài là không thực tế hoặc không thể.
Do tải đồng thời và độ phức tạp bổ sung, việc tạo chỉ mục đồng thời có thể mất nhiều thời gian hơn so với cách tiếp cận truyền thống.
Cú pháp
Từ khóa không dành riêng mới CONCURRENTLY được sử dụng để chỉ định việc tạo chỉ mục đồng thời.
Tạo chỉ mục mới
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX indexname ON tablename {(col [, col ...]) | COMPUTED BY ()} [WHERE ] [CONCURRENTLY]
Kích hoạt chỉ mục hiện có
ALTER INDEX indexname {ACTIVE | INACTIVE} [CONCURRENTLY]
Lưu ý, CONCURRENTLY chỉ có thể được sử dụng với ACTIVE.
Xác thực tính duy nhất
Rất khó hoặc không thể kiểm tra tính duy nhất của chỉ mục trong khi chỉ mục được xây dựng đồng thời. Do đó, khi chỉ mục duy nhất được tạo (hoặc kích hoạt) đồng thời, nó ngay lập tức được đánh dấu là NOT VALIDATED trong danh mục hệ thống. Tính duy nhất của chỉ mục được xác thực sau khi quá trình xây dựng chỉ mục hoàn tất, khi chỉ mục chứa các khóa cho tất cả các bản ghi trong bảng.
Nếu kiểm tra tính duy nhất thành công, dấu NOT VALIDATED sẽ được xóa.
Nếu kiểm tra tính duy nhất thất bại, chỉ mục vẫn hoạt động và được đánh dấu là NOT VALIDATED. Sau đó, người dùng có thể tìm và sửa các bản ghi trùng lặp cũng như xác thực tính duy nhất lại hoặc xóa chỉ mục nếu thấy phù hợp.
Lưu ý, chỉ mục duy nhất NOT VALIDATED vẫn không cho phép nhập các bản ghi trùng lặp vào bảng.
Để xác thực chỉ mục duy nhất, hãy chạy
ALTER INDEX indexname VALIDATE UNIQUE
Câu lệnh này thực hiện quét chỉ mục để tìm các khóa trùng lặp và kiểm tra các bản ghi tương ứng. Nếu không tìm thấy bản ghi trùng lặp nào, dấu NOT VALIDATED sẽ được xóa và chỉ mục được coi là đã xác thực. Ngược lại, dấu NOT VALIDATED vẫn được giữ nguyên và chỉ mục có thể được xác thực lại sau đó.
Lệnh isql SHOW INDEX hiện hiển thị dấu NOT VALIDATED, nếu có.
Ràng buộc bảng
Việc tạo đồng thời các chỉ mục cho các ràng buộc bảng, chẳng hạn như PRIMARY|UNIQUE|FOREIGN KEY, chưa được hỗ trợ. Có thể hỗ trợ PRIMARY|UNIQUE KEY trong tương lai, nhưng khó có thể hỗ trợ FOREIGN KEY.
Ví dụ
Chuẩn bị bảng với một số dữ liệu
create table tab ( id int not null, f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;
tạo chỉ mục bằng mệnh đề CONCURRENTLY
create index idx_tab_f1 on tab(f1) concurrently;
tạo chỉ mục duy nhất trên cột có dữ liệu trùng lặp
create unique index idx_tab_id on tab(id);
lệnh này báo lỗi:
Statement failed, SQLSTATE = 23000
attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
tạo chỉ mục duy nhất tương tự bằng CONCURRENTLY
create unique index idx_tab_id on tab(id) concurrently;
lệnh này đưa ra cảnh báo:
Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
kiểm tra xem chỉ mục có tồn tại không:
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)
lưu ý dấu NOT VALIDATED.
Xác thực chỉ mục:
alter index idx_tab_id validate unique;
Statement failed, SQLSTATE = 23000
unsuccessful metadata update-Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
Sửa bản ghi trùng lặp và xác thực lại
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;
không có lỗi.
Kiểm tra trạng thái chỉ mục:
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)
Tải xuống HQbird và dùng thử ngay: /vi/download-hqbird