PostgreSQL的隐藏功能

6 浏览
0 Comments

PostgreSQL的隐藏功能

我很惊讶这个还没有发布。你知道关于Postgres的任何有趣的技巧吗?尤其欢迎那些关于配置选项、扩展性和性能的不常见的技巧。我相信我们可以超过MySQL线程上的9条评论 🙂

0
0 Comments

隐藏功能是指在使用PostgreSQL时,可以利用一些技巧来提高性能。其中一个最简单的技巧是给PostgreSQL分配更多的RAM来工作。默认安装中,shared_buffers的值通常设置得太低,可以在postgresql.conf中修改这个值。将这个数值除以128,就可以得到PostgreSQL可以使用的内存大小。如果将其增加到足够的大小,可以让PostgreSQL的性能大幅提升。修改完配置后,别忘了重启PostgreSQL。

在Linux系统中,如果PostgreSQL无法重新启动,可能是因为达到了kernel.shmmax的限制。可以通过使用命令sysctl -w kernel.shmmax=xxxx来增加这个限制。为了使修改持久化,可以将kernel.shmmax的值添加到/etc/sysctl.conf文件中。

还有一些其他的PostgreSQL技巧可以在这里找到:http://www.postgres.cz/index.php/PostgreSQL_SQL_Tricks

0
0 Comments

PostgreSQL的隐藏功能:日期时间处理能力

PostgreSQL拥有非常强大的日期时间处理功能,这要归功于其INTERVAL支持。

例如:

select NOW(), NOW() + '1 hour';
              now              |           ?column?            
-------------------------------+-------------------------------
 2009-04-18 01:37:49.116614+00 | 2009-04-18 02:37:49.116614+00
(1 row)
select current_date ,(current_date +  interval '1 year')::date;
    date             |  date            
---------------------+----------------
 2014-10-17          | 2015-10-17
(1 row)

你可以将许多字符串强制转换为INTERVAL类型。

0
0 Comments

PostgreSQL隐藏功能的出现原因是因为PostgreSQL相对于MySQL来说更加合理,所以没有太多的“技巧”可以报告。手册中有一些不错的性能提示。还有一些与性能相关的事项需要记住:确保开启autovacuum;确保已经检查了postgres.conf文件(有效缓存大小、共享缓冲区、工作内存等等,有很多选项可以调整);使用pgpool或pgbouncer将“真实”数据库连接减少到最低;学习如何使用EXPLAIN和EXPLAIN ANALYZE,学会阅读输出;使用CLUSTER根据索引对数据进行排序,可以显著提高大型(大部分是只读)表的性能,聚集是一次性操作,表在随后更新时不会聚集。

下面是一些我发现有用的功能,与配置或性能无关。查看当前发生的情况:select * from pg_stat_activity;搜索杂项函数:select * from pg_proc WHERE proname ~* '^pg_.*'查找数据库的大小:select pg_database_size('postgres');select pg_size_pretty(pg_database_size('postgres'));查找所有数据库的大小:select datname, pg_size_pretty(pg_database_size(datname)) as size from pg_database;查找表和索引的大小:select pg_size_pretty(pg_relation_size('public.customer'));或者列出所有表和索引(可能更容易创建一个视图):select schemaname, relname,pg_size_pretty(pg_relation_size(schemaname || '.' || relname)) as size from (select schemaname, relname, 'table' as type from pg_stat_user_tables union all select schemaname, relname, 'index' as type from pg_stat_user_indexes) x;另外,您可以嵌套事务,回滚部分事务++test=# begin;BEGINtest=# select count(*) from customer where name='test'; count ------- 0 (1 row)test=# insert into customer (name) values ('test');INSERT 0 1test=# savepoint foo;SAVEPOINTtest=# update customer set name='john';UPDATE 3test=# rollback to savepoint foo;ROLLBACKtest=# commit;COMMITtest=# select count(*) from customer where name='test'; count ------- 1 (1 row)感谢您的提示!我不知道pg_size_pretty。我已经更新了我的答案,包括它。替换(答案,“per say”,“per se”)

0