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

标签 sql json oracle performance oracle12c

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

对于这个例子,我有以下 JSON:

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

所以我为此创建了下表:
create table persons
id number primary key,
person clob,
constraint person check(person is JSON);

这个想法是在个人列中坚持以前的 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';
我不知道哪个值优先,p.person来自 JSON 或列。

为了安全起见,最好使用不同的名称:
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/

相关文章:

sql - 添加缺失行的默认值(学生和科目的组合)

javascript - 将 "long form"日期时间字符串转换为 javascript 日期对象

sql - Oracle OR 条件使查询非常慢

mysql - 无法在 MySQL 中创建外键约束。错误编号 150

sql - 如何按 "all others"的前 N ​​个类别和总计进行聚合?

android - 失败 : Build failed with an exception gradle

python - 尝试从 json 解析值时出现类型错误

c# - 如何将 Oracle session 的全局化设置为与 .NET 中的 Windows 相同?

sql - 在 ANSI 语法 SQL 查询中放置条件的位置

mysql - DATEDIFF 和自己做减法有什么区别