SET
名称
SET — 为会话设置运行时参数
SET variable { TO | = } { 'value' | DEFAULT }
SET TIME ZONE { 'timezone' | LOCAL | DEFAULT }
SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }
输入
- variable
- 可设置的全局变量.
- value
- 参数的新值.
可能的变量和许可的值是.
- 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
- 恢复缺省值 ('US,Postgres')
日期格式初始化可以用下面方法初始化:
| 设置 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 |
- SERVER_ENCODING
- 设置多字节服务器端编码方式
- value
- 设置多字节服务器编码方式。
这个特性只有在对制作 Postgres
的配置阶段声明了 MULTIBYTE 支持后才生效。
- 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
命令声明的用内部的或优化的参数:
- RANDOM_PAGE_COST
- 设置优化器对非连续磁盘页面读取的开销的预计值。这是以连续页面读取的开销的倍数计算的。
- float8
- 设置随机页面访问的开销为声明的浮点值。
- CPU_TUPLE_COST
- 设置优化器处理查询里每条记录的开销的预计值。这是以连续页面读取的开销的分数进行计算的。
- float8
- 把每条记录的 CPU
处理的开销设置声明的浮点值。
- CPU_INDEX_TUPLE_COST
- 设置优化器进行索引扫描时处理每条索引记录的开销的预计值。这是以连续页面读取的开销的分数进行计算的。
- float8
- 把每条索引记录的 CPU
处理的开销设置声明的浮点值。
- CPU_OPERATOR_COST
- 设置优化器处理 WHERE
子句里每个操作符的开销的预计值。这是以连续页面读取的开销的分数进行计算的。
- float8
- 把每个操作符的 CPU
处理的开销设置声明的浮点值。
- EFFECTIVE_CACHE_SIZE
- 设置优化器对磁盘缓冲有效尺寸的假设(也就是说,将被
Postgres
数据文件使用的内核的磁盘缓冲的部分)。这是以磁盘页面计量的,通常每块
8Kb。
- float8
- 把假设的缓冲尺寸设置为声明的浮点值。
- ENABLE_SEQSCAN
- 允许或者禁止规划器对顺序扫描规划类型的使用。(完全禁止顺序扫描是不可能的,但是把这个变量置为
OFF 将导致规划器在存在其他可用方法的情况下不采用顺序扫描。)
- ON
- 允许使用顺序扫描(缺省设置)。
- OFF
- 禁止使用顺序扫描。
- ENABLE_INDEXSCAN
- 允许或者禁止规划器对索引扫描规划类型的使用。
- ON
- 允许使用索引扫描(缺省设置)。
- OFF
- 禁止使用索引扫描。
- ENABLE_TIDSCAN
- 允许或者禁止规划器对 TID
扫描规划类型的使用。
- ON
- 允许使用 TID 扫描(缺省设置)。
- OFF
- 禁止使用 TID 扫描。
- ENABLE_SORT
- 允许或者禁止规划器对显式排序步骤的使用。(完全禁止显式排序步骤是不可能的,但是把这个变量置为
OFF 将导致规划器在存在其他可用方法的情况下不采用显式排序步骤。)
- ON
- 允许使用排序(缺省设置)。
- OFF
- 禁止使用排序。
- ENABLE_NESTLOOP
- 允许或者禁止规划器对嵌套循环的使用。(完全禁止嵌套循环是不可能的,但是把这个变量置为
OFF 将导致规划器在存在其他可用方法的情况下不采用嵌套循环。)
- ON
- 允许使用嵌套循环联合(缺省设置)。
- 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 和以后的版本里,标准的规划器可以很好的操作这些查询。
输出
- 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 }