Mục lục
1. Bài toán
Khi viết function trong PostgreSQL, đôi khi bạn muốn tính xem bước này, bước kia chạy mất bao lâu. Tuy nhiên, việc tưởng chừng như rất đơn giản này, lại có thể khiến bạn bối rối nếu chưa biết đấy.
Theo logic thông thường thì chỉ cần dùng hàm now() để lấy ra giá trị thời gian hiện tại
Kiểu như thế này:
CREATE OR REPLACE PROCEDURE public.pr_test() LANGUAGE plpgsql AS $procedure$ declare begin_time timestamp ; end_time timestamp ; r record; begin begin_time := now() at time zone 'Asia/Ho_Chi_Minh'; -- In begin_time ra raise notice 'Begin time: %', begin_time; select * into r from khach_hang; end_time := now() at time zone 'Asia/Ho_Chi_Minh'; -- In end_time ra raise notice 'End time: %', end_time; $procedure$ ;
Giả sử trong function này, tôi muốn tính ra bước này chạy hết bao nhiêu thời gian :
select * into r from customer;
Nên tôi đặt 2 biến begin_time và end_time vào để tính thời gian bắt đầu và kết thúc.
Tuy nhiên, khi chạy xong thủ tục, bạn sẽ thấy begin_time và end_time hoàn toàn giống nhau
call public.pr_test(); Output: Begin time: 2021-04-06 11:02:49.616143 End time: 2021-04-06 11:02:49.616143
2. Nguyên nhân
Nguyên nhân của việc này là, trong khi chạy trong thân function, hàm now() sẽ bị “đóng băng thời gian” nên chỉ lấy được thời gian ở thời điểm bắt đầu chạy function thôi.
3. Giải quyết
Để giải quyết vấn đề này, tôi sử dụng hàm clock_timestamp()
CREATE OR REPLACE PROCEDURE public.pr_test() LANGUAGE plpgsql AS $procedure$ declare begin_time timestamp ; end_time timestamp ; r record; begin begin_time := clock_timestamp(); -- In begin_time ra raise notice 'Begin time: %', begin_time; select * into r from khach_hang; end_time := clock_timestamp(); -- In end_time ra raise notice 'End time: %', end_time; $procedure$ ;
Và kết quả như sau:
call public.pr_test(); Output: Begin time: 2021-04-06 11:02:49.532654 End time: 2021-04-06 11:05:32.631245
Nguồn: https://dangxuanduy.com/
Hiện tại, tôi có tổ chức đều đặn các khóa học về quản trị Oracle Database, tôi sẽ để thông tin ở đây, để bạn nào quan tâm về lịch học cũng như chương trình học có thể theo dõi nhé.
KHOÁ DÀNH CHO NGƯỜI MỚI
KHÓA HỌC: QUẢN TRỊ ORACLE DATABASE THẬT LÀ ĐƠN GIẢN (ADMIN 1)
CÁC KHOÁ NÂNG CAO:
KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ KIẾN TRÚC MULTITENANT 12c
KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ HỆ THỐNG DATA GUARD
CÁC KHOÁ COMBO:
COMBO 1: ADMIN 1 + MULTITENANT 12c
COMBO 3: ADMIN 1 + MULTITENANT 12c + DATA GUARD
LỊCH HỌC:
Mời bạn xem tại đây: LỊCH HỌC CÁC LỚP ORACLE
ĐĂNG KÝ:
https://forms.gle/MtCAoRQFenP886y79
Hãy tham gia group “Kho tài liệu kiến thức database” để cùng học hỏi và chia sẻ nhé.