SET
SET — 为会话设置运行时参数
语法
SET variable { TO | = } { value | 'value' | DEFAULT }
SET CONSTRAINTS {ALL | constraintlist} mode
SET TIME ZONE { 'timezone' | LOCAL | DEFAULT }
SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }
输入
-
variable
-
可设置的全局变量.
-
value
-
参数的新值.DEFAULT 可以用于声明把参数恢复为缺省值.允许使用字串数组,但是更复杂的结构需要用单引号或者双引号引起来.
可能的变量和许可的值是.
-
CLIENT_ENCODING | NAMES
-
设置多字节客户端编码。参数是:
-
value
-
把客户端多字节编码设为 value。声明的编码方式必须为后端支持。
-
这个特性只有在对制作 Postgres 的配置阶段声明了 MULTIBYTE 支持后才生效。
-
DATESTYLE
-
设置日期/时间表示风格。影响输出格式,并且在某些时候会影响输入的解释。
-
ISO
-
使用 ISO 8601-风格的日期和时间
-
SQL
-
使用 Oracle/Ingres-风格的日期和时间
-
Postgres
-
使用传统 Postgres 格式
-
European
-
使用 dd/mm/yyyy 作为数字日期表达式.
-
NonEuropean
-
使用 mm/dd/yyyy 作为数字日期表达式.
-
German
-
使用 dd.mm.yyyy 作为数字日期表达式.
-
US
-
与 'NonEuropean'一样
-
DEFAULT
-
恢复缺省值 (ISO)
日期格式初始化可以用下面方法初始化:
| 设置 PGDATESTYLE 环境变量.如果一个基于 libpq 的客户端的环境里设置了
PGDATESTYLE,libpq 将在联接启动时自动把 DATESTYLE 设置成为 PGDATESTYLE
的值。 |
| 用 -o -e 参数运行 postmaster 可以把日期设置成
European
习惯.要注意的是这个只是对一些日期风格的组合有影响;例如 ISO 风格不被这个参数影响. |
| 改变 src/backend/utils/init/globals.c里的变量. |
在 globals.c 里可以更改的变量是:
| bool EuroDates = false | true |
| int DateStyle = USE_ISO_DATES | USE_POSTGRES_DATES | USE_SQL_DATES
| USE_GERMAN_DATES |
-
SEED
为随机数生成器设置内部种子.
-
value
种子的值被随机范围函数使用.典型的值是介于0 和 1之间的浮点数,这个数随后乘以
RAND_MAX.如果使用了超出范围的数值,生成的积隐含地溢出.
种子还可以通过调用 setseed SQL 函数设置:
SELECT setseed(value);
这个特性只有在对制作 Postgres 的配置阶段声明了 MULTIBYTE 支持后才生效。
-
SERVER_ENCODING
-
设置多字节服务器端编码方式为:
-
value
-
这个值标识服务器编码.
这个特性只有在对制作 Postgres 的配置阶段声明了 MULTIBYTE 支持后才生效。
-
CONSTRAINTS
SET CONSTRAINTS 影响当前事务约束计算的表现.SET CONSTRAINTS,在 SQL3
里面规范,有如下允许的参数:
-
constraintlist
-
逗号分隔的可推迟的约束名列表.
-
mode
约束模式.允许值是 DEFERRED 和 IMMEDIATE.
在 IMMEDIATE 模式,外键约束在每个查询结束时检查.
在 DEFERRED 模式,标记为 DEFERRABLE 的外键约束只是在事务提交时或者约束的模式被显式地设为
IMMEDIATE
时才检查.实际上,这些只对外键约束起作用,因此它不应用于
UNIQUE 或者其他约束.
-
TIME ZONE, TIMEZONE
-
时区的可能值与你的操作系统有关.例如 Linux 的/usr/lib/zoneinfo 里面包含时区的数据库.
下面是时区的一些有效值.
-
PST8PDT
-
将时区设为 California (加州)
-
Portugal
-
将时区设为 Portugal (葡萄牙).
-
'Europe/Rome'
-
将时区设为 Italy (意大利).
-
DEFAULT
-
将时区设为你的本地时区(TZ 环境变量的值).
如果声明了一个无效时区,时区就会变成 GMT(在大多数系统上).
第二种语法在上面显示,它允许用户用一个类似于 SQL92 SET TIME ZONE
的语法设置时区.LOCAL 关键字只是用于 SQL92 兼容的 DEFAULT 可选的关键字.
如果一个基于 libpq 的客户端的环境里设置了 PGTZ,libpq 将在联接启动时自动把
TIMEZONE 设置成为 PGTZ 的值。
-
TRANSACTION ISOLATION LEVEL
-
给当前事务设置隔离级别。
-
READ COMMITTED
-
当前事务查询将只读取在查询之前提交的数据。READ COMMITTED 是缺省值。
注意:SQL92
标准要求 SERIALIZABLE 为缺省的隔离级别。
-
SERIALIZABLE
-
当前的事务查询只能读取在该事务里第一个 DML 语句(SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO)执行前的数据。
还有几个可以 SET 命令声明的用内部的或优化的参数:
-
PG_OPTIONS
设置各种后端参数.
-
RANDOM_PAGE_COST
-
设置优化器对非连续磁盘页面读取的开销的预计值。这是以连续页面读取的开销的倍数计算的。
-
设置随机页面访问的开销为声明的浮点值。
-
CPU_TUPLE_COST
-
设置优化器处理查询里每条记录的开销的预计值。这是以连续页面读取的开销的分数进行计算的。
-
把每条记录的 CPU 处理的开销设置声明的浮点值。
-
CPU_INDEX_TUPLE_COST
设置优化器进行索引扫描时处理每条索引记录的开销的预计值。这是以连续页面读取的开销的分数进行计算的。
-
把每条索引记录的 CPU 处理的开销设置声明的浮点值。
-
CPU_OPERATOR_COST
设置优化器处理 WHERE 子句里每个操作符的开销的预计值。这是以连续页面读取的开销的分数进行计算的。
-
把每个操作符的 CPU 处理的开销设置声明的浮点值。
-
EFFECTIVE_CACHE_SIZE
设置优化器对磁盘缓冲有效尺寸的假设(也就是说,将被 Postgres 数据文件使用的内核的磁盘缓冲的部分)。这是以磁盘页面计量的,通常每块
8Kb。
-
把每个操作符的 CPU 处理的开销设置声明的浮点值。
-
ENABLE_SEQSCAN
-
允许或者禁止规划器对顺序扫描规划类型的使用。(完全禁止顺序扫描是不可能的,但是把这个变量置为
OFF 将导致规划器在存在其他可用方法的情况下不采用顺序扫描。)
-
禁止使用顺序扫描。
-
ENABLE_INDEXSCAN
-
允许或者禁止规划器对索引扫描规划类型的使用。
-
ON
-
允许使用索引扫描(缺省设置)。
-
OFF
-
禁止使用索引扫描。
-
ENABLE_TIDSCAN
-
允许或者禁止规划器对 TID 扫描规划类型的使用。
-
ON
-
允许使用 TID 扫描(缺省设置)。
-
OFF
-
禁止使用 TID 扫描。
-
ENABLE_SORT
-
允许或者禁止规划器对显式排序步骤的使用。(完全禁止显式排序步骤是不可能的,但是把这个变量置为
OFF 将导致规划器在存在其他可用方法的情况下不采用显式排序步骤。)
-
禁止使用排序。
-
ENABLE_NESTLOOP
-
允许或者禁止规划器对嵌套循环联合规划的使用。(完全禁止嵌套循环联合是不可能的,但是把这个变量置为
OFF 将导致规划器在存在其他可用方法的情况下不采用嵌套循环规划。)
-
禁止使用嵌套循环联合。
-
ENABLE_MERGEJOIN
-
打开或者关闭规划器对融合(merge join)联合规划的使用。
-
ON
-
允许使用融合(merge join)联合(缺省设置)。
-
OFF
-
禁止使用融合(merge join)联合。
-
ENABLE_HASHJOIN
-
打开或者关闭规划器对哈希(散列)规划的使用。
-
ON
-
允许使用哈希(散列)联合(缺省设置)。
-
OFF
-
禁止使用哈希(散列)联合。
-
GEQO
-
为使用基因优化器算法设置阈值.
-
ON
-
允许基因优化器算法优化带有11个或11个以上表的语句.(这也是缺省设置)
-
ON=#
-
带一个整数参数,允许优化器优化带有 # 或更多的表的查询.
-
OFF
-
禁用基因优化器.
请参考程序员手册中关于 GEQO 的章节获取关于查询优化的更多信息。
如果一个基于 libpq 的客户端的环境里设置了 PGGEQO 环境变量,libpq 将在联接启动时自动把
GEQO 设置成为 PGGEQO 的值。
-
KSQO
-
Key Set Query Optimizer (键集查询优化)导致查询规划器把 WHERE 子句带有许多
OR 了的 AND 子句的查询(象 "WHERE (a=1 AND b=2) OR (a=2 AND b=3) ...")转换成一个UNION
查询。这个方法可以比缺省的实现更快,但是它不一定得出相同的结果,因为 UNION
隐含的加了一条 SELECT DISTINCT 子句以消除相同的行。KSQO 常用于和 MicroSoft
Access 这样的东西并用,它容易生成这种类型的查询。
-
ON
-
打开优化。
-
OFF
-
关闭优化(缺省设置)。
-
DEFAULT
-
等效于声明 SET KSQO='OFF'。
KSQO 算法对带有许多 OR 了的 AND 子句的查询是非常必要的,不过在 Postgres
7.0 和以后的版本里,标准的规划器可以很好的操作这些查询。
-
MAX_EXPR_DEPTH
设置分析器可接受的最大表达式嵌套深度.缺省值对任何常见查询都足够高了,但是你可以根据需要提高它.(不过如果你升得太高,你就会冒因为堆栈溢出而导致后端崩溃的危险.)
输出
-
SET VARIABLE
-
成功的返回信息.
-
WARN: Bad value for variable (value)
如果命令设置变量失败.返回此信息.
描述
SET 将在一个会话过程中为变量修改配置参数.
当前值可以使用 SHOW 获得,而且可以使用 RESET 命令将各个值设回缺省.参数和值都是大小写无关的.注意参数值总是用字符串来表达,所以用单引号括起来.
SET TIME ZONE 改变会话的缺省时区偏移量.一个 SQL-会话总是以缺省的时区偏移作为初始值.
SET
TIME ZONE 语句用于改变当前的 SQL 会话的缺省时区偏移量.
注意
SET variable 语句是
Postgres
语言的扩展.
请参考
SHOW 和
RESET 命令显示或重置当前值.
用法
设置时区风格为 ISO(参数不需要引号):
SET DATESTYLE TO ISO;
对4个或更多表的查询,使 GEQO 生效(请注意这里用单引号操作参数值里面的等号):
SET GEQO = 'ON=4';
设置 GEQO 为缺省值:
SET GEQO = DEFAULT;
把时区设置为 Berkeley, California,使用双引好保存时区声明里大写字符的属性:
SET TIME ZONE "PST8PDT";
SELECT CURRENT_TIMESTAMP AS today;
today
------------------------
1998-03-31 07:41:21-08
设置时区为 Italy(注意这里要求的单或者双引号来操作特殊的字符):
SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;
today
------------------------
1998-03-31 17:41:31+02
兼容性
SQL92
在
SQL92 里没有
SET variable
语句(除了 SET TRANSACTION ISOLATION LEVEL)。
SQL92
用于
SET TIME ZONE 的语法有一点点不同,只允许为时区声明一个整数值:
SET TIME ZONE { interval_value_expression | LOCAL }
