Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 用于树搜索的数据类型或结构_Postgresql_Performance - Fatal编程技术网

Postgresql 用于树搜索的数据类型或结构

Postgresql 用于树搜索的数据类型或结构,postgresql,performance,Postgresql,Performance,我使用的是一个大数据结构,它通过字符串标签描述项目树,就像文件系统中的路径字符串一样。有约198000个树元素和约9100000个叶元素 实施方案: 这似乎是自然的选择 通过规范化的表结构:为每个路径等创建一个串行索引,并进行递归搜索 我假设,在实现之后,我可以通过解释和分析来比较两者。但是,在实施之前,是否可以预测差异或估计速度和额外的disck消耗性能 注意事项和测试 关于查询要求,它是开放的:当您通过字符串路径表示层次信息时,层次搜索引擎必须是表达型的,ltree、正则表达式和有时的LIK

我使用的是一个大数据结构,它通过字符串标签描述项目树,就像文件系统中的路径字符串一样。有约198000个树元素和约9100000个叶元素

实施方案:

这似乎是自然的选择

通过规范化的表结构:为每个路径等创建一个串行索引,并进行递归搜索

我假设,在实现之后,我可以通过解释和分析来比较两者。但是,在实施之前,是否可以预测差异或估计速度和额外的disck消耗性能

注意事项和测试 关于查询要求,它是开放的:当您通过字符串路径表示层次信息时,层次搜索引擎必须是表达型的,ltree、正则表达式和有时的LIKE运算符都是表达型的

用于测试指南的类似创建表测试路径ltree,包含~198000个树元素:

使用gist path在测试上创建索引路径\u gist\u idx ; - 消耗~3G 选择count*n 从测试路径~'first.second.*.etc\u etc.*' ; - n=149068 解释分析 选择count*n 从测试路径~'first.second.*.etc\u etc.*' ; - 计划时间:0.075毫秒 -执行时间:1317.443毫秒
规范化表的最佳解决方案似乎是闭包表,正如本文所建议的那样

在其他索引策略上,我们可以使用的线索,建议尝试pg_trgm模块。另见

让我们检查所有解决方案

强力索引 蛮力的优势在于不需要改变数据结构,只需要添加一个索引,在大数据环境下,我们有一些额外的磁盘空间。所以,只测试索引,没有拆分成真正的树和指针

测试树搜索 参见问题主体的测试。执行时间:~1300毫秒

良好的层次结构搜索运算符。唯一的问题是索引需要一个新的列,此时字符串必须保留以供其他使用,或者不使用ltree摄取格式。我使用了转换

修剪 代替 regexp_replacetext_路径“[^A-Z0-9_/]+”、“'、“ig”、-清除 “/”,文本路径处的路径分隔符 '.'-ltree分隔符 , ”“干净 ::ltree 所以,当您转换另一个问题时,通过强制转换ltree2text重用它并不是100%可逆的

使用LIKE运算符进行测试pg_trgm搜索 这是最快的方法:~200毫秒

创建扩展pg_trgm; 使用gin txt\U path gin\U trgm\U ops在t2\U文本上创建索引文本path\U gist\U idx; 解释分析 选择count*n 从t2_文本 其中,txt_路径类似于“first/second/%/etc_etc_etc/%” ; - 计划时间:0.133毫秒 -执行时间:195.524毫秒 - ... 但是,计数结果返回零! 使用gin colName gin_trgm_ops的索引使用更少的磁盘空间~2G

这里的问题不是性能,而是它不起作用!,这不是两个%的问题,因为它适用于类似的查询,因此不可靠:

当txt_路径如“first/second/%/etc_etc_etc/%”为零时计数。 计算像“%etc\u etc\u etc%”这样的txt\u路径正确的位置。 其他版本的PostgreSQL v12错误似乎相同

用正则表达式搜索测试pg_trgm 它的执行时间约为1000毫秒,比ltree和最可靠的tham-LIKE运算符快一点,磁盘消耗更少

解释分析 选择count*n 从t2_文本 其中txt_path~'^first/second/+//etc_etc_etc/' -定时:第2代2.312毫秒,…,总计27.853毫秒 -执行时间:1017.293毫秒 闭合表 如果不存在,则需要添加一个id bigserial,并添加一个新表,其祖先和后代指向原始表。它会占用更多的磁盘空间,而且…我可以用这个模型进行所有查询吗

它也会消耗更多的程序员时间!,没有自动化的方式将其作为模板表,但PostgreSQL不提供创建额外表的标准解决方案。对于查询,没有简单的运算符

…所以我没有添加测试,它是一个Wiki:如果你在这里编辑一些东西,我可以添加一个测试来显示差异

创建表t2\u TreeCosure 祖先bigint不为NULL, 子体bigint不为NULL, 主键祖先、后代、, 外键祖先引用t2_textid, 外键子代引用t2_textid ;
。。。有时可能会减少原始t2_文本表的磁盘消耗,减少文本,然后将其滑动。需要一个函数来重建路径等,但如果表闭包比tham brute force方法更快,则可以更快。

猜测性能是手相阅读。您好@LaurenzAlbe,谢谢。。。。所以,我的猜测是正确的,解释分析后开发的替代解决方案是唯一的方法。嗯:删除问题或等待palm阅读器?如果您有路径字符串数据,ltree显然是最佳选择。除了数据量之外,您预计会有什么波动性,您将运行什么样的查询?谢谢@Bergi,我编辑了注释 关于这个问题。。。但是上下文是开放的,数据挖掘和BI分析,所以功能最强大、最具表现力的层次运算符集更好。没有自动创建闭包表的方法—您可以使用具体化视图或触发器。