Sức mạnh của Index trong Database

Việc nghe nói về tác dụng của Index trong quá trình Turning Database nói chung và Oracle nói riêng từ rất lâu. Việc cảm nhận thấy được tốc độ truy vấn, các chỉ số liên quan tới quá trình Turning như I/O… trong quá trình thực thi thấy rất rõ ràng. Những việc này mình thấy được do những người khác chỉ, bản thân thấy được trước và sau quá trình người khác đánh Index để sử dụng. Về tầm quan trọng và sức mạnh của Index trong Database là không cần bàn cãi.

Vừa rồi mình có phải build một luồng nghiệp vụ hoàn toàn mới cho một quy trình nghiệp vụ mới. Cụ thể là mỗi một khách hàng mới cần phải có một mã OTP để nhắn tin xác thực số điện thoại. Mã OTP là ngẫu nhiên, có thể là chữ hoặc số.
Sau khi phân tích và họp, hệ thống sẽ sinh trước mã OTP. Mỗi mã OTP gồm 5 ký tự có thể có cả chữ hoặc số. Toàn bộ các mã OTP này được sinh ra và lưu vào 1 bảng, hàng ngày hệ thống sẽ quét các khách hàng mới và tiến hành cập nhật ngẫu nhiên vào bảng này. Bảng này sẽ có (10+26)(10+26)(10+26)(10+26)(10+26) = 60 triệu dòng.
Hàng ngày có dưới 1000 khách hàng mới nên hệ thống xử lý cũng hơi chậm nhưng không có gì đáng ngại khi lấy ngẫu nhiên các mã OTP để cập nhật khách hàng, lấy ngẫu nhiên mỗi mã OTP mất hơn 1s.

Nhưng hôm vừa rồi, hệ thống cần đồng bộ gần 100.000 khách hàng mới vào và cũng có yêu cầu xác thực nên phải lấy ngẫu nhiên từng đó mã OTP. Việc này khi chạy thì đúng là không ổn chút nào. Nếu để chạy bình thường thì phải vài ngày mới có thể chạy xong, như vậy không đảm bảo tiến độ. Tình thế này buộc mình phải xem lại phương thức lấy ngẫu nhiên mã OTP. Vì không muốn thay đổi quy tắc lấy ngẫu nhiên nên mình tập trung vào tối ưu câu truy vấn. Khi kiểm tra độ phức tạp và I/O của câu lệnh lấy thì mình thấy việc lấy mã OTP rất nặng. Phải thôi, lấy ngẫu nhiên 1 trong 60 triệu dòng mà phải loại đi những mã OTP đã qua sử dụng thì khá nặng rồi.
Mình kiểm tra thì đúng là mình chưa đánh Index cho bảng này, thế là việc đầu tiên mình tiến hành đánh Index và đo lại thì hiệu quả thật không ngờ. Tốc độ lấy mã OTP của một khác hàng giảm xuống còn ~0.0016s. Mình chạy cho 100.000 khách hàng mất chưa tới 3 phút là xong. Công việc hàng ngày khoảng 1000 khách hàng thì chưa tới 2s đã chạy xong.

Sử dụng Index còn cần phải quan tâm đến quá trình Insert, Update dữ liệu. Nhưng hệ thống mình thì trường đánh Index này chỉ sinh ra một lần và không có thao tác update vào trường Index nên không phải quan tâm đến nó. Sau việc này đúng là mình đã thực sự bị thuyết phục bởi sức mạnh của Index trong Database. Bài học sau này cần vận dụng nhiều hơn tới Index trong quá trình triển khai hệ thống.

Config send email from oracle database server

ORA-24247: network access denied by access control list (ACL)

Kiểm tra bằng cách chạy câu lệnh

select * from dba_network_acls;

Nếu có data dạng:

 HOST LOWER_PORT UPPER_PORT ACL  ACLID
 mail.vstv.vn    1   1024    /sys/acls/send_mail.xml D285E04B69B942688587AB8FE5B41C69 

Chạy câu lệnh này:

BEGIN
   DBMS_NETWORK_ACL_ADMIN.create_acl (
     acl          => 'send_mail.xml',
     description  => 'Purpose of the acl is to send mail',
     principal    => 'INTRANET',
     is_grant     => TRUE,
     privilege    => 'connect',
     start_date   => SYSTIMESTAMP,
     end_date     => NULL);
 DBMS_NETWORK_ACL_ADMIN.assign_acl (
     acl         => 'send_mail.xml',
     host        => 'mail.trituenhantao.info',
     lower_port  => 1,
     upper_port  => 1024);
 COMMIT;
 END;