AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 89429
Accepted
Bohemian
Bohemian
Asked: 2015-01-16 16:49:59 +0800 CST2015-01-16 16:49:59 +0800 CST 2015-01-16 16:49:59 +0800 CST

当所有值都是 36 个字符时,使用 char 与 varchar 进行索引查找会明显更快吗

  • 772

我有一个遗留模式(免责声明!),它使用基于哈希生成的 id 作为所有表的主键(有很多)。这种 id 的一个例子是:

922475bb-ad93-43ee-9487-d2671b886479

改变这种方法是不可能的,但是索引访问的性能很差。撇开这可能的种种原因不谈,我注意到有一件事似乎不太理想——尽管所有许多表中的所有 id 值的长度都正好是 36 个字符,但列类型是varchar(36),而不是 char(36)。

将列类型更改为固定长度char(36)是否会提供任何显着的索引性能优势,除了每个索引页的条目数量的非常小的增加等?

即 postgres 在处理固定长度类型时是否比处理可变长度类型时执行得更快?

请不要提及微小的存储节省 - 与更改列所需的手术相比,这无关紧要。

postgresql performance
  • 1 1 个回答
  • 13465 Views

1 个回答

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2015-01-16T17:55:41+08:002015-01-16T17:55:41+08:00

    不,没有任何收获。该手册明确指出:

    提示:这三种类型之间没有性能差异,除了在使用空白填充类型时增加了存储空间,以及在存储到长度受限的列时需要一些额外的 CPU 周期来检查长度。虽然character(n)在其他一些数据库系统中具有性能优势,但在 PostgreSQL 中没有这样的优势;事实上character(n),由于其额外的存储成本,它通常是三者中最慢的。在大多数情况下应该使用text orcharacter varying来代替。

    大胆强调我的。

    char(n)是一种很大程度上过时、无用的类型。坚持varchar(n)。无需强制执行最大长度,varchar或者text更快一点,并发症更少。

    如果所有字符串的长度正好是 36 个字符,那么无论哪种方式都不会节省存储空间,即使是很小的存储空间也是如此。两者在磁盘和 RAM 中的大小完全相同。您可以使用pg_column_size()(在表达式和表格列上)进行测试。

    如果所有字符串都必须有 36 个字符,那么最好text使用CHECK (length(col) = 36)强制执行精确长度的约束,而varchar(36)不仅仅是强制执行最大长度。长度。看:

    • 使用数据类型“文本”存储字符串有什么缺点吗?

    您没有要求其他选项,但我会提到两个:

    1.COLLATION

    除非您使用“C”排序规则运行您的数据库。整理经常被忽视并且可能很昂贵。由于您的字符串在自然语言中似乎没有意义,因此遵循COLLATION规则可能没有意义。有关的:

    • 如何有效地获取“最近的对应行”?
    • 在函数内执行不使用索引?

    广泛的基准比较(除其他外)COLLATE "C"对性能的影响:

    • 按联接表中的列进行慢速查询排序

    2.UUID _

    您的字符串可疑地看起来像一个 UUID(32 个十六进制数字,以规范方式由 4 个分隔符分隔)。将 UUID 存储为实际数据类型效率更高:以多种方式更快,并且每个 UUIDuuid仅占用16个字节 - 与RAM 中的37char(36)个字节或varchar(36)(不带分隔符存储,仅 32 个定义字符)或33个字节相反在磁盘上。但是在许多情况下,对齐填充会导致40个字节。)也与数据类型COLLATION无关。uuid

    SELECT '922475bb-ad93-43ee-9487-d2671b886479'::uuid
    

    这可能会有所帮助(最后几章):

    • 将文本表示中的十六进制转换为十进制数

    也可以看看:

    • varchar(n) 的开销是多少?
    • MD5 字段的最佳数据类型是什么?
    • 53

相关问题

  • PostgreSQL 中 UniProt 的生物序列

  • 如何确定是否需要或需要索引

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve