2023-05-02 12:02
从字面上错误的理解是说你的numeric数据类型溢出,要求绝对值小于10^13次方。你不妨试试double precision类型。。
这段代码主体是case when 判断语句,是根据i.time_at_job值的不同而返回不同的数值。
前面3个when是按特定的字串来返回特定的数值(如6_m返回0; 6_months_to_1_year返回1; 1_year_to_2_years返回2);
从第四个when开始(有~ '^[0-9]+$'的条件),是先按照正则表达式匹配到i.time_at_job为数值字符串,再按照将i.time_at_job转换为数值之后的范围来返回不同的值: 大于等于5且小于12,或者大于等于60返回5;大于等于12时返回除以12的四舍五入值整数(round函数);如果小于5,则返回转换后的整数值。
~ '^[0-9]+$'这个符号应该作为两个部分: ~为正则表达式的匹配运算符,它是区分大小写的,它是一个2元运算符,如果~前的字符串匹配后面的正则表达式,则返回true,否则返回false;后面的字符串为一个正则表达式字符串,代表要匹配的字符串必须全部为数字,并且至少有一个数字。用在该SQL中的作用就是确保i.time_at_job的值为一个数字字符串。
1.在服务器端选中一台客户机右击,然后点击“客户端属性”,弹出客户端属性对话框
2.在客户端对话框中,先将下端还原操作系统的“勾”去掉,然后点击“高级”出现客户端高级设置对话框,在系统盘设置中将缓存存放位置选为服务端,其他地方不要做任何更改。
3.重启该客户机,开始安装软件,安装过程中,会发现该机器缓存大小这一栏里缓存数值不断增加,直至安装完软件。(重新启动,再次运行该软件,以便确定该软件是否运行正常)
4.关闭客户机,等服务器上该客户机状态显示为未运行后,在服务端点击“镜像管理”
5.在镜像菜单中选中该客户机使用的镜像,单击“快照管理”按钮。
6.选中该客户机使用的快照节点,然后点击“生成快照”
7.在cache文件选项中选中制作快照的客户机,会自动填充下面的缓存路径,在快照信息子项中输入快照名名称和快照描述信息,点击“确定”按钮后,快照则做好了。
8选中所有客户机右击打开客户端属性对话框,在“启动菜单设置”中,将新做成的快照节点推送到用于启动的镜像这一栏中移动到最顶端,点击确定。
PostGreSQL采用“快照”方式来实现MVCC。具体地说,这意味着每一个事务中的查询仅能看到:
1.该事务启动之前已经提交的事务所作出的数据更改。
2.当前事务中该查询之前的查询所作出的更改。
PostGreSQL在每个事务启动时为该事务获取一个当前的数据库快照,快照中数据结构如下:
typedef struct SnapshotData
{
SnapshotSatisfiesFunc satisfies;
TransactionId xmin;
TransactionId xmax;
uint32 xcnt;
TransactionId *xip;
int32 subxcnt;
TransactionId *subxip;
CommandId curcid;
uint32 active_count;
uint32 regd_count;
bool copied;
} SnapshotData;
Transaction启动时形成快照就是要记录该Transaction可见的TransactionID,排除不可见的ID。PostGreSQL中每一个版本的数据有两个ID,其中一个是CreationID即插入该数据的TransactionID,一个是ExpiredID,即删除或更新该数据的TransactionID。对一个Transaction可见的数据的ID要满足以下条件:
1.CreationID当前TransactionID
2.ExpiredID当前TransactionID或ExpiredID不存在
Transaction启动形成快照的过程:
遍历当前所有活动的Transaction,记录在一个活动Transaction的ID数组中;根据Transaction的先后顺序,选择当前Transaction可见的最小TransactionID,记录在xmin,选择可见的最大TransactionID,记录在xmax中。
PostGreSQL8.5中进行最终的版本选择是在从外存中获取一个页面的数据之后,由一个检验函数(HeapTupleSatisfiesMVCC等一系列函数)检验所有该页面数据的数据对当前Transaction的可见性,如果不可见,则将数据除去,最后返回所有可见数据。
postgreSQL默认不允许外部连接,需要进行配置才行,postgreSQL版本是8.4.4。进入%postgreSQL_path%8data目录,打开pg_hba.conf文件,找到下面这段:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# IPv4 local connections:
host all all
127.0.0.1/32 md5
# IPv6 local connections:
#host all
all ::1/128 md5
在# IPv4 下一系列的host增加一行:
host
all all 192.168.80.1/24 md5
这行的意思是允许所有 192.168.80.***
这样ip访问本机postgreSQL服务。这里要说明一下,原有的
host all
all 127.0.0.1/32
md5
这一行不要删除,我第一次配置时就因为直接修改这行,然后导致postgreSQL服务无法启动。而postgreSQL启动失败后,有很多postgres的进程无法自动关闭,使用任务管理器是无法手动把它们全部关闭的,因为postgreSQL会自动开启新的进程,经常你关了一个,它又打开了很多个。最后我是借用cports工具的“终止打开选中窗口的进程”功能,才把postgreSQL全部给关闭的。
postgreSQL服务无法启动,也有说解决方法如下:
修改本地链接属性:
本地链接-属性-Internet协议(TCP/IP)-属性-常规
-高级-WINS-启动
LMHOSTS查询
已选上则点去前面的钩(如果没有则勾上)。确定,确定,关闭。
然后你就会发现postgres服务可以启动了。
原因是Dr.com的工作方式修改了Winsock
LSP,致使postgres服务无法正常启动。
postgres服务启动后一直会开在那里,期间可以正常使用Dr.com(弹出对话框不要选择重启),但是启动重启之后PostgreSQL又不能使用了。
遇到这种情况请重复以上步骤,勾上或者去掉“启动
LMHOSTS查询”前的钩,改变状态就行。
然后就又可以了。
我遇到的问题不属于这种情况,经测试无效。
同时修改postgresql.conf文件,
listen_addresses=
'*'
我本机中默认就是如上配置,也就是我在安装的时候就设置了允许所有地址。
配置说明:
# TYPE DATABASE USER
CIDR-ADDRESS
METHOD
说明每一行有五个字段,
分别是:连接类型、可使用的数据库名、使用者、DIDR地址、和验证方法等五项。
下面,我只介绍一些针对每个字段常用的选项。
字段一:TYPE。
可以选择:local或host。
前者只能允许本地的用户登陆Postgres数据库;后者可以接受远程客户登陆。所以,
我们应该使用“host”。
字段二:DATWABSE。
连接用户可以使用的数据库名字。可以使Postgres的一个具体的
数据库名,也可以使用“all”来允许用户访问所有数据库。
字段三:USER。可以指定某个具体的用户来连接Postgres数据库(还要结合后面的地址字段),
也可以使用“all”来允许所有用户连接数据库。
字段四:DIDR-ADDRESS。
是IP地址与掩码的另一种表示方法。
Postgres是通过这个字段来了解,允许那些IP或IP网段连接此服务器。
它的格式是:
IP地址/掩码。
这个掩码和子网掩码是一个道理,只不过是用一个小于等于32的正数来表示,
表示的正是子网掩码中高几位为1,
比如,255.255.255.0
就是“24”,说明高24位是1。
192.168.0.1/32 相当于
IP为192.168.0.1,子网掩码为255.255.255.255的网段,
很显然,这只表明192.168.0.1IP自己。
字段五:METHOD。
这是验证方法。可选的有:
reject:拒绝这个IP的用户访问;
md5:密码以md5作为hash编码;
password:密码作为明文传输(好恐怖!);
krb5:密码以krb5作为hash编码。
下面举一个例子,来说明如何进行设置:
#
TYPE DATABASE USER CIDR-ADDRESS
METHOD
#允许IP为192.168.0.1的所有用户登陆到Postgres服务器的所有数据库,采用md5验证。
host all all
192.168.0.1/32
md5
#允许用户testuser在192.168.0.XX的网段任意机器登陆Postgres服务器,
#只能使用数据库testdb,采用md5验证。
host
testdb testuser 192.168.0.1/24 md5
2.
改监听地址
默认下,POSTGRESQL只接受本地服务,要接受远程服务,需改postgresql.conf 文件listen_address=
*
3. 如果是在Linux上的PostgreSQL
要打开 “unix的tcpip套接子”。
编辑
$POSTGRES/data/postgresql.conf
文件,
将tcpip_socket=off改成tcpip_socket=on即可。
配置说明部分摘自文章:
PostgresSQL提供了许多数据库配置参数,本章将介绍每个参数的作用和如何配置每一个参数。
10.1 如何设置数据库参数
所有的参数的名称都是不区分大小写的。每个参数的取值是布尔型、整型、浮点型和字符串型这四种类型中的一个,分别用boolean
、integer、 floating point和string表示。布尔型的值可以写成ON、OFF、 TRUE、 FALSE、 YES、 NO、 1和 0,而且不区分大小
写。
有些参数用来配置内存大小和时间值。内存大小的单位可以是KB、MB和GB。时间的单位可以是毫秒、秒、分钟、小时和天。用ms表示
毫秒,用s表示秒,用 min表示分钟,用h表示小时,用d表示天。表示内存大小和时间值的参数参数都有一个默认的单位,如果用户
在设置参数的值时没有指定单位,则以参数默认的 单位为准。例如,参数shared_buffers表示数据缓冲区的大小,它的默认单位是
数据块的个数,如果把它的值设成8,因为每个数据块的大小是 8KB,则数据缓冲区的大小是8*8=64KB,如果将它的值设成128MB,
则数据缓冲区的大小是128MB。参数vacuum_cost_delay 的默认单位是毫秒,如果把它的值设成10,则它的值是10毫秒,如果把它的
值设成100s,则它的值是100秒。
所有的参数都放在文件 postgresql.conf中,下面是一个文件实例:
#这是注释
log_connections=yes
log_destination='syslog'
search_path='"$user", public'
每一行只能指定一个参数,空格和空白行都会被忽略。“ #”表示注释,注释信息不用单独占一行,可以出现在配置文件的任何地方
。如果参数的值不是简单的标识符和数字,应该用单引号引起来。如果参数的值中有单引号,应该写两个单引号,或者在单引号前面
加一个反斜杠。
一个配置文件也可以包含其它配置文件,使用include指令能够达到这个目的,例如,假设postgresql.conf文件中有下面一行:
include ‘my.confg’
文件my.config中的配置信息也会被数据库读入。include指令指定的配置文件也可以用include指令再包含其它配置文件。如果
include指令中指定的文件名不是绝对路径,数据库会在postgresql.conf文件所在的目录下查找这个文件。
用户也可以在数据库启动以后修改postgresql.conf配置文件,使用命令pg_ctl reload来通知数据库重新读取配置文件。注意,有些
参数在数据库启动以后,不能被修改,只有重新启动数据库以后,新的参数值才能生效。另外一些参数可 以在数据库运行过程中被
修改而且新的值可以立即生效。所以数据库在运行过程中重新读取参数配置文件以后,不是所有的参数都会被赋给新的值。
用户可以在自己建立的会话中执行命令SET修改某些配置参数的值(注意不是全部参数),例如:
SET ENABLE_SEQSCAN TO OFF;
另外,有些参数只有数据库超级用户才能使用SET命令修改它们。用户可以在psql中执行命令show来查看所有的数据库参数的当前值
。例如:
(1)show all; --查看所有数据库参数的值
(2)show search_path; --查看参数search_path的值
10.2 连接与认证
10.2.1 连接设置
listen_addresses (string)
这个参数只有在启动数据库时,才能被设置。它指定数据库用来监听客户端连接的TCP/IP地址。默认是值是* ,表示数据库在启动以
后将在运行数据的机器上的所有的IP地址上监听用户请求(如果机器只有一个网卡,只有一个IP地址,有多个网卡的机器有多个 IP
地址)。可以写成机器的名字,也可以写成IP地址,不同的值用逗号分开,例如,’server01’, ’140.87.171.49, 140.87.171.21
’。如果被设成localhost,表示数据库只能接受本地的客户端连接请求,不能接受远程的客户端连接请求。
port (integer)
这个参数只有在启动数据库时,才能被设置。它指定数据库监听户端连接的TCP端口。默认值是5432。
max_connections (integer)
这个参数只有在启动数据库时,才能被设置。它决定数据库可以同时建立的最大的客户端连接的数目。默认值是100。
superuser_reserved_connections (integer)
这个参数只有在启动数据库时,才能被设置。它表示预留给超级用户的数据库连接数目。它的值必须小于max_connections。 普通用
户可以在数据库中建立的最大的并发连接的数目是max_connections- superuser_reserved_connections, 默认值是3。
unix_socket_group (string)
这个参数只有在启动数据库时,才能被设置。设置Unix-domain socket所在的操作系统用户组。默认值是空串,用启动数据库的操作
系统用户所在的组作为Unix-domain socket的用户组。
unix_socket_permissions (integer)
这个参数只有在启动数据库时,才能被设置。它设置Unix-domain socket的访问权限,格式与操作系统的文件访问权限是一样的。默
认值是0770,表示任何操作系统用户都能访问Unix-domain socket。可以设为0770(所有Unix-domain socket文件的所有者所在的组
包含的用户都能访问)和0700(只有Unix-domain socket文件的所有者才能访问)。对于Unix-domain socket,只有写权限才有意义,
读和执行权限是没有意义的。
tcp_keepalives_idle (integer)
这个参数可以在任何时候被设置。默认值是0,意思是使用操作系统的默认值。它设置TCP套接字的TCP_KEEPIDLE属性。这个参数对于
通过Unix-domain socket建立的数据库连接没有任何影响。
tcp_keepalives_interval (integer)
这个参数可以在任何时候被设置。默认值是0,意思是使用操作系统的默认值。它设置TCP套接字的TCP_KEEPINTVL属性。这个参数对
于通过Unix-domain socket建立的数据库连接没有任何影响。
tcp_keepalives_count (integer)
这个参数可以在任何时候被设置。默认值是0,意思是使用操作系统的默认值。它设置TCP套接字的TCP_KEEPCNT属性。这个参数对于
通过Unix-domain socket建立的数据库连接没有任何影响。
10.2.2. 安全与认证
authentication_timeout (integer)
这个参数只能在postgresql.conf文件中被设置,它指定一个时间长度,在这个时间长度内,必须完成客户端认证操作,否则客户端
连接请求将被拒绝。它可以阻止某些客户端进行认证时长时间占用数据库连接。单位是秒,默认值是60。
ssl (boolean)
这个参数只有在启动数据库时,才能被设置。决定数据库是否接受SSL连接。默认值是off。
ssl_ciphers (string)
指定可以使用的SSL加密算法。查看操作系统关于openssl的用户手册可以得到完整的加密算法列表(执行命令openssl ciphers –v
也可以得到)。
10.3 资源消耗
10.3.1 内存
shared_buffers (integer)
这个参数只有在启动数据库时,才能被设置。它表示数据缓冲区中的数据块的个数,每个数据块的大小是8KB。数据缓冲区位于数据
库的共享内存中,它越大越好,不能小于128KB。默认值是1024。
temp_buffers (integer)
这个参数可以在任何时候被设置。默认值是8MB。它决定存放临时表的数据缓冲区中的数据块的个数,每个数据块的大小是8KB。临时
表缓冲区存放在每个数据库进程的私有内存中,而不是存放在数据库的共享内存中。默认值是1024。
max_prepared_transactions (integer)
这个参数只有在启动数据库时,才能被设置。它决定能够同时处于prepared状态的事务的最大数目(参考PREPARE TRANSACTION命令
)。如果它的值被设为0。则将数据库将关闭prepared事务的特性。它的值通常应该和max_connections的值 一样大。默认值是5。
work_mem (integer)
这个参数可以在任何时候被设置。它决定数据库的排序操作和哈希表使用的内存缓冲区的大小。如何work_mem指定的内存被耗尽,数
据库将使用磁盘文件进 行完成操作,速度会慢很多。ORDER BY、DISTINCT和merge连接会使用排序操作。哈希表在Hash连接、hash聚
集函数和用哈希表来处理IN谓词中的子查询中被使用。单位是 KB,默认值是1024。
maintenance_work_mem (integer)
这个参数可以在任何时候被设置。它决定数据库的维护操作使用的内存空间的大小。数据库的维护操作包括VACUUM、CREATE INDEX和
ALTER TABLE ADD FOREIGN KEY等操作。 maintenance_work_mem的值如果比较大,通常可以缩短VACUUM数据库和从dump文件中恢复数
据库需要的时间。 maintenance_work_mem存放在每个数据库进程的私有内存中,而不是存放在数据库的共享内存中。单位是KB,默
认值是16384。
max_stack_depth (integer)
这个参数可以在任何时候被设置,但只有数据库超级用户才能修改它。它决定一个数据库进程在运行时的STACK所占的空间的最大值
。数据库进程在运行时,会 自动检查自己的STACK大小是否超过max_stack_depth,如果超过,会自动终止当前事务。这个值应该比
操作系统设置的进程STACK的大小 的上限小1MB。使用操作系统命令“ulimit –s“可以得到操作系统设置的进程STACK的最大值。单
位是KB,默认值是100。
10.3.2 Free Space Map
数据库的所有可用空间信息都存放在一个叫free space map (FSM)的结构中,它记载数据文件中每个数据块的可用空间的大小。FSM
中没有记录的数据块,即使有可用空间,也不会系统使用。系统如果需要新的物理存 储空间,会首先在FSM中查找,如果FSM中没有
一个数据页有足够的可用空间,系统就会自动扩展数据文件。所以,FSM如果太小,会导致系统频繁地扩展数 据文件,浪费物理存储
空间。命令VACUUM VERBOSE在执行结束以后,会提示当前的FSM设置是否满足需要,如果FSM的参数值太小,它会提示增大参数。
FSM存放在数据库的共享内存中,由于物理内存的限制,FSM不可能跟踪数据库的所有的数据文件的所有数据块的可用空间信息,只能
跟踪一部分数据块的可用空间信息。
max_fsm_relations (integer)
这个参数只有在启动数据库时,才能被设置。默认值是1000。它决定FSM跟踪的表和索引的个数的上限。每个表和索引在FSM中占7个
字节的存储空间。
max_fsm_pages (integer)
这个参数只有在启动数据库时,才能被设置。它决定FSM中跟踪的数据块的个数的上限。initdb在创建数据库集群时会根据物理内存
的大小决定它的值。每 个数据块在fsm中占6个字节的存储空间。它的大小不能小于16 * max_fsm_relations。默认值是20000。
10.3.3 内核资源
max_files_per_process (integer)
这个参数只有在启动数据库时,才能被设置。他设定每个数据库进程能够打开的文件的数目。默认值是1000。
shared_preload_libraries (string)
这个参数只有在启动数据库时,才能被设置。它设置数据库在启动时要加载的操作系统共享库文件。如果有多个库文件,名字用逗号
分开。如果数据库在启动时未找到shared_preload_libraries指定的某个库文件,数据库将无法启动。默认值为空串。
10.3.4 垃圾收集
执行VACUUM 和ANALYZE命令时,因为它们会消耗大量的CPU与IO资源,而且执行一次要花很长时间,这样会干扰系统执行应用程序发
出的SQL命令。为了解决这个 问题,VACUUM 和ANALYZE命令执行一段时间后,系统会暂时终止它们的运行,过一段时间后再继续执行
这两个命令。这个特性在默认的情况下是关闭的。将参数 vacuum_cost_delay设为一个非零的正整数就可以打开这个特性。
用户通常只需要设置参数vacuum_cost_delay和vacuum_cost_limit,其它的参数使用默认值即可。VACUUM 和ANALYZE命令在执行过程
中,系统会计算它们执行消耗的资源,资源的数量用一个正整数表示,如果资源的数量超过 vacuum_cost_limit,则执行命令的进程
会进入睡眠状态,睡眠的时间长度是是vacuum_cost_delay。 vacuum_cost_limit的值越大,VACUUM 和ANALYZE命令在执行的过程中
,睡眠的次数就越少,反之,vacuum_cost_limit的值越小,VACUUM 和ANALYZE命令在执行的过程中,睡眠的次数就越多。
vacuum_cost_delay (integer)
这个参数可以在任何时候被设置。默认值是0。它决定执行VACUUM 和ANALYZE命令的进程的睡眠时间。单位是微秒。它的值最好是10
的整数,如果不是10的整数,系统会自动将它设为比该值大的并且最接近该值的是10 的倍数的整数。如果值是0,VACUUM 和ANALYZE
命令在执行过程中不会主动进入睡眠状态,会一直执行下去直到结束。
vacuum_cost_page_hit (integer)
这个参数可以在任何时候被设置。默认值是1。
vacuum_cost_page_miss (integer)
这个参数可以在任何时候被设置。默认值是10。
vacuum_cost_page_dirty (integer)
这个参数可以在任何时候被设置。默认值是20。
vacuum_cost_limit (integer)
这个参数可以在任何时候被设置。默认值是200。
10.3.5 后台写数据库进程
后台写数据库进程负责将数据缓冲区中的被修改的数据块(又叫脏数据块)写回到数据库物理文件中。
bgwriter_delay (integer)
这个参数只能在文件postgresql.conf中设置。它决定后台写数据库进程的睡眠时间。后台写数据库进程每次完成写数据到物理文件
中的任务以后, 就会睡眠bgwriter_delay指定的时间。 bgwriter_delay的值应该是10的倍数,如果用户设定的值不是10的倍数,数
据库会自动将参数的值设为比用户指定的值大的最接近用户指定的值 的同时是10的倍数的值。单位是毫秒,默认值是200。
bgwriter_lru_maxpages (integer)
这个参数只能在文件postgresql.conf中设置。默认值是100。后台写数据库进程每次写脏数据块时,写到外部文件中的脏数据块的个
数不能超过 bgwriter_lru_maxpages指定的值。例如,如果它的值是500,则后台写数据库进程每次写到物理文件的数据页的个数不
能超过500,若 超过,进程将进入睡眠状态,等下次醒来再执行写物理文件的任务。如果它的值被设为0, 后台写数据库进程将不会
写任何物理文件(但还会执行检查点操作)。
bgwriter_lru_multiplier (floating point)
这个参数只能在文件postgresql.conf中设置。默认值是2.0。它决定后台写数据库进程每次写物理文件时,写到外部文件中的脏数据
块的个数 (不能超过bgwriter_lru_maxpages指定的值)。一般使用默认值即可,不需要修改这个参数。这个参数的值越大,后台写
数据库进程每次写 的脏数据块的个数就越多。
10.4 事务日志
full_page_writes (boolean)
这个参数只能在postgresql.conf文件中被设置。默认值是on。打开这个参数,可以提高数据库的可靠性,减少数据丢失的概率,但
是会产生过多的事务日志,降低数据库的性能。
wal_buffers (integer)
这个参数只有在启动数据库时,才能被设置。默认值是8。它指定事务日志缓冲区中包含的数据块的个数,每个数据块的大小是8KB,
所以默认的事务日志缓冲区的大小是8*8=64KB。事务日志缓冲区位于数据库的共享内存中。
wal_writer_delay (integer)
这个参数只能在postgresql.conf文件中被设置。它决定写事务日志进程的睡眠时间。WAL进程每次在完成写事务日志的任务后,就会
睡眠 wal_writer_delay指定的时间,然后醒来,继续将新产生的事务日志从缓冲区写到WAL文件中。单位是毫秒(millisecond),
默认 值是200。
commit_delay (integer)
这个参数可以在任何时候被设置。它设定事务在发出提交命令以后的睡眠时间,只有在睡眠了commit_delay指定的时间以后,事务产
生的事务日志才会 被写到事务日志文件中,事务才能真正地提交。增大这个参数会增加用户的等待时间,但是可以让多个事务被同
时提交,提高系统的性能。如果数据库中的负载比较 高,而且大部分事务都是更新类型的事务,可以考虑增大这个参数的值。下面
的参数commit_siblings会影响commit_delay是否生效。 默认值是0,单位是微秒(microsecond)。
commit_siblings (integer)
这个参数可以在任何时候被设置。这个参数的值决定参数commit_delay是否生效。假设commit_siblings的值是5,如果一个事务发出
一个提交请求,此时,如果数据库中正在执行的事务的个数大于或等于5,那么该事务将睡眠commit_delay指定的时间。如果数据库
中正在执行的事务 的个数小于5,这个事务将直接提交。默认值是5。
10.5 检查点
checkpoint_segments (integer)
这个参数只能在postgresql.conf文件中被设置。默认值是3。它影响系统何时启动一个检查点操作。如果上次检查点操作结束以后,
系统产生的事 务日志文件的个数超过checkpoint_segments的值,系统就会自动启动一个检查点操作。增大这个参数会增加数据库崩
溃以后恢复操作需要的时 间。
checkpoint_timeout (integer)
这个参数只能在postgresql.conf文件中被设置。单位是秒,默认值是300。它影响系统何时启动一个检查点操作。如果现在的时间减
去上次检查 点操作结束的时间超过了checkpoint_timeout的值,系统就会自动启动一个检查点操作。增大这个参数会增加数据库崩
溃以后恢复操作需要的时 间。
checkpoint_completion_target (floating point)
这个参数控制检查点操作的执行时间。合法的取值在0到1之间,默认值是0.5。不要轻易地改变这个参数的值,使用默认值即可。 这
个参数只能在postgresql.conf文件中被设置。
10.6 归档模式
archive_mode (boolean)
这个参数只有在启动数据库时,才能被设置。默认值是off。它决定数据库是否打开归档模式。
archive_dir (string)
这个参数只有在启动数据库时,才能被设置。默认值是空串。它设定存放归档事务日志文件的目录。
archive_timeout (integer)
这个参数只能在postgresql.conf文件中被设置。默认值是0。单位是秒。如果archive_timeout的值不是0,而且当前时间减去数 据
库上次进行事务日志文件切换的时间大于archive_timeout的值,数据库将进行一次事务日志文件切换。一般情况下,数据库只有在
一个事务日志 文件写满以后,才会切换到下一个事务日志文件,设定这个参数可以让数据库在一个事务日志文件尚未写满的情况下
切换到下一个事务日志文件。
10.7 优化器参数
10.7.1 存取方法参数
下列参数控制查询优化器是否使用特定的存取方法。除非对优化器特别了解,一般情况下,使用它们默认值即可。
enable_bitmapscan (boolean)
打开或者关闭bitmap-scan 。默认值是 on。
enable_hashagg (boolean)
打开或者关闭hashed aggregation。默认值是 on。
enable_hashjoin (boolean)
打开或者关闭hash-join。默认值是 on。
enable_indexscan (boolean)
打开或者关闭index-scan。默认值是 on。
enable_mergejoin (boolean)
打开或者关闭merge-join。默认值是 on。
enable_nestloop (boolean)
打开或者关闭nested-loop join。默认值是 on。不可能完全不使用nested-loop join,关闭这个参数会让系统在有其它存取方法可
用的情况下,不使用nested-loop join。
enable_seqscan (boolean)
打开或者关闭sequential scan。默认值是 on。不可能完全不使用sequential scan,关闭这个参数会让系统在有其它存取方法可用
的情况下,不使用sequential scan。
postgresql支持数组类型,可以是基本类型,也可以是用户自定义的类型。日常中使用数组类型的机会不多,但还是可以了解一下。不像C或JAVA高级语言的数组下标从0开始,postgresql数组下标从1开始,既可以指定长度,也可以不指定长度。且postgresql既支持一维数组,也支持多维数组,但是平时二维数组也就够用了。
示例1.使用ARRAY构建数组类型
---1*4的一维数组test=#selectarray[1,2,3,4];
? array? -----------{1,2,3,4}
(1 row)--2*2的二维数组test=#selectarray[[1,2],[3,4]];
? ? array? ? ---------------{{1,2},{3,4}}
(1 row)--1*2的二维数组,基本类型为box矩形类型,且和上面相比box类型元素之间是以分号分隔的,其他所有类型的数据都是以逗号分隔的test=#selectarray[box'(1,1),(0,0)',box'(0,0),(-1,-1)'];
? ? ? ? ? ? array? ? ? ? ? ? -----------------------------{(1,1),(0,0);(0,0),(-1,-1)}
(1row)
示例2.创建一张表,字段包含数组类型
其中int[]表示数组长度无限制,int[4]表示数组长度为4.
test=#createtabletbl_array(aint[],bvarchar(32)[][],cint);CREATETABLEtest=#insertintotbl_array (a,b,c)values(array[1,2],array[[1,2,3],[4,5,6]],1);INSERT01test=#insertintotbl_array (a,b,c)values(array[1,2,3],array[[1,2],[4,5]],2);INSERT01test=#select*from tbl_array ;
? ? a? ? |b| c ---------+-------------------+---{1,2}|{{1,2,3},{4,5,6}}|1 {1,2,3}|{{1,2},{4,5}}|2(2 rows)
test=#selecta[1],b[2]fromtbl_arraywherec=1;
a | b ---+---1|
(1 row)
test=#selecta[1],b[2][1]fromtbl_arraywherec=1;
a | b ---+---1|4(1 row)
test=#selecta[1],b[2][4]fromtbl_arraywherec=1;
a | b ---+---1|
(1row)
test=#updatetbl_arrayseta[1]=200wherea[1]=1;UPDATE1test=#selecta[1],b[2][4]from tbl_array ;
? a? | b -----+---100|200|
(2rows)
也可以使用[下标:上标]方式来查询数组连续的某些元素。
test=#selecta[2:3]from tbl_array ;
? a? -------{2}
{2,3}
(2 rows)
test=#selecta[1:3]from tbl_array ;
? ? a? ? -----------{100,2}
{200,2,3}
(2rows)
数组操作符与函数
操作符
操作符描述示例结果
=相等?SELECT ARRAY[1.1,2.1,3.1]::int[]=ARRAY[1,2,3];?t
不等于?select ARRAY[1,2,3] ARRAY[1,2,4];?t
小于?select ARRAY[1,2,3] ARRAY[1,2,4];?t
大于?select ARRAY[1,4,3] ARRAY[1,2,4];?t
=小于或等于?select ARRAY[1,2,3]=ARRAY[1,2,3];?t
=大于或等于?select ARRAY[1,4,3]=ARRAY[1,4,3];?t
@包含?select ARRAY[1,4,3] @ ARRAY[3,1];?t
@包含于?select ARRAY[2,7] @ ARRAY[1,7,4,2,6];?t
重叠(是否有相同元素)?select ARRAY[1,4,3] ARRAY[2,1];?t
||数组与数组连接?select ARRAY[1,2,3] || ARRAY[4,5,6];?{1,2,3,4,5,6}
||数组与数组连接?select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]];?{{1,2,3},{4,5,6},{7,8,9}}
||元素与数组连接?select 3 || ARRAY[4,5,6];?{3,4,5,6}
||数组与元素连接?select ARRAY[4,5,6] || 7;?{4,5,6,7}
函数
函数返回类型描述示例结果
array_append(anyarray,anyelement)anyarray?在数组末尾追加元素?
SELECT array_append(ARRAY[1,2], 3);
?{1,2,3}
array_cat(anyarray,anyarray)anyarray?连接两个数组?SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]);?{1,2,3,4,5}
array_ndims(anyarray)int?返回数组维数?SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]);?2
array_dims(anyarray)text?返回数组维数的文本表示?SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]);?[1:2][1:3]
array_fill(anyelement,int[], [,int[]])anyarray使用提供的值和维度初始化一个数组,其中anyelement是值,第一个int[]是数组的长度,第二个int[]是数组下界,下界默认是1?SELECT array_fill(7, ARRAY[3], ARRAY[2]);?[2:4]={7,7,7}
array_length(anyarray,int)int?返回数组指定维度的长度?SELECT array_length(array[1,2,3], 1);?3
array_lower(anyarray,int)int?返回数组指定维度的下界?SELECT array_lower('[0:2]={1,2,3}'::int[], 1);?0
array_position(anyarray,anyelement[,int])int?返回数组元素anyelement从数组的[,int]位置(默认为1)开始第一次出现在数组中的位置,数组必须是一维的?SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon');?2
array_positions(anyarray,anyelement)int[]?返回元素在数组中的所有位置?SELECT array_positions(ARRAY['A','A','B','A'], 'A');?{1,2,4}
array_prepend(anyelement,anyarray)anyarray?在数组开头添加新的元素?SELECT array_prepend(1, ARRAY[2,3]);?{1,2,3}
array_remove(anyarray,anyelement)anyarray?从数组中删除所有的指定元素,必须是一维数组?SELECT array_remove(ARRAY[1,2,3,2], 2);?{1,3}
array_replace(anyarray,anyelement,anyelement)anyarray?替换指定数组元素为新的元素?SELECT array_replace(ARRAY[1,2,5,4], 5, 3);?{1,2,3,4}
array_to_string(anyarray,text[,text])text?将数组元素使用分隔符连接为文本,NULL可以使用指定元素替换?SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*');?1,2,3,*,5
array_upper(anyarray,int)int?数组指定维度的上届?SELECT array_upper(ARRAY[1,8,3,7], 1);?4
cardinality(anyarray)int?返回数组所有维度的长度总和,如果是空数组则返回0?SELECT cardinality(ARRAY[[1,2],[3,4]]);?4
string_to_array(text,text[,text])text[]?将文本使用分隔符分隔后转换为数组,如果指定第三个参数,则第三个参数在数组中被转换为NULL?SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy');?{xx,NULL,zz}
unnest(anyarray)setof anyelement?将数组元素转换为行?SELECT unnest(ARRAY[1,2]);?
1
2
unnest(anyarray,anyarray[, ...])setof anyelement, anyelement [, ...]?将多维数组转换为行集合,其中第一个数组显示为第一列,第二个数组显示为第二列,以此类推。但是这个函数只在from子句中使用?SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']);?
unnest | unnest
--------+----
1 | foo
2 | bar
? | baz