- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们使用 Postgres 中的 sql using ltree 来处理一些分层数据。
然而,当我们使用 cast 语法时,查询会非常慢,查询计划显示它实际上首先转换为 cstring
,然后是 lquery
。
explain analyse SELECT DISTINCT
subltree(metric, 0, 6) metric,
FROM demo
WHERE
metric ~ ('s.a.b' || '.*')::lquery;
查询计划:
Unique (cost=144235.79..144273.81 rows=3802 width=100) (actual time=11822.107..11822.107 rows=1 loops=1)
-> Sort (cost=144235.79..144245.29 rows=3802 width=100) (actual time=11822.107..11822.107 rows=1 loops=1)
Sort Key: (subltree(metric, 0, 6))
Sort Method: quicksort Memory: 25kB
-> Seq Scan on demo (cost=0.00..144009.71 rows=3802 width=100) (actual time=1940.149..11822.093 rows=1 loops=1)
Filter: (metric ~ ('s.a.b.*'::cstring)::lquery)
Rows Removed by Filter: 3714258
Total runtime: 11822.139 ms
但是,当我们在下面使用sql时,一切似乎都很好:
explain analyse SELECT DISTINCT
subltree(metric, 0, 6) metric,
FROM demo
WHERE
metric_name ~ (select ('s.a.b' || '.*')::lquery);
查询计划:
Unique (cost=13294.81..13313.85 rows=3809 width=76) (actual time=0.122..0.126 rows=6 loops=1)
InitPlan 1 (returns $0)
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.007..0.007 rows=1 loops=1)
-> Sort (cost=13294.79..13304.32 rows=3809 width=76) (actual time=0.121..0.122 rows=6 loops=1)
Sort Key: metric
Sort Method: quicksort Memory: 26kB
-> Bitmap Heap Scan on demo (cost=589.93..13068.25 rows=3809 width=76) (actual time=0.103..0.109 rows=6 loops=1)
Recheck Cond: (metric ~ $0)
-> Bitmap Index Scan on metric_gist_idx (cost=0.00..588.98 rows=3809 width=0) (actual time=0.097..0.097 rows=6 loops=1)
Index Cond: (metric ~ $0)
Total runtime: 0.153 ms
最佳答案
基本上,这是 ltree
扩展中的错误。
问题的核心是 I/O 例程 - 负责在 lquery
和字符串之间转换的函数 - 被错误地标记为 VOLATILE
.因为这样的函数可能有副作用,Postgres 不能通过使用索引优化掉任何比较;为了保证可预测的行为,规划者需要确保在每一行都调用类型转换。
子查询则不同。在可能的情况下,Postgres 只会评估一次子查询,而不管波动性如何。例如,比较
的输出SELECT random()
FROM generate_series(1,10);
与
SELECT (SELECT random())
FROM generate_series(1,10);
无论如何,这个bug有already been fixed在所有受支持的 Postgres 版本中,但修复不会影响现有数据库。转储/恢复应该更新扩展。或者,这应该具有相同的效果:
ALTER FUNCTION ltree_in(cstring) IMMUTABLE;
ALTER FUNCTION ltree_out(ltree) IMMUTABLE;
ALTER FUNCTION lquery_in(cstring) IMMUTABLE;
ALTER FUNCTION lquery_out(lquery) IMMUTABLE;
ALTER FUNCTION ltxtq_in(cstring) IMMUTABLE;
ALTER FUNCTION ltxtq_out(ltxtquery) IMMUTABLE;
ALTER FUNCTION ltree_gist_in(cstring) IMMUTABLE;
ALTER FUNCTION ltree_gist_out(ltree_gist) IMMUTABLE;
关于postgresql - Postgres ltree 查询中的 Cstring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30300921/
我有下表(简化): CREATE TABLE groups ( id PRIMARY KEY, path ltree, ... ); CREATE TABLE items ( id
我正在使用 PostgreSQL 和 ltree 构建大量二叉树数据。对于特定逻辑,我必须获取给定节点的最左/最右路径。 我的二叉树示例 我的表格内容示例 示例输入和预期输出: 输入 - 节点 1,最
我正在使用 PostgreSQL 和 ltree 构建大量二叉树数据。对于特定逻辑,我必须获取给定节点的最左/最右路径。 我的二叉树示例 我的表格内容示例 示例输入和预期输出: 输入 - 节点 1,最
我在使用 ltree 时遇到 PHP 问题来自 PostgreSQL .我在 SQL 中这样做: SELECT * FROM tabla t WHERE t.parent_path " for "OP
如何编写迁移文件以添加字段类型 'ltree' (PostgreSQL) Schema::create('table', function (Blueprint $table) { ....
我是 postgres 的新手,希望将 ltree 用于分层数据结构。 我在 varchar 列中同时拥有数据和 ltree 结构(即 domain.class.sublass),并且需要将 ltre
好的,所以我有一个表,其中 ltree 列在名为 path 的列上。我想选择多个路径,但我不想有大量的 OR 语句。这可能吗?或者这是最好的方法吗? 路径: 'schools.myschool.*'
我添加了 ltree 扩展,我可以在我的数据库中看到该扩展,但是当我运行以下查询时: CREATE TABLE flight_office.document_folder ( document_fol
正如标题所暗示的,我很难猜出如何有效地更新多行中的值。该列是使用数据类型 ltree 实现的。因此,在 postgresql 中应该有某种形式的特殊操作可用于此数据类型。这是一个示例: 表的名称,比方
我有一个库存表,它可以有一个树状的类别,比如: 计算机->PC计算机->平板电脑->Apple电子->计算机->其他 为此,ltree 模块看起来最合适。但是,它不能接受名称中的空格,例如“Perso
假设我使用 ltree 存储了一棵树: id | path | sort ------------------------------ 0 |0
我有一个包含 ltree 路径和名称列的 properties 表。 Ltree 路径包含父节点的 id,即“7968.7969.7987.8000”。每个树节点都有带有一些数值的报告。我需要找到 l
我一直在使用 Postgres ltree构造存储层次结构。现在,我想收集树中的所有叶节点。有没有一个简单的机制来做到这一点? CREATE TABLE foo AS SELECT node::l
我们使用 Postgres 中的 sql using ltree 来处理一些分层数据。 然而,当我们使用 cast 语法时,查询会非常慢,查询计划显示它实际上首先转换为 cstring,然后是 lqu
使用 Postgres ltree 存储产品类别的推荐方法是什么? 例如,我的专栏可能包含一个 ltree 路径,例如 "1.2.3",其中 1、2 和 3 是可以向用户显示的类别标签表的外键: ca
我计划实现一个使用 ltree 作为多级分类的数据库。但是,当我尝试获取路径 x 或 y 的条目时遇到了麻烦。 new_table +-------+--------+-------
我有 3 个表: LOCATION、LOCATION DESCRIPTION,其中包含每个位置的语言等,还有 1 个用于商店。 LOCATION DESCRIPTION 表还在 ltree 路径字段中
我在关系数据库中有一个表,我在其中使用称为 Materialized path 的技术对树进行编码(也称为沿袭列)。也就是说,对于我树中的每个节点,我在表中都有一行,对于每一行,我都有一个名为 anc
我正在考虑使用 PostgreSQL 的 Ltree module在我的应用程序中帮助线程评论。我一直在关注它以用于线程评论。我认为它会帮助您需要更新节点及其子节点的情况,例如当您想要隐藏评论及其回复
物化路径是一种在 SQL 中表示层次结构的方法。每个节点都包含路径本身及其所有祖先( grandparent/parent/self )。 MP ( docs ) 的 django-treebeard
我是一名优秀的程序员,十分优秀!