2017-01-04 1 views
3

私はフォローのJSONを持っているこの例では、JSONJSONクエリ(パフォーマンス)

でのOracle 12cとのSQL Developerを使用しています:

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

だから私が作成しました

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

アイデアは人の列に、前のJSONを保持し、そのデータを取得するために、次のクエリを使用している

:こののフォローテーブルperfonceについて話す
SELECT p.person FROM persons p WHERE json_textvalue('$name', 'zhelon') 

、私は

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

するために、いくつかのJSONフィールドを抽出し、(それが可能であれば私は知らない)、応答時間を改善するために、テーブルに新しいcolumを追加するのintrestingています次の操作を行います。

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'; 

答えて

1

あなたは、このような仮想列を作成することができます

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'; 
+0

私がいることでしたが、私の質問は、あなたが列に索引を作成する場合は、 'NAME'パフォーマンスが大幅になりますもパフォーマンス – cheloncio

+0

についてですより良い。 –

+0

インデックスは常にperfonamceを改善しますが、この場合、私はclobの欄にインデックスを付けるとどうなりますか? @WernfriedDomscheit – cheloncio

関連する問題