PostgreSQL频繁更新数据的大表查询计划可能会搞错的应对方案

当表的数据比较多(大概百万级以上)的时候,对表的使用是重度依赖analyze采集的数据的。尤其是当表处于被频繁的update、insert操作下,之前analyze的数据如果不及时更新,极有可能让查询计划走歪,然后导致一个查询可能要付出10倍以上的时间——我遇到过好几次,每次都是通过手动vaccum解决。
本来pg是有autovacuum的,这里之所以没有触发,还是因为表比较大,百万行的数据,update个几万行,变更率才百分之几,而调度autovacuum_analyze的默认阈值是百分之十。
这就比较尴尬了,好在pg支持针对单表做详细的定制。这里给出一个参考SQL:

alter table demo_table SET (fillfactor=85, autovacuum_vacuum_scale_factor=0.02, autovacuum_analyze_scale_factor=0.02);

阅读全文

找出Postgres中占用磁盘最多的表

SELECT schemaname,
relname,
pg_size_pretty(pg_table_size(relid))
from pg_stat_user_tables
order by pg_table_size(relid) desc ,schemaname;

阅读全文

利用pg_stat_statements排查PostgreSQL中的慢SQL

  1. 编辑postgresql.conf
    • shared_preload_libraries = 'pg_stat_statements'
    • track_activity_query_size = 16384

阅读全文

几个较新的Vert.x例子

阅读全文

PostgreSQL中的匿名存储过程

阅读全文

PostgreSQL中执行即时代码段(匿名存储过程)

某些时候需要执行过程化的逻辑,单纯靠组织SQL语句已经完成不了了,这个时候一般需要引入存储过程用以实现。但是如果只是单纯执行一段逻辑,而不是要封装一个函数,用来接收参数复用,完全可以通过DO语句执行一个匿名代码段。这样就可以避免:创建存储过程 -> 调用存储过程 -> 删除存储过程的窘境。
这里给出一个简短的SQL演示:

DO
$$
declare
i int := 0;
begin
raise notice 'il:%',i;
declare
i int;
begin
raise notice 'i2:%',i;
end;
end
$$ language plpgsql;

阅读全文

PortgreSQL中找到那些被大量顺序扫表没走索引的表

select schemaname,
relname,
seq_scan,
seq_tup_read,
seq_tup_read / seq_scan as avg,
idx_scan
from pg_stat_user_tables
where seq_scan > 0
order by seq_tup_read desc
limit 20

阅读全文

用groovy实现根据规则校验单据数据

单据字段校验,在任何管理信息系统中都是普通得不能再普通的问题。通常我们的都会选择在前端以及后端各实现一遍。
前端实现,方便用户体验;后端实现,确保数据健康。
但是总觉得同样的业务实现两遍,真的不符合直觉。我的想法是,把校验规则抽象出来,通过公共方法来处理单据校验问题。做到一套规则,两处判断。减少业务开发人员的重复劳动。
比如规则是这样的

[
{
"target": "v_name",
"expression": "notBlank(v_name)",
"tip": "姓名必填"
},
{
"target": [
"v_password",
"v_password_twice"
],
"expression": "v_password == v_password_twice",
"tip": "两次密码输入不一致"
}
]

阅读全文

突破mac系统要求密码不能小于4个字符的限制

  1. 在终端执行pwpolicy getaccountpolicies > temp.xml
  2. 编辑temp.xml文件,例如vim temp.xml
  3. 删除第一行Getting global account policies文字,保证这个文件以<?xml开头

阅读全文

完整卸载MacOS里的JDK

首先,所有的资料在java官方网站都有提供,我这里做个搬运工,只罗列一下重点。

阅读全文