首页 > 其他分享 >lightdb pllua存储过程实测

lightdb pllua存储过程实测

时间:2024-10-08 10:21:04浏览次数:7  
标签:src lightdb text pllua 实测 Time postgres

  根据对pl/lua的相关介绍和一些说明如http://www.pgsql.tech/project_305_10000096,其性能相比plpgsql和plsql快不少,那实际到底如何呢?下面拿demo和一些实际的来对比下。

1、lua安装。

  从https://www.lua.org/download.html下载最新版。

  因为pllua需要依赖lua.so动态库,所以不能直接make test all(默认只会生成lua.a静态库)。需要修改一下Makefile。参考https://www.jianshu.com/p/91fac87bd6d3即可。

  系统有可能自带了其他版本的lua,所以PATH和LD_LIBRARY_PATH环境变量需要配置一下。

2、pl/lua插件安装。

 参考https://pllua.github.io/pllua/#S3。

从github下载最新的tag https://github.com/pllua/pllua/tags。

解压,cd到pllua_REL_2_0_12,执行编译。

make PG_CONFIG=/home/lightdb/stage/lightdb-x/bin/lt_config \
     LUA_INCDIR="/usr/local/include" \
     LUALIB="-llua" \
     LUAC="luac" LUA="lua" install
[lightdb@host11 pllua-REL_2_0_12]$ make PG_CONFIG=/home/lightdb/stage/lightdb-x/bin/lt_config      LUA_INCDIR="/usr/local/include"      LUALIB="-llua"      LUAC="luac" LUA="lua" install
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O0 -g3 -D TRACE_SYNCSCAN -D EXEC_NESTLOOPDEBUG -D EXEC_SORTDEBUG -D EXEC_MERGEJOINDEBUG -D DEBUG_DEADLOCK -D DEBUG_TO_FROM_CHAR -D HJDEBUG -D WAL_DEBUG -D LOCK_DEBUG -D HASH_DEBUG -D OPTIMIZER_DEBUG -gdwarf-4 -mcx16 -fPIC -shared -o pllua.so src/compile.o src/datum.o src/elog.o src/error.o src/exec.o src/globals.o src/init.o src/jsonb.o src/numeric.o src/objects.o src/paths.o src/pllua.o src/preload.o src/spi.o src/time.o src/trigger.o src/trusted.o -L/home/lightdb/stage/lightdb-x/lib    -L/home/lightdb/zjh-dev/make/../.local/pmdk/lib -Wl,--as-needed -Wl,-rpath,'/home/lightdb/stage/lightdb-x/lib',--enable-new-dtags  src/compat.o -llua 
/bin/mkdir -p '/home/lightdb/stage/lightdb-x/lib'
/bin/mkdir -p '/home/lightdb/stage/lightdb-x/share/extension'
/bin/mkdir -p '/home/lightdb/stage/lightdb-x/share/extension'
/bin/install -c -m 755  pllua.so '/home/lightdb/stage/lightdb-x/lib/pllua.so'
/bin/install -c -m 644 .//pllua.control .//plluau.control '/home/lightdb/stage/lightdb-x/share/extension/'
/bin/install -c -m 644 .//scripts/pllua--2.0.sql .//scripts/pllua--1.0--2.0.sql .//scripts/plluau--2.0.sql .//scripts/plluau--1.0--2.0.sql  '/home/lightdb/stage/lightdb-x/share/extension/'
/bin/mkdir -p '/home/lightdb/stage/lightdb-x/include/server/extension/pllua/'
/bin/install -c -m 644   .//src/pllua.h .//src/pllua_pgver.h .//src/pllua_luaver.h .//src/pllua_luajit.h '/home/lightdb/stage/lightdb-x/include/server/extension/pllua/'

重启lightdb。

lightdb@postgres=# create extension pllua;
CREATE EXTENSION
lightdb@postgres=# create function hello(person text) returns text language pllua as $$
lightdb@postgres$#   return "Hello, " .. person .. ", from Lua!"
lightdb@postgres$# $$;
CREATE FUNCTION
lightdb@postgres=# select hello('Fred');
         hello          
------------------------
 Hello, Fred, from Lua!
(1 row)
lightdb@postgres=# create or replace function hello_plpgsql(person text) returns text as $$
begin
  return 'Hello, ' || person || ', from Lua!';
end;
$$ language plpgsql;
CREATE FUNCTION
Time: 3.088 ms
lightdb@postgres=# 
lightdb@postgres=# 
lightdb@postgres=# select count(hello_plpgsql('ab' || i)) from generate_series(1,1000000) i;
  count  
---------
 1000000
(1 row)

Time: 3548.604 ms (00:03.549)
lightdb@postgres=# select count(hello('ab' || i)) from generate_series(1,1000000) i;
  count  
---------
 1000000
(1 row)

Time: 20705.291 ms (00:20.705)

可见,对于简单计算的存储过程逻辑,pl/lua没有优势,因为上下文切换开销太大。

再看看计算密集型的逻辑。

