PostgreSQL的许多小技巧

1.使用空间索引进行快速间隔数据类型的搜索.

  间隔搜索有时候很慢,大部分原因是索引优化器不使用索引,并且在开始列和结束列比较独立。一个解决方案是使用空间索引,它可以把两个独立的值当做一个值来使用。

  postgres=# EXPLAIN ANALYZE SELECT * FROM testip WHERE 19999999 BETWEEN startip AND endip;

  QUERY PLAN ---------------------------------------------------------------- Seq Scan on testip (cost=0.00..19902.00 rows=200814 width=12) (actual time=3.457..434.218 rows=1 loops=1) Filter: ((19999999 >= startip) AND (19999999 <= endip)) Total runtime: 434.299 ms (3 rows) Time: 435,865 ms

  结论:根据以上的执行计划,可以知道上边的查询使用的是序列扫描,花费的时间是:435,865 ms

  postgres=# CREATE INDEX ggg ON testip USING gist ((box(point(startip,startip),point(endip,endip))) box_ops);

  使用如下的查询:

  EXPLAIN ANALYZE SELECT * FROM testip WHERE box(point(startip,startip),point(endip,endip)) @> box(point (19999999,19999999), point(19999999,19999999));

  结论:执行计划使用的是Bitmap Index Scan on ggg,花费的时间是:2,805 ms。可见相比以前的查询,使用空间索引的查询效率大大的提高了。

  2.16进制到10进制的转换

  我们已经有了系统函数将10进制转换成16进制:to_hex(11) result: b 下边的函数实现将16进制的数转换成10进制。非常的简单:

 

[html]  view plain copy
 
  1. create or replace function to_dec(text)  
  2. returns integer as $$  
  3. declare r int;  
  4. begin  
  5.   execute E'select x''||$1|| E''::integer' into r;  
  6.   return r;  
  7. end  
  8. $$ language plpgsql;  

--测试

 

 

[html]  view plain copy
 
  1. select to_dec('ff');  

--结果

[html]  view plain copy
 
  1. 255  

3.ALTER TABLE ALTER COLUMN USING 语法

 

  在PostgreSQl里边,我们不能将varchar类型直接转换到bool,但是我们可以使用Using语法加判断后进行转换。

[html]  view plain copy
 
  1. CREATE TABLE foo(a varchar);  
  2. INSERT INTO foo VALUES ('ano');  

--更改数据类型,会报错误信息

[html]  view plain copy
 
  1. ALTER TABLE foo ALTER COLUMN a TYPE boolean;  
  2. ERROR: column "a" cannot be cast to type "pg_catalog.bool"  

--使用Using语法更改数据类型

[html]  view plain copy
 
  1. ALTER TABLE foo  
  2. ALTER COLUMN a TYPE boolean  
  3.    USING CASE a  
  4.    WHEN 'ano' THEN true  
  5.    ELSE false END;  

--更改成功

[html]  view plain copy
 
  1. SELECT * FROM foo;  

4.Quote_ident 的使用

 

  使用双引号是一种防止SQL注入的方法,quote_ident 可以检查参数,如果参数中包含任何非法的字符,它会在参数两边加上""

  非常简单和有效,但是问题是schema.name,因为中间有点分割。问题如下:

 

[html]  view plain copy
 
  1. select quote_ident('public.foo');  

他不能在schema和name两边加上双引号。

 

  我们可以通过使用函数来按点分割上边的对象名称,在每个单独的对象上使用quote_ident来完成我们的目的:

  --对数组进行表转换,针对每一列来使用quote_ident

[html]  view plain copy
 
  1. CREATE OR REPLACE FUNCTION quote_array(text[])  
  2. RETURNS text AS $$  
  3. SELECT array_to_string(array(SELECT quote_ident($1[i])  
  4.                 FROM generate_series(1, array_upper($1,1)) g(i)),  
  5.             '.')  
  6. $$ LANGUAGE SQL IMMUTABLE;  

--创建函数按点进行拆分字符串

