某发布会大模型出现time.sleep(6)后,我捋了一下数据库的sleep...

发布于:2024-05-17 ⋅ 阅读:(385) ⋅ 点赞:(0)

作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理
微信:jem_db
QQ交流群:587159446
公众号:IT邦德

前言

某发布会上展示的大模型能力引发了广泛讨论,尤其是展示过程中涉及的time.sleep(6)代码

📣 1.time.sleep(6)广泛讨论

近期,某发布会上展示的大模型能力引发了广泛讨论,尤其是展示过程中涉及的time.sleep(6)代码。有一些技术专家认为time.sleep(6)可能只是为了确保程序在演示过程中不会出现意外情况,而预设的一个缓冲步骤。这种做法在技术演示中并不鲜见,旨在使整个展示过程变得平稳和可控。

接下来我带大家来一起梳理一下数据库中用到sleep

📣 2.Oracle中的sleep

📣 2.1 使用场景

在Oracle数据库中,SLEEP用于暂停当前会话一定的时间。
这个函数在实际应用中有一定的作用,
比如调试代码时需要测试程序在不同时间间隔下的执行情况,
或者在某些特定场景下需要等待一段时间再执行后续操作

1.例如,要暂停查询10秒钟,
可以使用以下语句:

BEGIN
  DBMS_LOCK.SLEEP(5);
END;

2.操作之间暂停了2秒钟,
可以观察程序在不同时间点的执行情况,
以便进行调试

BEGIN
  -- 执行一些操作
  DBMS_OUTPUT.PUT_LINE('开始执行操作');

  -- 暂停2秒钟
  DBMS_LOCK.SLEEP(2);

  -- 执行一些其他操作
  DBMS_OUTPUT.PUT_LINE('继续执行其他操作');
END;
/

有一次故障案例中就用到了,非常方便
当时需要手动执行存储过程
dbms_repair.online_index_clean
来清理掉这些索引异常留下的痕迹,
删掉重建该分区索引,就需要停顿一些时间
declare
isClean boolean;
begin
isClean := FALSE;
while isClean=FALSE loop
isClean := dbms_repair.online_index_clean(dbms_repair.all_index_id,
dbms_repair.lock_wait);
dbms_lock.sleep(2);
end loop;
exception
when others then
RAISE;
end;
/

📣 2.2 注意事项

1.SLEEP函数是DBMS_LOCK包中的一个子程序,
只能在PL/SQL环境下调用,
无法直接在SQL语句中使用。

2.使用SLEEP函数会导致当前会话暂停指定的时间,
从而造成一定的延迟。
因此,在实际应用中需要根据情况慎重使用,
避免影响系统的正常运行

📣 3.MySQL中的sleep

📣 3.1 使用场景

在MySQL中,SLEEP()函数用于暂停执行一段指定的时间(以秒为单位)。它通常用于测试和模拟慢查询或延迟条件下的数据库操作.

可以使用如下命令测试慢查询日志
mysql> select sleep(10);
[root@jeames ~]$ tail -n 5 /var/lib/mysql/jeames-slow.log
# Time: 2022-09-23T23:57:06.096327Z
# User@Host: skip-grants user[root] @ localhost []  Id:     7
# Query_time: 10.000994  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1
SET timestamp=1663977416;

📣 3.2 注意事项

1.SLEEP()函数暂停的时间是间隔整数秒,
小数秒是不允许的。
2.SLEEP()函数执行期间,
MySQL连接不能用于其他查询,
这会导致连接被阻塞。
3.在存储过程或者触发器中使用SLEEP()时,
如果暂停时间太长,可能会超时。

📣 4.PostgreSQL中的sleep

📣 4.1 使用场景

在PostgreSQL中,如果你想要让某个操作或查询在特定的时间后执行,你可以使用PERFORM语句配合pg_sleep函数来实现延时执行的效果。pg_sleep函数可以让当前的会话进程暂停执行指定的秒数

下面是一个使用PERFORM和pg_sleep的案例,
会在执行查询前等待5秒钟:

DO LANGUAGE plpgsql $$
BEGIN
    PERFORM pg_sleep(5);
    -- 这里可以放置你的查询语句
    RAISE NOTICE '查询将在5秒后执行';
END;
$$;

2.pgbench压测环境

1)在指定数据库创建测试表
create table test(id int, age int);
2)准备数据
自定义脚本 insert.sql
\sleep 500ms
\set id random(1,100000)
\set age random(18,32)
insert into test(id, age) values(:id, :age);

pgbench -f insert.sql -c 10 -j \
10 -M prepared -n -T 600 -r -h \
192.168.10.11 -p 5432 -U \
pg_test -d postgres

📣 4.2 注意事项

请确保调用 pg_sleep 的会话没有持有不必要的锁。否则其它会话可能必须等待这个休眠的会话释放所持有的锁,从而减慢系统速度。

📣 5.数据库静默安装脚本

压缩安装包时候,2秒提示进度

while true;
do 
    echo -n ".";sleep 2;
    MY_EXEC=`ps -ef | grep unzip | grep -Evi grep`
    if [ "$MY_EXEC" = "" ] 
    then
        break;
    fi 
done
echo " "

📣 6.总结

DB中sleep()函数的调用需要一个时间作为参数,代表数据库执行挂起的时间间隔。本文的一些小案例希望带给大家帮助


网站公告

今日签到

点亮在社区的每一天
去签到