lightdb@postgres=# create or replace function f_pl01(cnt int) returns int language plpgsql as $$
lightdb@postgres$# declare
lightdb@postgres$# i int;
lightdb@postgres$# begin
lightdb@postgres$#  i:=0;
lightdb@postgres$#  LOOP
lightdb@postgres$#      i = i + 1;
lightdb@postgres$#      EXIT WHEN i >= cnt;
lightdb@postgres$#  END LOOP;
lightdb@postgres$#  return i;
lightdb@postgres$# end;
lightdb@postgres$# $$;
CREATE FUNCTION
Time: 3.291 ms
lightdb@postgres=# 
lightdb@postgres=# 
lightdb@postgres=# create function f_lua01(cnt int) returns int language pllua as $$
lightdb@postgres$# local i=0
lightdb@postgres$# while( i < cnt ) do
lightdb@postgres$#    i = i+1
lightdb@postgres$# end
lightdb@postgres$# return i
lightdb@postgres$# $$;
CREATE FUNCTION
Time: 2.695 ms

lightdb@postgres=# select f_pl01(10000000);
f_pl01
----------
10000000
(1 row)

Time: 4980.736 ms (00:04.981)
lightdb@postgres=# select f_lua01(10000000);
f_lua01
----------
10000000
(1 row)

Time: 690.045 ms

纯粹的计算密集型逻辑,lua确实比plpgsql快很多。7倍之差了。

假设函数无状态,改成immutable。

lightdb@postgres=# alter function hello(text) immutable;
ALTER FUNCTION
Time: 2.001 ms
lightdb@postgres=# alter function hello_plpgsql(text) immutable;
ALTER FUNCTION
Time: 1.805 ms
lightdb@postgres=# select count(hello('ab' || i)) from generate_series(1,1000000) i;
  count  
---------
 1000000
(1 row)

Time: 16320.034 ms (00:16.320)
lightdb@postgres=# select count(hello_plpgsql('ab' || i)) from generate_series(1,1000000) i;
  count  
---------
 1000000
(1 row)

Time: 3587.384 ms (00:03.587)

可见,lua对此不敏感,反而不如plpgsql。

最后看一下执行sql的效率。

lightdb@postgres=# create table objects (id integer primary key, value text);
CREATE TABLE
Time: 31.956 ms
lightdb@postgres=# 
lightdb@postgres=# create function get_value(id integer) returns text language pllua stable
lightdb@postgres-# as $$
lightdb@postgres$#   local r = q:execute(id)
lightdb@postgres$#   return r and r[1] and r[1].value or 'value not found'
lightdb@postgres$# end
lightdb@postgres$# do -- the part below will be executed once before the first call
lightdb@postgres$#   q = spi.prepare("select value from objects where id=$1")
lightdb@postgres$# $$;
CREATE FUNCTION
Time: 2.918 ms
lightdb@postgres=# select count(get_value(1)) from generate_series(1,100000) i;
 count  
--------
 100000
(1 row)

Time: 9849.911 ms (00:09.850)
-------------------
lightdb@postgres=# CREATE OR REPLACE FUNCTION get_userid(name int) RETURNS text
lightdb@postgres-# AS $$
lightdb@postgres$# DECLARE
lightdb@postgres$# username text;
lightdb@postgres$# BEGIN
lightdb@postgres$#     select value into username from objects where id = name;
lightdb@postgres$# if username is null then
lightdb@postgres$# 

lightdb@postgres$# username = 'value not found';
lightdb@postgres$# end if;
lightdb@postgres$# return username;
lightdb@postgres$# EXCEPTION
lightdb@postgres$#         WHEN NO_DATA_FOUND THEN
lightdb@postgres$# 

lightdb@postgres$# 

lightdb@postgres$# username = 'value not found';
lightdb@postgres$# return username;
lightdb@postgres$# END;
lightdb@postgres$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
Time: 2.720 ms

lightdb@postgres=# select count(get_userid(1)) from generate_series(1,100000) i;
 count  
--------
 100000
(1 row)

Time: 3713.081 ms (00:03.713)

从上可知,访问sql引擎,虽然都是spi。pllua性能远远低于plpgsql。

计算plpgsql在表达式上慢,那加一些初始化看下。如下:

lightdb@postgres=# CREATE OR REPLACE FUNCTION get_userid(name int) RETURNS text
lightdb@postgres-# AS $$
lightdb@postgres$# DECLARE
lightdb@postgres$# username text;
lightdb@postgres$# username1 text:='';
lightdb@postgres$# username2 text:='';
lightdb@postgres$# username3 text:='';
lightdb@postgres$# username4 text:='';
lightdb@postgres$# userid int:=0;
lightdb@postgres$# usernmae text:='abc';
lightdb@postgres$# BEGIN
lightdb@postgres$#     select value into username from objects where id = name;
lightdb@postgres$# if username is null then
lightdb@postgres$# 

lightdb@postgres$# username = 'value not found';
lightdb@postgres$# end if;
lightdb@postgres$# return username;
lightdb@postgres$# EXCEPTION
lightdb@postgres$#         WHEN NO_DATA_FOUND THEN
lightdb@postgres$# 

