我正在使用带有json的oracle 12c和Sql Developer

对于此示例,我具有以下JSON:

   {
        "id": "12",
        "name": "zhelon"
   }


因此,我为此创建了下表:

create table persons
id number primary key,
person clob,
constraint person check(person is JSON);


想法是在person列中保留先前的JSON,并使用以下查询获取该数据

SELECT p.person FROM persons p WHERE json_textvalue('$name', 'zhelon')


谈到性能,我很想提取一些json字段并将新的列添加到表中以缩短响应时间(我不知道这是否可能)

create table persons
id number primary key,
name varchar(2000),
person clob,
constraint person check(person is JSON);


去做这个:

SELECT p.person FROM persons p WHERE p.name = 'zhelon';


我的问题是:

进行查询以获取数据的最佳方法是什么?我想减少响应时间。

哪个查询可以更快地获取数据?

SELECT p.person FROM persons p WHERE json_textvalue('$name', 'zhelon')


要么

SELECT p.person FROM persons p WHERE p.name = 'zhelon';

最佳答案

您可以创建一个虚拟列,如下所示:

ALTER TABLE persons ADD (NAME VARCHAR2(100)
   GENERATED ALWAYS AS (JSON_VALUE(person, '$name' returning VARCHAR2)) VIRTUAL);


我不知道JSON_VALUE的正确语法,但我认为您有个好主意。

如果需要,您还可以像其他任何列一样在此类列上定义索引。

但是,当您运行SELECT p.person FROM persons p WHERE p.name = 'zhelon';
我不知道哪个值优先于JSON或列中的p.person

为了安全起见,最好使用其他名称:

ALTER TABLE persons ADD (NAME_VAL VARCHAR2(100)
   GENERATED ALWAYS AS (JSON_VALUE(person, '$name' returning VARCHAR2)) VIRTUAL);

SELECT p.person FROM persons p WHERE p.NAME_VAL= 'zhelon';

关于sql - 在Oracle 12c中使用JSON的Json查询与SQL查询(性能),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41465546/

10-12 00:40
查看更多