关于postgresql13的信息

PostgreSQL 源码解读(28)- 查询语句#13(查询优化-上拉子链接#3)

本节简单介绍了PG查询逻辑优化中的子查询链接(subLink),以EXISTS子链接为例介绍了子查询链接上拉主函数处理逻辑以及使用gdb跟踪分析。

创新互联公司专业为企业提供云溪网站建设、云溪做网站、云溪网站设计、云溪网站制作等企业网站建设、网页设计与制作、云溪企业网站模板建站服务,十载云溪做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

上一节介绍了ANY子链接,本节介绍了EXISTS子链接.

为便于方便解析,根据日志分析,得出查询树如下图所示:

convert_EXISTS_sublink_to_join函数源码:

相关数据结构

1、Var

XX_one_pos

依赖的函数

simplify_EXISTS_query

OffsetVarNodes

IncrementVarSublevelsUp

IncrementVarSublevelsUp

pull_varnos

contain_vars_of_level

query_tree_walker

OffsetVarNodes_walker

query_or_expression_tree_walker

pull_varnos_walker

contain_vars_of_level_walker

expression_tree_walker

postgreSQL:按日期查询

CREATE TABLE table1 (

id   INT,

name VARCHAR(8),

createdate  DATE

);

INSERT INTO table1

SELECT  1, 'name1',  TO_DATE('2013-12-12', 'YYYY-MM-DD')  UNION  ALL

SELECT  2, 'name2',  TO_DATE('2013-12-13', 'YYYY-MM-DD')  UNION  ALL

SELECT  3, 'name2',  TO_DATE('2013-12-14', 'YYYY-MM-DD')  UNION  ALL

SELECT  4, 'name2',  TO_DATE('2013-12-15', 'YYYY-MM-DD')  UNION  ALL

SELECT  5, 'name2',  TO_DATE('2013-12-15', 'YYYY-MM-DD')  UNION  ALL

SELECT  6, 'name2',  TO_DATE('2013-12-12', 'YYYY-MM-DD');

SELECT DISTINCT

(SELECT COUNT(1) FROM  table1 t2 WHERE t1.createdate = t2.createdate) AS count,

createdate  

FROM

table1  t1

ORDER BY

createdate;

count | createdate

-------+------------

2 | 2013-12-12

3 | 2013-12-13

4 | 2013-12-14

6 | 2013-12-15

(4 行记录)

PostgreSQL服务器启动及关闭方法

1. 启动数据库服务器(posgres用户):

[postgres@localhost bin]$ postgres -D /opt/postgresql/data/ /opt/postgresql/log/pg_server.log 21

[1] 4508

当然如果设置了环境变量

PGDATA=/opt/postgresql/data

export PGDATA

后,可使用pg_ctl工具进行启动:

[postgres@localhost log]$ pg_ctl start -l /opt/postgresql/log/pg_server.log

pg_ctl: another server might be running; trying to start server anyway

pg_ctl: could not start server

Examine the log output.

[postgres@localhost log]$

因为之前已经启动,所以打印“another server might be running”。此时,查看日志,有如下信息:

[postgres@localhost log]$ cat pg_server.log

FATAL: lock file "postmaster.pid" already exists

HINT: Is another postmaster (PID 4491) running in data directory "/opt/postgresql/data"?

[postgres@localhost log]$

当然,最简的.启动方式是:

[postgres@localhost ~]$ pg_ctl start

server starting

[postgres@localhost ~]$ LOG: database system was shut down at 2011-07-09 13:58:00 CST

LOG: autovacuum launcher started

LOG: database system is ready to accept connections

如果要在操作系统启动时就启动PG,可以在/etc/rc.d/rc.local 文件中加以下语句:

/opt/postgresql/bin/pg_ctl start -l /opt/postgresql/log/pg_server.log -D /opt/postgresql/data

2.关闭服务器

最简单方法:

[postgres@localhost ~]$ pg_ctl stop

waiting for server to shut down.... done

server stopped

与Oracle相同,在关闭时也可采用不同的模式,简介如下:

SIGTERM

不再允许新的连接,但是允许所有活跃的会话正常完成他们的工作,只有在所有会话都结束任务后才关闭。这是智能关闭。

SIGINT

不再允许新的连接,向所有活跃服务器发送 SIGTERM(让它们立刻退出),然后等待所有子进程退出并关闭数据库。这是快速关闭。

SIGQUIT

令 postgres 向所有子进程发送 SIGQUIT 并且立即退出(所有子进程也会立即退出),而不会妥善地关闭数据库系统。这是立即关闭。这样做会导致下次启动时的恢复(通过重放 WAL 日志)。我们推荐只在紧急的时候使用这个方法。

