在Oracle 12c中使用JSON的Json查询与SQL查询(性能)(Json query vs SQL query using JSON in Oracle 12c (Performance))
我正在使用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')
谈到perfonce,我很有兴趣提取一些json字段并在表中添加新的colum以改善响应时间(我不知道是否可能)
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';
I am using oracle 12c and Sql Developer with json
For this example I have the follow JSON:
{
"id": "12",
"name": "zhelon"
}
So I have created the follow table for this:
create table persons
id number primary key,
person clob,
constraint person check(person is JSON);
The idea is persist in person column the previous JSON and use a the follow query to get that data
SELECT p.person FROM persons p WHERE json_textvalue('$name', 'zhelon')
Talking about perfonce, I am intresting to extract some json field and add new a colum to the table to improve the response time (I don't know if that is possible)
create table persons
id number primary key,
name varchar(2000),
person clob,
constraint person check(person is JSON);
To do this:
SELECT p.person FROM persons p WHERE p.name = 'zhelon';
My question is:
What's the best way to make a query to get data? I want to reduce the response time.
Which query get the data faster ?
SELECT p.person FROM persons p WHERE json_textvalue('$name', 'zhelon')
or
SELECT p.person FROM persons p WHERE p.name = 'zhelon';
原文:https://stackoverflow.com/questions/41465546
更新时间:2019-12-10 15:42
最满意答案
您可以像这样创建一个虚拟列:
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';
You can create a virtual column like this:
ALTER TABLE persons ADD (NAME VARCHAR2(100)
GENERATED ALWAYS AS (JSON_VALUE(person, '$name' returning VARCHAR2)) VIRTUAL);
I don't know the correct syntax of JSON_VALUE but I think you get an idea.
If needed you can also define a index on such columns like any other column.
However, when you run SELECT p.person FROM persons p WHERE p.name = 'zhelon'; I don't know which value takes precedence, p.person from JSON or the column.
Better use a different name in order to be on the safe side:
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';
2017-01-04
相关问答
您可以像这样创建一个虚拟列: 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
...
我会改变方法。 而不是删除您不想要的行,而是编写查询以保留所需的行。 将它们写入新表。 然后删除旧表并重命名。 所以基本上你有一些逻辑上的东西 插入T1_new select ....其中DUP = 1 丢桌T1 将T1_new重命名为T1 这也开启了使用直接路径插入的机会(通过/ * + APPEND * / hint)。 如果您有可用资源,也可以使用并行性。 I would change the approach. Rather than delete the rows you don't w
...
不确定上面提供的内容,但是如果要查找所有并行查询操作的查询协调器,可以查询v $ px_session(或gv $ px_session)。 QCSID列是协调员。 Not sure about what you've provided above, but if you want to find the query coordinator for all parallel query operations, you can query v$px_session (or gv$px_session
...
正如krokodilko所说,执行以下操作: explain plan for
select pi.*
, pt.*
from policyissuance_oasis pi
, policytransaction_oasis pt
where
pi.newTranKeyJoin = pt.polTranKeyJoin(+)
and pi.policyNumber = '1-H000133'
and pi.DateChars='08/10/2017 09:24:51' -- 2016 d
...
Okie dokie如此, 将select语句更新为以下内容: SELECT ov.a, ov.b, ov.c, data.* FROM old_view ov,
JSON_TABLE
(
ov.my_column format json,
'$'
columns
something VARCHAR2(50 CHAR) format json path '$.x.y.z'
)
as data;
我正在处理
...
这是一个错误。 Oracle Support刚刚向我确认由于Oracle Version 12.1.0中的错误而发生异常。 仅限1个 。 有两种选择可供选择: 1)更新到Oracle 12.1.0版。 2 ,错误是固定的。 2)等待几周的Oracle即将开始工作的补丁。 该修补程序将在Oracle V12.1.0中修复此问题。 1 。 我们没有决定采用哪种方案,但我非常有信心,因为Oracle Support确实重现了我的问题,所以其中一种方法可行。 It's a bug. Oracle Supp
...
Oracle文档始终明确表示只允许一个级别的关联(尽管没有明确的原因,并且它违反了SQL标准)。 正如其中一位大师Solomon Yakobson已经在OTN上多次解释,在每个新版本中,在子版本1中(如在10.1,11.1中),更深层次的关联工作正常,就像OP注意到的那样。 它曾经在子版本2(10.2,11.2)中被“修复”(灵活性被收回)。 12.1具有相同的“增强”(所有级别的相关性),12.2没有把它拿走 - 尽管文档STILL表示相关性不允许超过一个级别。 特别是当我们使用WITH子句编写
...
您可以创建一个触发器,在任何insert语句上将触发一个函数将整个列转换为大写。 更新客户设置FirstName = UPPER(FirstName) You can create a trigger that upon any insert statement will fire a function to convert the entire column to uppercase. UPDATE Customers SET FirstName = UPPER(FirstName)
我正在尝试在Oracle 12.1.0.1.0上运行它 JSON支持随12.1.0引入。 2 ,所以你的版本不支持。 Oracle Database 12c第1版(12.1.0.2)新功能 I'm trying to run this on Oracle 12.1.0.1.0 JSON support was introduced with 12.1.0.2, so your version doesn't support that. Oracle Database 12c Release 1 (
...
JSON_TEXTCONTAINS是一个条件 ; 而JSON_VALUE是一个函数 。 您似乎将第二次调用JSON_VALUE视为一个条件 - 您没有将其结果与任何内容进行比较,并且您传递的参数过多,导致ORA-00907错误。 针对第4行第75列报告错误,该列是....DocumentId'之后的逗号。 看起来你真的想要将它返回的值与固定字符串进行比较: AND JSON_VALUE(app.application, '$.arrays.PII.arrays.PN.fields.Document
...