Vertica 中的区域设置处理
以下部分介绍 Vertica 如何处理区域设置。
会话区域设置
区域设置为会话范围的设置,仅适用于在该会话中执行的查询。您无法为单个查询指定区域设置。当您启动会话时,它将从配置参数 DefaultSessionLocale
中获取区域设置。
查询限制
使用默认值 en_US@collation=binary
以外的区域设置运行查询时,以下限制适用:
-
当左侧
NOT IN
一列或多列为CHAR
或VARCHAR
时,多列NOT IN
不支持子查询。例如:=> CREATE TABLE test (x VARCHAR(10), y INT); => SELECT ... FROM test WHERE (x,y) NOT IN (SELECT ...); ERROR: Multi-expression NOT IN subquery is not supported because a left hand expression could be NULL
注意
即便列test.x
和test.y
具有 NOT NULL 约束,也会出现错误。 -
如果外查询含有对
CHAR
或VARCHAR
列执行GROUP BY
的操作,则不支持关联的HAVING
子句子查询。在以下示例中,外查询中的GROUP BY x
会导致以下错误:=> DROP TABLE test CASCADE; => CREATE TABLE test (x VARCHAR(10)); => SELECT COUNT(*) FROM test t GROUP BY x HAVING x IN (SELECT x FROM test WHERE t.x||'a' = test.x||'a' ); ERROR: subquery uses ungrouped column "t.x" from outer query
-
使用分析函数的子查询不支持在
HAVING
子句中使用。例如:=> DROP TABLE test CASCADE; => CREATE TABLE test (x VARCHAR(10)); => SELECT MAX(x)OVER(PARTITION BY 1 ORDER BY 1) FROM test GROUP BY x HAVING x IN (SELECT MAX(x) FROM test); ERROR: Analytics query with having clause expression that involves aggregates and subquery is not supported
排序规则和投影
投影数据按照默认的 en_US@collation=binary
排序规则进行排序。因此,不论会话设置如何,发布以下命令都会根据二进制排序规则生成按 col1
排序的投影:
=> CREATE PROJECTION p1 AS SELECT * FROM table1 ORDER BY col1;
在此情况下,straße
和 strasse
在磁盘上的存储位置不相邻。
按二进制排序规则排序也意味着排序优化在除二进制以外的区域设置中不起作用。如果在非二进制区域设置中创建表或投影,Vertica 会返回以下警告:
WARNING: Projections are always created and persisted in the default
Vertica locale. The current locale is de_DE
非二进制区域设置输入处理
当区域设置是非二进制时,Vertica 可使用
COLLATION
函数将输入转换为按正常顺序排序的二进制字符串。
根据以下公式,此转换增加了输入所需的字节数:
result_column_width = input_octet_width * CollationExpansion + 4
CollationExpansion
配置参数的默认值为 5。
字符数据类型处理
-
CHAR
字段会按固定长度显示,包括任何尾随空格。在内部处理CHAR
字段时,首先会去除掉尾随空格。对于VARCHAR
字段,尾随空格会被视为有意义的字符加以处理;但是,对使用非二进制区域设置的任一类型字符串字段进行排序或比较时,尾随空格会被忽略。 -
VARCHAR
和CHAR
数据类型的最大长度参数是指可以存储在该字段中的八位字节(字节)数,而非字符数。使用多字节 UTF-8 字符时,字段的大小必须可容纳每个字符 1 到 4 个字节,具体取决于数据。