ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

StarRocks SMALLINT 类型详解:2 字节有符号整数的定义、建表与类型转换

StarRocks SMALLINT 类型详解:2 字节有符号整数的定义、建表与类型转换 StarRocks SMALLINT 类型详解2 字节有符号整数的定义、建表与类型转换【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksSMALLINT 是 StarRocks 中最基础的整数类型之一以 2 字节存储有符号整数取值范围为 [-32768, 32767]。本文围绕官方 SQL 参考文档展开系统讲解 SMALLINT 的类型定义、建表与写入示例、底层存储实现以及它在类型兼容与 schema 变更中的应用场景帮助你在实际建表和数据建模中正确选型。SMALLINT 类型定义与取值范围根据 SMALLINT 官方文档SMALLINT 是一个2 字节16 位的有符号整数取值范围为 [-32768, 32767]。存储大小2 字节即 16 bit。有符号范围最小值 -32768即 -2^15最大值 32767即 2^15 - 1。典型适用场景当业务数据的取值范围能稳定落在 2 字节有符号整数内时例如小型状态码、枚举值、低基数分类编号等使用 SMALLINT 相比 INT 可以节省一半存储空间从而降低存储与扫描成本。在 StarRocks 的完整整数类型家族中SMALLINT 与其他整数类型的对比关系如下类型存储字节数取值范围说明TINYINT1 字节[-128, 127]最小的有符号整数SMALLINT2 字节[-32768, 32767]本文主角对应 MySQL 的 SHORT 类型INT4 字节[-2147483648, 2147483647]最常用的默认整数BIGINT8 字节[-9223372036854775808, 9223372036854775807]大范围整数LARGEINT16 字节128 位有符号整数超大范围整数选型建议先根据业务数值的真实边界确定最小可行类型再预留一定的增长余量。SMALLINT 适合取值范围不大、且希望压缩存储的场景若业务值可能突破 32767 或小于 -32768则应升级为 INT。建表与写入示例官方文档给出了一个最简但完整的建表与写入示例下面保留原文并补充注释说明CREATE TABLE smallintDemo ( pk SMALLINT COMMENT range [-32768, 32767] ) ENGINEOLAP DUPLICATE KEY(pk) DISTRIBUTED BY HASH(pk) BUCKETS 1; INSERT INTO smallintDemo VALUES (32767);执行查询后返回结果MySQL SELECT * FROM smallintDemo; ------- | pk | ------- | 32767 | -------要点说明该示例使用默认的ENGINEOLAP即 StarRocks 的内置 OLAP 引擎并采用DUPLICATE KEY模型适合无需去重、以明细数据为主的场景。pk SMALLINT声明了主键列的数据类型为 SMALLINT插入时写入的是最大值32767验证了范围上界可用。DISTRIBUTED BY HASH(pk) BUCKETS 1表示按主键哈希分桶示例中仅使用 1 个桶实际生产环境中应根据数据量与集群规模合理设置桶数。边界值验证由于 SMALLINT 是有符号类型除上界 32767 外还应关注下界 -32768。例如INSERT INTO smallintDemo VALUES (-32768);两行数据分别代表上下边界均可正常写入。若尝试写入超出范围的值如32768或-32769StarRocks 会因数值溢出而报错这与所有定长整数类型的行为一致。底层实现从 FE 元数据到 BE 存储SMALLINT 不仅仅是一个 SQL 层概念它在 StarRocks 的整个执行链路上都有明确映射。逻辑类型定义BE 侧在 BE 的 logical_type.h 中SMALLINT 被定义为逻辑类型枚举TYPE_SMALLINT 3注释明确标注其对应MYSQL_TYPE_SHORT即与 MySQL 协议中的 SHORT 类型对齐TYPE_SMALLINT 3, // MYSQL_TYPE_SHORT同时在该文件的辅助函数中TYPE_SMALLINT被归入“整数类型”integer types集合参与is_integer_type判断以及IntegerLTGuard、SumBigIntLTGuard等模板守卫这意味着 SMALLINT 在表达式计算、谓词下推、聚合求和等场景中会被统一按整数语义处理。FE 侧的类型兼容矩阵在 FE 的 SchemaChangeTypeCompatibility.java 中定义了 SMALLINT 与其他类型之间的 schema 变更兼容关系从源码可以看出可转换为 SMALLINT 的来源类型TINYINT小类型可升级为 SMALLINTSMALLINT 可升级成的目标类型INT、BIGINT、LARGEINT、DOUBLE以及 VARCHAR。这构成了 StarRocks 类型演进的完整路径TINYINT → SMALLINT → INT → BIGINT → LARGEINT支持按需通过ALTER TABLE ... MODIFY COLUMN扩容列类型同时 SMALLINT 也可直接转为 DOUBLE 或 VARCHAR。此外同段代码中的ZONEMAP_REUSE_COMPATIBILITY_MATRIX表明TINYINT 与 SMALLINT、SMALLINT 与 INT/BIGINT 之间保持 Zone Mapzonemap复用兼容即列类型升级后仍可复用原有统计信息无需重建。类型判断与列存储在 BE 的 logical_type.h 中TYPE_SMALLINT与TYPE_TINYINT、TYPE_INT、TYPE_BIGINT等一起被is_integer_type覆盖在列式存储层column/runtime_type_traits.h、column/storage_column_traits.h中SMALLINT 列以 2 字节定长方式编码存放支持高效的向量化读写与压缩。从源码结构看SMALLINT 在 BE 中还贯穿于 Arrow 数据交换arrow_to_starrocks_converter.cpp、column_to_arrow_converter.cpp、类型转换type_converter.cpp与字典/变体编码variant_encoder.cpp等路径说明它能够被外部数据源如 Arrow/Parquet/ORC正确导入导出。SMALLINT 的常用操作与其他数值类型的比较与计算由于 SMALLINT 属于整数类型集合它可以直接与 INT、BIGINT 等类型进行比较和四则运算运算过程中 StarRocks 会自动进行类型提升结果类型取决于表达式中最大的操作数类型。例如 SMALLINT 与 INT 相加结果按 INT 计算避免中间溢出。在聚合与排序中的表现SMALLINT 参与SUM、COUNT、AVG等聚合函数时SumBigIntLTGuard等类型守卫会确保求和等操作提升到足够宽的结果类型防止小整数在累加过程中溢出。导入导出兼容性SMALLINT 与标准 SQL 整数语义一致可通过 Stream Load、Broker Load、INSERT INTO 等方式导入 CSV、Parquet、ORC 等格式的数据导入时框架会按目标列类型自动完成字符串/数值到 SMALLINT 的转换超界值将被拒绝或报错取决于导入配置。相关参考SMALLINT 官方类型文档docs/en/sql-reference/data-types/numeric/SMALLINT.mdBE 逻辑类型定义与整数守卫be/src/types/logical_type.hFE schema 变更类型兼容矩阵fe/fe-core/src/main/java/com/starrocks/catalog/SchemaChangeTypeCompatibility.javaBE 列式存储类型特性be/src/column/runtime_type_traits.h类型转换实现be/src/column/type_converter.cpp总结SMALLINT 是 StarRocks 整数类型体系中的 2 字节有符号整数取值范围 [-32768, 32767]适合对取值范围有明确边界的业务列使用。本文既覆盖了官方文档的建表与写入示例也结合 BE 逻辑类型定义与 FE 类型兼容矩阵说明了 SMALLINT 在存储、计算、导入导出和 schema 演进中的完整行为。实际建模时建议结合业务数值边界、存储成本和未来扩展需求在 TINYINT、SMALLINT、INT、BIGINT 之间做出合理选型。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表