lightdb@postgres$# 

lightdb@postgres$# username = 'value not found';
lightdb@postgres$# 

lightdb@postgres$# 

lightdb@postgres$# userid = -1;
lightdb@postgres$# 

lightdb@postgres$# 

lightdb@postgres$# usernmae = 'error';
lightdb@postgres$# return username;
lightdb@postgres$# END;
lightdb@postgres$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
Time: 3.263 ms
lightdb@postgres=# select count(get_userid(1)) from generate_series(1,100000) i;
 count  
--------
 100000
(1 row)

Time: 3590.226 ms (00:03.590)

虽然逻辑多了一些,但是性能差距不明显,仍然远远快于pllua。

从上可知,除非是跟数据库无关的计算密集型逻辑,否则使用pllua并不合适。

标签:src,lightdb,text,pllua,实测,Time,postgres
From: https://blog.51cto.com/zhjh256/12186267

相关文章

  • LightDB rownum使用示例及性能测试
    如下所示:lightdb@oradb=#explainanalyzeselect*from(selecta.*,rownumrnfrom(select*fromv,v1wherev.id=v1.idandnotexists(select1fromtwhereid<>v.id)andv1.id<>'31'orderbyv1.id)awhererownum<100000+1000)whe......
  • 骨传导耳机品牌排行榜分享:360度实测分析10款抢手骨传导耳机!
    随着科技的不断进步和人们生活方式的变化,骨传导耳机以其独特的传声方式和开放式设计,逐渐成为运动爱好者、户外活动家以及听力障碍人士的新宠。不同于传统耳机将声音直接导入耳道,骨传导耳机通过振动颅骨将声音传递至内耳,不仅能够保护听力,还能在享受音乐的同时保持对外界环境的感......
  • 云电脑玩游戏挑选标准,ToDesk实测体验
    大家玩游戏还在攒机吗?与其花费时间精力在组装游戏电脑上,不如用上最近兴起的云电脑软件。无需额外配备硬件设备,旧电脑原地变身成高性能电脑,随时随地享受游戏乐趣。但市面上众多的云电脑软件,该怎么选择才能确保游戏体验的流畅性和稳定性?小编总结了游戏玩家挑选云电脑标准,并以ToDes......
  • 关于Docker不能安装和拉取镜像解决办法,实测有效
    安装Docker**方式一:通过yum安装**sudoyuminstall-ydocker-cedocker-ce-clicontainerd.io**方式二:通过以下教程地址安装**https://github.com/tech-shrimp/docker_installer解决不能拉取镜像修改daemon.json文件vim/etc/docker/daemon.json#将以下内容复制......
  • 禁用QQ自动升级(实测可用)
    事件起因:某客户电脑QQ从怀旧版(9.7)自动升级到NT版本(9.9)版本,新版本由于消息通知功能不能直接查看,老版本右下角消息闪烁,鼠标放上去便可以看到有几个联系人的消息,因此客户强烈要求版本回退到9.7版本,于是帮客户卸载重装;没两天,客户又来报修说是QQ又自动升级到了9.9版本,确定QQ设置......
  • 骨传导耳机哪个牌子好?性能一流的五大热卖骨传导耳机实测剖析!
    近年来,骨传导耳机因其独特的传声技术和安全的使用体验,迅速在市场中崭露头角,吸引了大量运动爱好者和科技爱好者的关注。然而,随着骨传导耳机的普及,网络上关于其“智商税”的声音也不绝于耳。很多人在初次尝试后,对其效果表示怀疑,甚至认为这是一种过度营销的产品。那么,骨传导耳机究......
  • lightdb pllua存储过程实测
    根据对pl/lua的相关介绍和一些说明如http://www.pgsql.tech/project_305_10000096,其性能相比plpgsql和plsql快不少,那实际到底如何呢?下面拿demo和一些实际的来对比下。1、lua安装。从https://www.lua.org/download.html下载最新版。因为pllua需要依赖lua.so动态库,所......
  • 大数据-139 - ClickHouse 集群 表引擎详解4 - MergeTree 实测案例 ReplacingMergeTree
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:MergeTree存储结构Me......
  • 国内大厂这款「一站式」AI视频创作平台,一键将剧本生成视频!实测体验(附内测申请)
    大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年+,也一名AIGC爱好者,持续分享更多前沿的「AI工具」和「AI副业玩法」,欢迎一起交流~AI现在已经可以一键创作剧本、生成分镜图了?今天介绍的这个一站式AI视频创作平台厉害了!它可以自动将剧本拆分成分镜图,并转化成视频。还将多种......
  • 骨传导耳机哪个牌子最好?速看五大高能骨传导耳机实测推荐!
    随着科技的进步和人们对健康生活方式的追求,骨传导耳机逐渐成为了许多运动爱好者和音乐发烧友的新选择。它们独特的开放式设计不仅提供了与众不同的听觉体验,还能在享受音乐的同时保持对周围环境的警觉,大大提高了户外活动的安全性。然而,面对市场上琳琅满目的骨传导耳机品牌和型号......