文章
姚 鑫 · 十一月 11, 2021 阅读大约需 8 分钟

第七十三章 SQL命令 SET OPTION

第七十三章 SQL命令 SET OPTION

设置执行选项。

大纲

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不会在ODBCJDBC或动态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选项将当前名称空间的编译模式设置为DEFERREDIMMEDIATEINSTALLNOCHECK
默认为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,也不会指定字段的默认值。
如果删除了UNIQUEPrimary 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 BYDISTINCT查询生成原始值。
EXACT_DISTINCT=FALSE时,启用快速Distinct,通过更好地使用索引(如果有索引),使涉及DistinctGROUP 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执行期间试图建立锁时等待的秒数。
当锁定冲突阻止当前进程对lockINSERTUPDATEDELETESELECT操作立即锁定一条记录、表或其他实体时,使用此锁定超时。
SQL继续尝试建立锁,直到超时超时,这时将生成SQLCODE -110-114错误。

可用的值是正整数和零。
超时设置是每个进程的。
可以使用$SYSTEM.SQL.Util.GetOption(“ProcessLockTimeout”)方法确定当前进程的锁定超时设置。

如果没有为当前进程设置锁定超时,则默认为当前系统范围的锁定超时设置。
如果您的ODBC连接断开并重新连接,重新连接的进程将使用当前系统范围的锁定超时设置。
系统范围的锁定超时默认为10秒。

PKEY_IS_IDKEY

PKEY_IS_IDKEY boolean选项指定主键是否也是系统范围内的ID键。
取值为TRUEFALSE
如果为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布尔选项允许您更改系统范围内对分隔标识符的支持。
取值为TRUEFALSE
如果为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_TIMECURRENT_TIMESTAMP的默认时间精度的当前设置。
它指定小数秒的精确位数。
默认值是0
允许的值的范围是09位精度。
小数秒中有意义的数字的实际数目与平台有关。

00
1 0 0 6
登录或注册以继续