在Oracle 12c中使用JSON的Json查询与SQL查询(性能)

Json query vs SQL query using JSON in Oracle 12c (Performance)

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

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

1
2
3
4
   {
       "id":"12",
       "name":"zhelon"
   }

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

1
2
3
4
CREATE TABLE persons
id NUMBER PRIMARY KEY,
person CLOB,
CONSTRAINT person CHECK(person IS JSON);

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

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

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

1
2
3
4
5
CREATE TABLE persons
id NUMBER PRIMARY KEY,
name VARCHAR(2000),
person CLOB,
CONSTRAINT person CHECK(person IS JSON);

去做这个:

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

我的问题是:

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

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

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

要么

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

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

1
2
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

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

1
2
3
4
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';