Re: remaining sql/json patches - Mailing list pgsql-hackers
From | jian he |
---|---|
Subject | Re: remaining sql/json patches |
Date | |
Msg-id | CACJufxHstSGwRLqfea7NWgUO2Hzv=0OCvjFNyRndb0-UO71A3w@mail.gmail.com Whole thread Raw |
In response to | Re: remaining sql/json patches (jian he <jian.universality@gmail.com>) |
Responses |
Re: remaining sql/json patches
|
List | pgsql-hackers |
some tests after applying V33 and my small changes. setup: create table test_scalar1(js jsonb); insert into test_scalar1 select jsonb '{"a":"[12,13]"}' FROM generate_series(1,1e5) g; create table test_scalar2(js jsonb); insert into test_scalar2 select jsonb '{"a":12}' FROM generate_series(1,1e5) g; create table test_array1(js jsonb); insert into test_array1 select jsonb '{"a":[1,2,3,4,5]}' FROM generate_series(1,1e5) g; create table test_array2(js jsonb); insert into test_array2 select jsonb '{"a": "{1,2,3,4,5}"}' FROM generate_series(1,1e5) g; tests: ----------------------------------------return a scalar int4range explain(costs off,analyze) SELECT item FROM test_scalar1, JSON_TABLE(js, '$.a' COLUMNS (item int4range PATH '$' omit quotes)) \watch count=5 237.753 ms explain(costs off,analyze) select json_query(js, '$.a' returning int4range omit quotes) from test_scalar1 \watch count=5 462.379 ms explain(costs off,analyze) select json_value(js,'$.a' returning int4range) from test_scalar1 \watch count=5 362.148 ms explain(costs off,analyze) select (js->>'a')::int4range from test_scalar1 \watch count=5 301.089 ms explain(costs off,analyze) select trim(both '"' from jsonb_path_query_first(js,'$.a')::text)::int4range from test_scalar1 \watch count=5 643.337 ms ----------------------------return a numeric array from jsonb array. explain(costs off,analyze) SELECT item FROM test_array1, JSON_TABLE(js, '$.a' COLUMNS (item numeric[] PATH '$')) \watch count=5 727.807 ms explain(costs off,analyze) SELECT json_query(js, '$.a' returning numeric[]) from test_array1 \watch count=5 2995.909 ms explain(costs off,analyze) SELECT replace(replace(js->>'a','[','{'),']','}')::numeric[] from test_array1 \watch count=5 2990.114 ms ----------------------------return a numeric array from jsonb string explain(costs off,analyze) SELECT item FROM test_array2, JSON_TABLE(js, '$.a' COLUMNS (item numeric[] PATH '$' omit quotes)) \watch count=5 237.863 ms explain(costs off,analyze) SELECT json_query(js,'$.a' returning numeric[] omit quotes) from test_array2 \watch count=5 893.888 ms explain(costs off,analyze) SELECT trim(both '"' from(jsonb_path_query(js,'$.a')::text))::numeric[] from test_array2 \watch count=5 1329.713 ms explain(costs off,analyze) SELECT (js->>'a')::numeric[] from test_array2 \watch count=5 740.645 ms explain(costs off,analyze) SELECT trim(both '"' from (json_query(js,'$.a' returning text)))::numeric[] from test_array2 \watch count=5 1085.230 ms ----------------------------return a scalar numeric explain(costs off,analyze) SELECT item FROM test_scalar2, JSON_TABLE(js, '$.a' COLUMNS (item numeric PATH '$' omit quotes)) \watch count=5 238.036 ms explain(costs off,analyze) select json_query(js,'$.a' returning numeric) from test_scalar2 \watch count=5 300.862 ms explain(costs off,analyze) select json_value(js,'$.a' returning numeric) from test_scalar2 \watch count=5 160.035 ms explain(costs off,analyze) select jsonb_path_query_first(js,'$.a')::numeric from test_scalar2 \watch count=5 294.666 ms explain(costs off,analyze) select jsonb_path_query(js,'$.a')::numeric from test_scalar2 \watch count=5 547.130 ms explain(costs off,analyze) select (js->>'a')::numeric from test_scalar2 \watch count=5 243.652 ms explain(costs off,analyze) select (js->>'a')::numeric, (js->>'a')::numeric from test_scalar2 \watch count=5 403.183 ms explain(costs off,analyze) select json_value(js,'$.a' returning numeric), json_value(js,'$.a' returning numeric) from test_scalar2 \watch count=5 246.405 ms explain(costs off,analyze) select json_query(js,'$.a' returning numeric), json_query(js,'$.a' returning numeric) from test_scalar2 \watch count=5 520.754 ms explain(costs off,analyze) SELECT item, item1 FROM test_scalar2, JSON_TABLE(js, '$.a' COLUMNS (item numeric PATH '$' omit quotes, item1 numeric PATH '$' omit quotes)) \watch count=5 242.586 ms --------------------------------- overall, json_value is faster than json_query. but json_value can not deal with arrays in some cases. but as you can see, in some cases, json_value and json_query are not as fast as our current implementation. Here I only test simple nested levels. if you extra multiple values from jsonb to sql type, then json_table is faster. In almost all cases, json_table is faster. json_table is actually called json_value_op, json_query_op under the hood. Without json_value and json_query related code, json_table cannot be implemented.
pgsql-hackers by date: