#
第七十三章 SQL命令 SET OPTION
设置执行选项。
# 大纲
```java
SET OPTION option_keyword = value
```
# 描述
`SET OPTION`语句用于设置执行选项,如编译模式、`SQL`配置设置和控制日期、时间和数字约定的区域设置。
每个`set option`语句只能设置一个关键字选项。
`SET OPTION`支持以下选项:
- `AUTO_PARALLEL_THRESHOLD
- `COMPILEMODE`
- `DEFAULT_SCHEMA``
- `EXACT_DISTINCT`
- `LOCK_ESCALATION_THRESHOLD`
- `LOCK_TIMEOUT`
- `PKEY_IS_IDKEY`
- `SUPPORT_DELIMITED_IDENTIFIERS`
- `Locale Options (date, time, and numeric conventions)`
`SET OPTION`可以在动态SQL(包括`SQL Shell`)和嵌入式SQL中使用。
为了`SQL`兼容性,IRIS会解析其他`SET OPTION`参数(这里没有文档),但不执行任何操作。
因为`SET OPTION`的准备和执行速度很快,而且通常只运行一次,所以`IRIS`不会在`ODBC`、`JDBC`或动态SQL中为`SET OPTION`创建缓存查询。
IRIS支持下列选项:
## `AUTO_PARALLEL_THRESHOLD`
`AUTO_PARALLEL_THRESHOLD`选项被设置为一个整数`n`,用于确定当启用自动并行处理时是否应该对查询应用并行处理。
由于与并行处理相关的性能成本,因此需要为并行处理的优势确定一个阈值。
`n`越高,SQL查询使用并行处理执行的可能性就越低。
默认为`3200`。
这是一个系统范围的设置。
值n大致对应于所访问的映射中发生并行处理所需的最小元组数量。
当自动并行被禁用时,`AUTO_PARALLEL_THRESHOLD`选项没有作用。
也可以使用`$SYSTEM.SQL.Util.SetOption()`方法`AutoParallelThreshold`选项设置该选项。
## COMPILEMODE
`COMPILEMODE`选项将当前名称空间的编译模式设置为`DEFERRED`、`IMMEDIATE`、`INSTALL`或`NOCHECK`。
默认为`IMMEDIATE`。
从`DEFERRED`编译模式更改为`IMMEDIATE`编译模式会导致`DEFERRED compile Queue`中的任何类立即被编译。
如果所有类编译都成功,IRIS将`SQLCODE`设置为0。
如果有任何错误,`SQLCODE`设置为`-400`。
类编译错误记录在`^mtemp2 ("Deferred Compile Mode","Error")`中。
如果将`SQLCODE`设置为`-400`,则应该查看此全局结构以获得更精确的错误消息。
`INSTALL`编译模式类似于`DEFERRED`编译模式,但它应该只用于表中没有数据的`DDL`安装。
`NOCHECK`编译模式与`IMMEDIATE`编译模式类似,只是在编译时忽略了以下约束:如果一个表被删除, IRIS不检查引用被删除表的其他表中的外键约束。
如果添加了外键约束, IRIS不会检查现有数据以确保它对这个外键有效。
如果添加了`NOT NULL`约束, IRIS不会检查现有数据是否为`NULL`,也不会指定字段的默认值。
如果删除了`UNIQUE`或`Primary Key`约束 IRIS不会检查该表或其他表中的外键是否引用了被删除的键。
也可以使用`$SYSTEM.SQL.Util.SetOption()`方法`CompileMode`选项设置该选项。
## DEFAULT_SCHEMA
`DEFAULT_SCHEMA`选项为所有名称空间设置系统范围的默认模式。
在显式更改之前,此默认值将保持有效。
默认模式名用于为所有未限定的表、视图或存储过程名提供模式名。
可以指定一个文字模式名或指定`_CURRENT_USER`。
如果指定`_CURRENT_USER`作为默认模式名, IRIS会将当前登录进程的用户名作为默认模式名。
## EXACT_DISTINCT
`EXACT_DISTINCT`布尔值选项指定是否在系统范围内使用`DISTINCT`处理`(TRUE)`或`Fast DISTINCT`处理`(FALSE)`。
系统范围的默认值是使用`Fast Distinct`处理。
当`EXACT_DISTINCT=TRUE`时,`GROUP BY`和`DISTINCT`查询生成原始值。
当`EXACT_DISTINCT=FALSE`时,启用快速`Distinct`,通过更好地使用索引(如果有索引),使涉及`Distinct`或`GROUP BY`子句的SQL查询更有效地运行。
但是,这些查询返回的值以与存储在索引中的相同的方式进行排序。
这意味着此类查询的结果可能都是大写的。
这可能对区分大小写的应用程序有影响。
这个选项也可以使用`$SYSTEM.SQL.Util.SetOption()`方法`FastDistinct boolean`选项来设置。
## `LOCK_ESCALATION_THRESHOLD`
`LOCK_ESCALATION_THRESHOLD`选项被设置为一个整数`n`,用于确定何时将行锁定升级为表锁定。
默认值是`1000`。
值`n`是单个事务中单个表的插入、更新或删除次数,当到达时将触发表级锁。
这是针对所有名称空间的系统范围设置。
例如,如果锁阈值为`1000`,并且进程启动一个事务,然后插入`2000`行,那么在插入第`1001`行之后,进程将尝试获取表级锁,而不是继续锁定各个行。
这有助于防止锁表变得太满。
这个选项也可以使用`$SYSTEM.SQL.Util.SetOption()`方法`LockThreshold`选项来设置。
## LOCK_TIMEOUT
`LOCK_TIMEOUT`数值选项允许为当前进程设置默认的锁定超时。
`LOCK_TIMEOUT`值是SQL执行期间试图建立锁时等待的秒数。
当锁定冲突阻止当前进程对`lock`、`INSERT`、`UPDATE`、`DELETE`或`SELECT`操作立即锁定一条记录、表或其他实体时,使用此锁定超时。
`SQL`继续尝试建立锁,直到超时超时,这时将生成`SQLCODE -110`或`-114`错误。
可用的值是正整数和零。
超时设置是每个进程的。
可以使用`$SYSTEM.SQL.Util.GetOption(“ProcessLockTimeout”)`方法确定当前进程的锁定超时设置。
如果没有为当前进程设置锁定超时,则默认为当前系统范围的锁定超时设置。
如果您的`ODBC`连接断开并重新连接,重新连接的进程将使用当前系统范围的锁定超时设置。
系统范围的锁定超时默认为10秒。
## PKEY_IS_IDKEY
`PKEY_IS_IDKEY boolean`选项指定主键是否也是系统范围内的ID键。
取值为`TRUE`、`FALSE`。
如果为`TRUE`,且该字段不包含数据,则将主键创建为`ID`键。
也就是说,表的主键也成为了类定义中的`IDKey`索引。
如果字段不包含数据,则没有定义`IDKey`索引。
如果将主键定义为`IDKey`索引,则数据访问将更加有效,但主键值一旦设置,就永远不能修改。
一旦设置,就不能更改分配给主键的值,也不能将其他键指定为主键。
使用此选项还将更改主键排序规则的默认值;
主键字符串值默认为`EXACT`排序规则。
如果为`FALSE`,则主键和`ID`键被定义为独立的,效率较低。
但是,主键值是可修改的,主键字符串值默认为当前排序规则类型`default`,默认为`SQLUPPER`。
要设置`PKEY_IS_IDKEY`选项,必须具有`%Admin_Manage:USE`权限。
否则,将收到一个`SQLCODE -99`错误(特权违反)。
一旦设置,该选项将在系统范围内对所有进程生效。
该选项的系统范围默认值也可以通过以下方式设置:
- `$SYSTEM.SQL.Util.SetOption()`方法配置选项`DDLPKeyNotIDKey`。
要确定当前设置,调用`$SYSTEM.SQL.CurrentSettings()`,它显示通过DDL创建的是主键而不是ID键;
默认值是1。
- 管理门户配置设置。
选择系统管理,配置,SQL和对象设置,SQL。
查看或修改通过DDL创建的表的“将主键定义为ID键”的当前设置。
`PKEY_IS_IDKEY`设置保持有效,直到通过另一个SET OPTION `PKEY_IS_IDKEY`重置或直到 IRIS `Configuration`被重新激活,将该参数重置为IRIS System `Configuration`设置。
## SUPPORT_DELIMITED_IDENTIFIERS
默认情况下,系统范围内支持分隔标识符。
`SUPPORT_DELIMITED_IDENTIFIERS`布尔选项允许您更改系统范围内对分隔标识符的支持。
取值为`TRUE`、`FALSE`。
如果为`TRUE`,用双引号分隔的字符串被认为是SQL语句中的标识符。
如果为`FALSE`,由双引号分隔的字符串被认为是SQL语句中的字符串字面值。
要设置`SUPPORT_DELIMITED_IDENTIFIERS`选项,必须具有`%Admin_Manage:USE`权限。
否则,将收到一个`SQLCODE -99`错误(特权违反)。
一旦设置,该选项将在系统范围内对所有进程生效。
`SUPPORT_DELIMITED_IDENTIFIERS`设置将保持有效,直到通过另一个设置选项`SUPPORT_DELIMITED_IDENTIFIERS`进行重置,或者直到由`$SYSTEM.SQL.Util.SetOption()方法delimitedifiers`选项在系统范围内进行更改。
## Locale Options
区域设置选项是关键字选项,用于为当前进程的日期、时间和数字约定设置IRIS区域设置。
可选关键字有`AM、DATE_FORMAT、DATE_MAXIMUM、DATE_MINIMUM、DATE_SEPARATOR、DECIMAL_SEPARATOR、MIDNIGHT、MINUS_SIGN、MONTH_ABBR、MONTH_NAME、NOON、NUMERIC_GROUP_SEPARATOR、NUMERIC_GROUP_SIZE、PM、PLUS_SIGN、TIME_FORMAT、TIME_PRECISION、TIME_SEPARATOR、WEEKDAY_ABBR、WEEKDAY_NAME、YEAR_OPTION`。
所有这些选项都可以设置为文字,并且都采用默认值(美式英语惯例)。
`TIME_PRECISION`选项是可配置的(参见下面)。
如果将这些选项中的任何一个设置为无效值,InterSystems IRIS将发出`SQLCODE -129`错误(`set OPTION`区域设置属性的非法值)。
Date/Time Option Keyword| Description
---|---
`AM` |`String`. 默认 `'AM'`
`DATE_FORMAT` |`Integer`. 默认值为`1`。取值范围为`0 ~ 15`。
`DATE_MAXIMUM`| `Integer`. 默认为`2980013(12/31/9999)`。可以设置为更早的日期,但不能设置为更晚的日期。
`DATE_MINIMUM`| `Positive Integer`. 默认为0`(12/31/1840)`。可以设置为较晚的日期,但不能设置为较早的日期。
`DATE_SEPARATOR`| Character. Default is '/'
`DECIMAL_SEPARATOR`| Character. Default is '.'
`MIDNIGHT`| String. Default is 'MIDNIGHT'
`MINUS_SIGN`| Character. Default is '-'
`MONTH_ABBR`| String. Default is ' Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'. (注意,该字符串以空格字符开始,这是默认分隔符.)
`MONTH_NAME`| String. Default is ' January February March April May June ... November December'. 注意,该字符串以空格字符开始,这是默认分隔符.)
`NOON`| String. Default is 'NOON'
`NUMERIC_GROUP_SEPARATOR`| Character. Default is ','
`NUMERIC_GROUP_SIZE` |Integer. Default is 3.PM String. Default is 'PM'
`PLUS_SIGN`| Character. Default is '+'
`TIME_FORMAT`| Integer. Default is 1. 取值范围为1 ~ 4。
`TIME_PRECISION`| Integer from 0 through 9 (inclusive). Default is 0. 小数秒的位数。
`TIME_SEPARATOR`| Character. Default is ':'
`WEEKDAY_ABBR`| String. Default is ' Sun Mon Tue Wed Thu Fri Sat'. (注意,该字符串以空格字符开始,这是默认分隔符.)
`WEEKDAY_NAME`| String. Default is ' Sunday Monday Tuesday Wednesday Thursday Friday Saturday'. (注意,该字符串以空格字符开始,这是默认分隔符.)
`YEAR_OPTION`| Integer. Default is 0. 取值范围为0 ~ 6。有关表示2位数和4位数年份的这些方法的解释,见ObjectScript $ZDATE函数。
要在系统范围内配置`TIME_PRECISION`,请进入管理门户,选择“系统管理”、“配置”、“SQL”和“对象设置”、“SQL”。
查看和编辑`GETDATE()`、`CURRENT_TIME`和`CURRENT_TIMESTAMP`的默认时间精度的当前设置。
它指定小数秒的精确位数。
默认值是`0`。
允许的值的范围是`0`到`9`位精度。
小数秒中有意义的数字的实际数目与平台有关。