Vertica 中的区域设置处理

以下部分介绍 Vertica 如何处理区域设置。

会话区域设置

区域设置为会话范围的设置,仅适用于在该会话中执行的查询。您无法为单个查询指定区域设置。当您启动会话时,它将从配置参数 DefaultSessionLocale 中获取区域设置。

查询限制

使用默认值 en_US@collation=binary 以外的区域设置运行查询时,以下限制适用:

  • 当左侧 NOT IN 一列或多列为 CHARVARCHAR 时,多列 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
    
  • 如果外查询含有对 CHARVARCHAR 列执行 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ßestrasse 在磁盘上的存储位置不相邻。

按二进制排序规则排序也意味着排序优化在除二进制以外的区域设置中不起作用。如果在非二进制区域设置中创建表或投影,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 字段,尾随空格会被视为有意义的字符加以处理;但是,对使用非二进制区域设置的任一类型字符串字段进行排序或比较时,尾随空格会被忽略。

  • VARCHARCHAR 数据类型的最大长度参数是指可以存储在该字段中的八位字节(字节)数,而非字符数。使用多字节 UTF-8 字符时,字段的大小必须可容纳每个字符 1 到 4 个字节,具体取决于数据。