SIGKILL

此选项尽量不要使用,这样会阻止服务器清理共享内存和信号灯资源,那样的话你只能在启动服务器之前自己手工做这件事。另外,SIGKILL 直接把 postgres 杀掉,而不会等它把信号中继给它的子进程,因此我们还需要手工杀掉每个独立子进程。

使用方法举例:

[postgres@localhost ~]$ pg_ctl stop -o SIGTERM

LOG: received smart shutdown request

LOG: autovacuum launcher shutting down

waiting for server to shut down....LOG: shutting down

LOG: database system is shut down

done

server stopped

[postgres@localhost ~]$

最快速关闭方法:kill postgres 进程

[postgres@localhost ~]$ kill -INT `head -1 /opt/postgresql/data/postmaster.pid`

[postgres@localhost ~]$ LOG: received fast shutdown request

LOG: aborting any active transactions

LOG: autovacuum launcher shutting down

LOG: shutting down

LOG: database system is shut down

附:postgre启动后的进程,如下:

[postgres@localhost ~]$ ps -ef|grep post

root 4609 4543 0 13:57 pts/2 00:00:00 su - postgres

postgres 4610 4609 0 13:57 pts/2 00:00:00 -bash

postgres 4724 1 0 14:08 pts/2 00:00:00 /opt/postgresql/bin/postgres

postgres 4726 4724 0 14:08 ? 00:00:00 postgres: writer process

postgres 4727 4724 0 14:08 ? 00:00:00 postgres: wal writer process

postgres 4728 4724 0 14:08 ? 00:00:00 postgres: autovacuum launcher process

postgres 4729 4724 0 14:08 ? 00:00:00 postgres: stats collector process

postgres 4752 4610 0 14:11 pts/2 00:00:00 ps -ef

postgres 4753 4610 0 14:11 pts/2 00:00:00 grep post

[postgres@localhost ~]$

postgresql 多条件查询

select name,age from table_name where name in ('张‘,’王‘)

如果姓名是主键的话,你就能找到这两条记录了。

PostgreSQL中使用UUID

UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一个 128 比特的数字,可以用于唯一标识每个网络对象或资源。由于它的生成机制,一个 UUID 可以保证几乎不会与其他 UUID 重复,因此常常用于生成数据库中的主键值。

1.pgcrypto 模块提供的 uuid

PostgreSQL 提供了一个用于加/解密的扩展模块 pgcrypto,其中的 gen_random_uuid() 函数可以用于返回一个 version 4 的随机 UUID。

2.uuid-ossp 模块提供的 uuid

uuid-ossp模块提供函数使用几种标准算法之一产生通用唯一标识符(UUID)。还提供产生某些特殊 UUID 常量的函数。

1.将当前目录转移到 PostgreSQL 源代码目录下的 contrib;如:

2.执行如下命令来安装扩展模块

如果要安装 uuid-ossp 模块,需要在执行安装扩展模块之前,执行 configure 并添加 --with-uuid=xxx,xxx取值为:

然后再执行安装扩展模块的命令。

3.检查是否安装,在 PostgreSQL 的安装目录下的 /share/extension 目录下,查看是否有模块相关的文件。如:

注: gen_random_uuid() 从 PostgreSQL 13 开始成为了一个内置函数

如果您所使用的PostgreSQL版本在13以上,则不需要执行如下语句:

生成uuid:

如果想要生成没有中划线(-)的 UUID 字符串,可以使用 REPLACE 函数:

查看包含的函数:

执行如下命令生成 uuid:

虚拟机中如何安装PostgreSQL数据库?

配置PostgreSQL对应的yum源

使用命令:dnf install -y ,获取yum配置文件。

安装PostgreSQL13对应的rpm包

一般来说PostgreSQL需要安装的包包括:

依赖库包:postgresql13-libs.x86_64

模块分布式:postgresql13-contrib.x86_64

客户端:postgresql13.x86_64

服务端:postgresql13-server.x86_64

创建postgres用户及组

groupadd postgres 创建postgres组

useradd -g postgres创建postgres用户

初始化数据库

安装postgresql数据库后,默认的数据目录为: /var/lib/pgsql/10/data/。但是在实际使用中,我们必须为postgresql数据库指定专用的数据路径。

1、创建指定路径

mkdir -p /data/pgdata

2、修改pgdata的所有者

chown postgres /data/pgdata

3、切换到postgres用户

su - postgres?

4、初始化postgres数据库实例

/usr/pgsql-13/bin/initdb -D /data/pgdata

到这里就安装完成了。


本文标题:关于postgresql13的信息
分享网址:http://scyanting.com/article/dscojed.html