SET
SET — 设置会话的运行时参数
大纲
SETvariable{ TO | = } {value| 'value' | DEFAULT } SET CONSTRAINTS {ALL |constraintlist}modeSET TIME ZONE { 'timezone' | LOCAL | DEFAULT } SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }
输入
variable可设置的全局参数。
value参数的新值。
DEFAULT可用于指定把参数重置为默认值。允许使用字符串列表,但更复杂的构造可能需要加单引号或双引号。
可能的变量和允许的值有:
- CLIENT_ENCODING | NAMES
设置多字节客户端编码。参数有:
value把多字节客户端编码设为
value。指定的编码必须为后端所支持。
只有在构建 Postgres 的 configure 步骤中启用了 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供
random目录函数使用的种子的值。有效的值是 0 到 1 之间的浮点数,它们随后会与 RAND_MAX 相乘。如果使用范围之外的数,该乘积会静默溢出。种子也可以通过调用
setseedSQL 函数来设置:SELECT setseed(
value);
只有在构建 Postgres 的 configure 步骤中启用了 MULTIBYTE 支持,这个选项才可用。
- SERVER_ENCODING
把多字节服务器编码设置为:
value服务器编码的标识值。
只有在构建 Postgres 的 configure 步骤中启用了 MULTIBYTE 支持,这个选项才可用。
- CONSTRAINTS
SET CONSTRAINTS 影响当前事务中约束求值的行为。SET CONSTRAINTS 在 SQL3 中规定,它允许下列参数:
constraintlist以逗号分隔的可延迟约束名称列表。
mode约束模式。允许的值是
DEFERRED和IMMEDIATE。
在
IMMEDIATE模式下,外键约束在每条查询结束时检查。在
DEFERRED模式下,标记为DEFERRABLE的外键约束只在事务提交时检查,或者直到其模式被显式设为IMMEDIATE。实际上这只对外键约束实施,因此不适用于 UNIQUE 或其他约束。- TIME ZONE
TIME ZONE timezone 的可用值取决于你的操作系统。例如在 Linux 上,/usr/lib/zoneinfo 包含时区数据库。
下面是一些有效的 timezone 值:
- PST8PDT
把时区设为加利福尼亚州
- Portugal
把时区设为葡萄牙。
- 'Europe/Rome'
把时区设为意大利。
- 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
设置优化器对非顺序获取磁盘页代价的估计。它以顺序获取一页代价的倍数来度量。
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
启用或禁用规划器对合并连接计划的使用。
- ON
启用合并连接的使用(默认设置)。
- OFF
禁用合并连接。
- ENABLE_HASHJOIN
启用或禁用规划器对哈希连接计划的使用。
- ON
启用哈希连接的使用(默认设置)。
- OFF
禁用哈希连接。
- GEQO
设置使用遗传优化器算法的阈值。
- ON
对涉及 11 个或更多表的语句启用遗传优化器算法。(这也是 DEFAULT 设置。)
- ON=
# 接受一个整数参数,对查询中涉及
#个或更多表的语句启用遗传优化器算法。- OFF
禁用遗传优化器算法。
关于查询优化的更多信息,见程序员指南中的 GEQO 一章。
如果在基于 libpq 的客户端前端环境中设置了 PGGEQO 环境变量,libpq 会在连接启动时自动把 GEQO 设为 PGGEQO 的值。
- KSQO
键集查询优化器使查询规划器把 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
设置解析器可以接受的最大表达式嵌套深度。默认值对任何正常查询都足够高,但需要时可以调高。(但如果调得太高,就有因栈溢出而导致后端崩溃的风险。)
integer最大深度。
输出
SET VARIABLE成功时返回的消息。
NOTICE: Bad value forvariable(value)如果命令未能设置指定的变量。
描述
SET 会在会话期间修改变量的配置参数。
当前值可以用 SHOW 获得,值可以用 RESET 恢复为默认值。参数和值不区分大小写。注意值字段总是以字符串形式指定,因此用单引号括起。
SET TIME ZONE 更改会话的默认时区偏移。SQL 会话总是以一个初始的默认时区偏移开始。SET TIME ZONE 语句用于更改当前 SQL 会话的默认时区偏移。
注解
SET
语句是一种 Postgres 语言扩展。
variable
请参阅 SHOW 和 RESET 来显示或重置当前值。
用法
把日期样式设置为 ISO(参数不需要加引号):
SET DATESTYLE TO ISO;
为有 4 个或更多表的查询启用 GEQO(注意用单引号处理值参数中的等号):
SET GEQO = 'ON=4';
把 GEQO 设为默认值:
SET GEQO = DEFAULT;
把时区设为加州伯克利,使用双引号保留时区说明符的大写属性:
SET TIME ZONE "PST8PDT";
SELECT CURRENT_TIMESTAMP AS today;
today
------------------------
1998-03-31 07:41:21-08把时区设为意大利(注意需要用单引号或双引号处理特殊字符):
SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;
today
------------------------
1998-03-31 17:41:31+02
兼容性
SQL92
SQL92 中没有通用的
SET (除了
variableSET TRANSACTION ISOLATION LEVEL 之外)。SQL92 中 SET TIME ZONE 的语法略有不同,只允许用单个整数值指定时区:
SET TIME ZONE { interval_value_expression | LOCAL }