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.

Đọc thêm  Hướng dẫn cài đặt PostgreSQL trên CentOS 7

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_timeend_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_timeend_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

   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.


   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/

Xin cho tôi được biết, bạn cảm thấy bài viết này như thế nào? Ý kiến của bạn sẽ giúp tôi nâng cao chất lượng bài viết của mình.

    Hãy chia sẻ bài viết này nếu bạn thấy có ích nhé
    0 0 votes
    Article Rating
    Subscribe
    Notify of
    guest
    0 Comments
    Inline Feedbacks
    View all comments