db2 创建JSON属性的索引

wpcxdonn  于 11个月前  发布在  DB2
关注(0)|答案(1)|浏览(214)

我的PHP应用程序使用Monolog创建日志,并将日志存储在IBM i DB2数据库(版本7.4)中。
我可以访问任何给定的值,例如引用URL,当我使用

SELECT JSON_VALUE(COLUMN_NAME, '$.extra.referrer') 
FROM TABLE_NAME

字符串
但是如果我尝试搜索json

SELECT * 
FROM TABLE_NAME 
WHERE JSON_VALUE(COLUMN_NAME, '$.extra.referrer') = 'http://example.com'


这是 * 令人难以置信 * 慢(它需要几分钟)。我认为这是由于缺乏一个合适的索引。
我的问题是:如何在$.extra.referrer上创建索引?
我非常绝望,甚至问了Bing的AI,当我替换index_nametable_namejson_fieldproperty_name时,它给了我一个不起作用的答案:

CREATE INDEX index_name 
ON table_name (JSON_VALUE(json_field, '$.property_name'));


导致此错误:
[Code:-356,SQL State:429 BX] [SQL 0356]索引表达式1无效。

gjmwrych

gjmwrych1#

我怀疑最好的解决方案是在table上放一个BEFORE触发器。
这个触发器可以使用JSON_VALUE(COLUMN_NAME, '$.extra.referrer')将文档中感兴趣的值提取到一组单独的列中,然后您可以简单地在新列上创建索引。
假设Monolog没有额外列的问题,如果有,你可以简单地将值提取到一个新表的列中,沿着Monolog表中的PK。

已编辑

我遇到了一个presentation about Db2 Cloud (pp58-60),它建议存储BSON可以提供更快的处理速度。
性能:存储格式

  • Db2在内部使用BSON格式来处理JSON访问函数所完成的处理
  • BSON格式的优点是已经将文档解析为键:值对,并且具有易于遍历的树结构
  • JSON文档需要在内部转换为BSON,以便Db2函数能够遍历它们
  • 这些函数访问的任何以JSON格式存储的数据首先隐式转换为BSON格式,返回的任何结果都转换回JSON格式(如果有请求)
  • 对JSON数据的每次唯一访问都会产生这种开销,并且会显著影响查询的性能

IBM i docs提到
BSON是一种用于序列化JSON文本的标准化二进制表示格式。它允许快速遍历JSON。
因此,如果你可以插入BSON而不是JSON,你可能会得到更好的性能。多少,我不确定。如果你总是做全表扫描,可能还不够。但是如果你有一个日志日期的Timestamp列,并且可以限制设置周期,它可能就足够了。
请注意,转换为BSON会增加插入的开销,但这可能是值得的。
确保你理解allocate-clause为你的varchar/varbinary列。通常你会希望分配足够的内联空间,这样你的值的80%左右适合表空间,而不是溢出空间。当Db2除了表空间之外还必须从溢出空间读取时,它需要额外的I/O。任何超过32(?)字节的可变长度字段的默认分配是0。

相关问题