当前位置: 首页 > 面试题库 >

PostgreSQL:在所有表字段的长度上创建索引

山越
2023-03-14
问题内容

我有一个名为的表profile,我想对它们进行排序,以表最填写的顺序。每个列都是JSONB列或TEXT列。我并不需要很确定,因此通常我按以下顺序订购:

SELECT * FROM profile ORDER BY LENGTH(CONCAT(profile.*)) DESC;

但是,这很慢,因此我想创建一个索引。但是,这不起作用:

CREATE INDEX index_name ON profile (LENGTH(CONCAT(*))

也没有

CREATE INDEX index_name ON profile (LENGTH(CONCAT(CAST(* AS TEXT))))

不能说我很惊讶。声明此索引的正确方法是什么?


问题答案:

要测量文本表示形式中行的大小,您可以将整个行都转换为文本,这比连接单个列要快得多:

SELECT length(profile::text) FROM profile;

但是索引中的此表达式存在3(或4)个问题:

  1. profile::text不接受语法速记CREATE INDEX,您需要在标准语法中添加额外的括号或默认值cast(profile AS text)

  2. @jjanes已经讨论了同样的问题:IMMUTABLE索引表达式中仅允许使用函数,而将行类型强制转换为text不满足此要求。您可以IMMUTABLE像Jeff概述的那样构建伪造的包装函数

  3. 存在一个固有的歧义(也适用于Jeff的答案!):如果列名与表名相同(这是一种常见情况),则您不能引用行类型,CREATE INDEX因为标识符始终解析为列名优先。

  4. 与原始版本的微小差异:这会在text表示中添加列分隔符,行装饰符和可能的转义字符。与您的用例无关紧要。

但是,我建议使用更激进的替代方法作为行大小的粗略指标:pg_column_size()。甚至更短,速度更快,避免了问题1,3和4:

SELECT pg_column_size(profile) FROM profile;

但是,问题2仍然存在:pg_column_size()也是STABLE。您可以创建一个简单且便宜的SQL包装函数:

CREATE OR REPLACE FUNCTION pg_column_size(profile)
  RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';


 类似资料:
  • 本文向大家介绍postgresql 修改字段长度的操作,包括了postgresql 修改字段长度的操作的使用技巧和注意事项,需要的朋友参考一下 使用数据库postgresql的时候,有时会遇到字段长度扩展的情况,由于之前已经有数据了,所以只能修改字段长度,不能通过删除再增加的方式。 可以使用如下方式进行 通过上面的一句话就可以把你的表中相应的字段的长度修改为3000. 补充:PostgreSQL字

  • 问题内容: 我需要加入 所有 PostgreSQL表并将它们转换成Python字典。数据库中有72个表。总列数大于 1600 。 我编写了一个简单的Python脚本,该脚本可以联接多个表,但是由于内存错误而无法联接所有表。在脚本执行期间,所有内存均被占用。然后,我在具有 128GB RAM和8个CPU 的新虚拟服务器上运行脚本。在lambda函数执行期间失败。 如何改进以下代码以执行 所有 表联接

  • 问题内容: 是否可以在每个表的每个字段中搜索Oracle中的特定值? 有几百个表,有些表中有成千上万的行,因此我知道这可能需要很长时间才能查询。但是我唯一知道的是我要查询的字段的值是1/22/2008P09RR8。< 我已经尝试过使用以下语句根据我认为应命名的内容找到合适的列,但未返回任何结果。 这个数据库上绝对没有文档,我也不知道该字段是从哪里提取的。 有什么想法吗? 问题答案: 引用: 我已尝

  • 问题内容: 我应该在列上 定义一个单独的索引(出于搜索目的),还是该索引是“自动”与约束一起添加的? 编辑 :根据科宾的建议,我在空桌上查询。这是结果,我不知道如何解释: 将IXD_EMAIL添加到表中时,相同的查询显示: 问题答案: 一个 独特的关键 是指数的一个特例,像个与独特性增加检查的常规指标。使用您可以看到您的唯一键实际上是B树类型索引。 一个 综合指数 上是不够的,你不需要只电子邮件单

  • 问题内容: 您是否需要为Oracle数据库中按字段分组的字段创建索引? 例如: 我正在测试我为上面创建的索引,与此查询唯一相关的索引是为field_two创建的索引。在任何其他字段上创建的其他单字段索引或组合索引将不会用于上述查询。这听起来正确吗? 问题答案: 可能是正确的,但这取决于您拥有多少数据。通常,我会为我在GROUP BY中使用的列创建索引,但是在您的情况下,优化器可能已经决定,在使用f

  • 本文向大家介绍postgresql 实现获取所有表名,字段名,字段类型,注释,包括了postgresql 实现获取所有表名,字段名,字段类型,注释的使用技巧和注意事项,需要的朋友参考一下 获取表名及注释: 过滤掉分表: 加条件 and relchecks=0 即可 获取字段名、类型、注释、是否为空: 补充:PostgreSQL查询表主键及注释内容 网上关于pgSql获取表主键的内容都是千篇一律,并