[html]  view plain copy
 
  1. CREATE OR REPLACE FUNCTION quote_schema_ident(text)  
  2. RETURNS text AS $$  
  3. SELECT quote_array(string_to_array($1,'.'))  
  4. $$ LANGUAGE SQL IMMUTABLE;  

--测试

[html]  view plain copy
 
  1. select quote_schema_ident('public.foo tab');  

5.我们已经习惯使用PostgreSQL的exception来捕捉错误,但是错误信息一直不知道如何取得,SQLERRM变量可以给我们详细的信息

 

  以下是一个具体的示例:

[html]  view plain copy
 
  1. CREATE OR REPLACE FUNCTION fn_log_error(p_function varchar, p_location int, p_error varchar)  
  2. RETURNS void AS $$  
  3. DECLARE  
  4.  v_sql varchar;  
  5.  v_return varchar;  
  6.  v_error varchar;  
  7. BEGIN  

 --连接数据库

[html]  view plain copy
 
  1. PERFORM dblink_connect('connection_name', 'dbname=...');  

 --拼凑插入的字符串

[html]  view plain copy
 
  1. v_sql:= 'INSERT INTO error_log (function_name, location, error_message, error_time) '  
  2.      || 'VALUES (''' || p_function_name || ''', '  
  3.      || p_location || ', ''' || p_error || ''', clock_timestamp())';  

 --远程执行

[html]  view plain copy
 
  1. SELECT INTO v_return *  
  2.   FROM dblink_exec('connection_name', v_sql, false);  

 --获取远程的错误信息

[html]  view plain copy
 
  1. SELECT INTO v_error *  
  2.   FROM dblink_error_message('connection_name');  

 --如果出现错误则抛出异常

[html]  view plain copy
 
  1.  IF position('ERROR' in v_error) > 0 OR position('WARNING' in v_error) > 0 THEN  
  2.   RAISE EXCEPTION '%', v_error;  
  3.  END IF;  
  4.  PERFORM dblink_disconnect('connection_name');  
  5. EXCEPTION  
  6.  WHEN others THEN  

  --使用SQLERRM 来显示错误信息

[html]  view plain copy
 
  1.   PERFORM dblink_disconnect('connection_name');  
  2.   RAISE EXCEPTION '(%)', SQLERRM;  
  3. END;  
  4. $$ LANGUAGE plpgsql SECURITY DEFINER;  

SQLERRM是一个非常有用的变量,可以详细记录错误的具体信息,帮助我们分析执行中发现的错误。

 

6.循环优化技巧

 

plpgsql对于非SQL操作效率不是特别高。Plpgsql 不喜欢字符或者字符数组的累计操作,当我们也不能用Perl,因此我们只能用SQL

  --使用循环,结果会比较慢的函数

[html]  view plain copy
 
  1. CREATE OR REPLACE FUNCTION SlowList(int) -- slow function, usable for N <= 100  
  2. RETURNS varchar AS $$  
  3. DECLARE s varchar = '';  
  4. BEGIN  
  5.  FOR i IN 1..$1 LOOP  
  6.   s:= '<item>' || i || '</item>'; -- slow is s:= s || ..  
  7.  END LOOP;  
  8.  RETURN s;  
  9. END; $$ LANGUAGE plpgsql IMMUTABLE;  

--使用SQL,结果会比较快的函数

[html]  view plain copy
 
  1. CREATE OR REPLACE FUNCTON FastList(int) -- fast function  
  2. RETURNS varchar AS $$  
  3. BEGIN  
  4.  RETURN array_to_string(ARRAY(SELECT '<item>' || i || '</item>'  
  5.                  FROM generate_series(1, $1) g(i)),  
  6.              '');  
  7. END; $$ LANGUAGE plpgsql IMMUTABLE;  

--结果:在循环100以下的时候差别并不是很大,当循环更多的时候,差距就非常明显,都来试试吧!

 

  7.查询一组之中的头n条记录

  我们一般的做法是使用子查询如下:

 

[html]  view plain copy
 
  1. SELECT * FROM people WHERE id IN (  
  2.    SELECT id FROM people s  
  3.     WHERE people.category = s.category  
  4.     ORDER BY age LIMIT 2)  
  5. ORDER BY category, age;  

使用连接我们也可以达到同样的效果如下:

 

 

[html]  view plain copy
 
  1. SELECT s1.*  
  2.   FROM people s1  
  3.     LEFT JOIN  
  4.     people s2  
  5.     ON s1.category = s2.category AND s1.age < s2.age  
  6.  GROUP BY s1.id, s1.category  
  7.  HAVING COUNT(s2.id) <= 1  
  8.  ORDER BY s1.category, COUNT(s2.id);  

 

  说明:这个SQL语句的含义是找到同一类比自己的age大的记录,最后判断比自己大的记录的个数,如果是0,那么应该排名第一,

  如果是1,那么排名第二(HAVING COUNT(s2.id) <= 1)

基于Simplis仿真的UC2843芯片建模与关键参数优化指南 本文详细介绍了使用Simplis仿真工具为UC2843 PWM控制器进行行为级建模的方法与关键参数优化实践。通过精确搭建芯片内部振荡器、误差放大器及电流采样等核心模块,工程师可以深入理解其工作原理,并利用模型优化振荡频率、最大占空比及反馈环路等关键参数,从而提升开关电源设计的效率与可靠性。 阅读详情

相关推荐

内存预取黑科技:__builtin_prefetch在数据库和游戏开发中的高阶用法

本文深入探讨了GCC内置函数`__builtin_prefetch`在数据库和游戏开发中的高阶应用。通过LevelDB的SSTable文件读取优化和UE5引擎场景数据流式加载的实战案例,详细解析了预取参数调优的艺术,并借助perf工具量化分析了不同策略的性能提升效果。文章还介绍了与`__builtin_expect`等内置函数的协同优化技巧,帮助开发者最大化缓存命中率。

weixin_29019241的博客 417

PostgreSQL ALTER TABLE中改变数据类型时USING的用法

在修改表字段类型的时候使用Using来进行显示的转换类型。原文说明:SET DATA TYPE   This form changes the type of a column of a table. Indexes and simple table constraints involving the column willbe automatically converted to use

luojinbai的专栏 2万+

汽车ECU诊断入门:手把手教你用UDS协议(ISO14229)读取和清除故障码

本文详细介绍了如何使用UDS协议(ISO14229)进行汽车ECU诊断,包括故障码读取与清除的完整流程。从诊断环境搭建、UDS协议基础到实战案例分析,手把手教你掌握0x19诊断服务、安全访问机制等核心技能,适用于汽车电子工程师和诊断开发人员。

weixin_33701251的博客 455

PostgreSQL联结关键字 ON、USING、NATURAL

PostgreSQL联结关键字 ON USING NATURAL

luojinbai的专栏 5610

LED背光驱动电路解析:从MP3394芯片到液晶屏灯管控制

本文深入解析了以MP3394芯片为核心的LED背光驱动电路工作原理。从升压电路的能量转换到多路LED的均流控制,详细阐述了其作为液晶屏背光“大脑”的关键作用,并提供了黑屏、闪屏、亮度不均等常见故障的实战检修思路与排查方法。

agile9scrum的博客 824

使用freesurfer和3Dslicer进行脑区分割和电极定点(详细版)

1、安装好matlab和freesurfer2、在目标位置创建文件夹3、开放权限4、将需要计算的nii文件放入文件夹。

zQIANYUN的博客 5633

greenplum(二) postgresql SQL 状态: 42704之bug

postgresql SQL 状态: 42704之bug

xiaohai798的专栏 3744

Zotero内存占用与存储优化:从根源解决卡顿与空间不足

文献管理软件在学术工作中扮演着重要角色,其核心原理是通过数据库管理元数据与附件文件,实现文献的快速检索与组织。然而,随着文献库规模增长,软件的资源管理机制可能面临挑战,尤其是内存占用与存储空间优化问题。从技术价值看,高效的附件管理策略不仅能提升软件响应速度,还能确保数据安全与可移植性。在实际应用场景中,研究者常遇到软件卡顿、存储目录膨胀等痛点,这通常与附件存储模式、缓存机制及数据库维护有关。本文聚焦于Zotero这一主流工具,针对其内存占用高、文件无法删除等常见问题,提供了外置存储、链接附件、数据库维护等系

weixin_34209060的博客 471

postgresql 小技巧

Note: #PostgreSQL and PHP supports Batched Queries. #Awesome, huh? Version: SELECT VERSION() Directories: SELECT current_setting(‘data_directory’) SELECT current_setting(‘hba_file’)

深入理解PostgreSQL 5103

迈创cameralink采集卡安装操作说明

迈创cameralink采集卡安装操作说明MIL软件安装MIL软件下载获取MIL软件安装MIL软件安装常见问题 MIL软件安装 MIL软件下载获取 MIL软件安装 解压MIL安装包,点击MilSetup.exe开始安装,如下图所示; 备注:64位系统MIL软件可以同时安装32位和64位客户端,本文档默认安装64位客户端,64位系统安装32位MIL方法后续再展开讲(不建议这样用,很麻烦) 点击Launch Installation开始安装,64位系统,默认只安装64位MIL客户端 根据采集卡驱动,选择M

qq_23107577的博客 9354

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

宁波阿成的博客 903

PostgreSQL的小技巧(

PostgreSQL的小技巧(by  使用Oracle和PostgreSQL都有一段时间,一直试图将Oracle中许多先进的功能在PostgreSQL中使用,所以也在这方面一直比较注意,下面先整理出3点,以后会慢慢完善。(1)和Oracle类似的dblink功能使用过oracle的人都知道,oracle有个很先进的功能叫:dblink,能够在一个数据库中操作另外一个远程的数据库,比如:

在水一方 1262

电容放电测试解析

电子设备断电后滤波电容残留电荷存在触电风险,需符合IEC等安全标准对放电时间的要求。放电测试需测量电容电压下降至安全值的时间,设计可采用主动放电电路或被动放电电阻。常见问题包括电阻选择不当或电路设计缺陷,建议预留放电时间裕度并采用组合放电方案。合规的放电设计是确保产品安全性和可靠性的关键环节。

硬核科技 804

PostgreSQL的小技巧

本人使用Oracle和PostgreSQL数年,一直试图将Oracle中许多先进的功能在PostgreSQL中使用,所以也在这方面一直比较注意,下面先整理出3点,以后会慢慢完善。  (1)和Oracle类似的dblink功能  使用过oracle的人都知道,oracle有个很先进的功能叫:dblink,能够在一个数据库中操作另外一个远程的数据库,比如:一个数据库在中国北京,另外一台数据库在

在水一方 877

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

6个提升PostgreSQL性能的小技巧

介绍6个提升PostgreSQL性能的方法,充分发挥PostgreSQL在应用程序中的性能优势。

u013643074的博客 2420

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

提升PostgreSQL性能的小技巧

提升PostgreSQL性能的技巧**可以从多个方面入手,包括**硬件配置、数据库配置、查询优化和索引管理**。以下是一些实用的技巧:

PGCCC的博客 727

PostgreSQL最常用的一些小技巧

#PostgreSQL and PHP supports Batched Queries.#Awesome, huh? (是不是很酷?)Version:SELECT VERSION()Directories:SELECT current_setting(‘data_directory’)SELECT current_setting(‘hba_file’)SELECT current_setting

iihero@优快云 4553

postgresql 中的COALESCE()函数使用小技巧

这篇文章主要介绍了postgresql 中的COALESCE()函数使用小技巧,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 场景: 存在一个用户白名单表,提供了此用户的用户名和地区信息,判断此用户是否在此白名单表中。 如: 姓名 白名单地区 张三 中国,美国 则可使用如下语句: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

2万+

postgresql 中的时间处理小技巧

这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。计算结果取两位小数(方便条件筛选):round((ABS(a-b)::numeric / a), 2) * 100 < 10。date_part(‘day’, current_timestamp - time1) 两个时间相差的天数。返回相差的天数:(date(time1) - current_date)‘-’ :前x天/月/年。...

zl5186888的博客 749
上一篇: postgresql 字段sql语句 更改表名
下一篇: Eclipse去掉未使用的引用
weixir123
博客等级 码龄16年 1粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值