Commit e52eb38a authored by O'Reilly Media, Inc.'s avatar O'Reilly Media, Inc.
Browse files

Initial commit

parents
Loading
Loading
Loading
Loading
+7 −0
Changes for Oracle SQL and JSON - Working Files/Chapter 1/No Work Files.rtf: 7 added lines, 0 removed lines.
Original line number Diff line number Diff line
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww9000\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural

\f0\fs24 \cf0 No work files for this lesson...}
 No newline at end of file
+70 −0
Changes for Oracle SQL and JSON - Working Files/Chapter 10/IndexExplainPlan.sql: 70 added lines, 0 removed lines.
Original line number Diff line number Diff line
SET LINES 3000
SET PAGES 3000
SET LONG 3000
SET TRIMSPOOL ON
SET SQLFORMAT ANSICONSOLE
SET FEED 1

--
-- JSON_QUERY used as predicate in plan
-- cost = 1 and 1 for dot notation
--
EXPLAIN PLAN FOR
SELECT jd.json_col.Name
  FROM json_data jd
 WHERE jd.json_col.Name = 'Marty';
 
SELECT *
  FROM TABLE(DBMS_XPLAN.DISPLAY);

--
-- Virtual Column used as predicate in plan (cost = 1 and 1)
-- cost = 1 and 1 for dot notation
--
SELECT /*+ GATHER_PLAN_STATISTICS */ jd.json_col.Name
  FROM json_data jd
 WHERE jd.json_col.Name = 'Marty';

SELECT *
  FROM table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));
  
--
-- JSON Dot Notation index
--
CREATE INDEX zebra_name_ix ON json_data jd ( jd.json_col.Name );

DROP INDEX zebra_name_ix;
CREATE INDEX zebra_name_ix ON json_data jd ( JSON_VALUE(jd.json_col,'$.Name' RETURNING VARCHAR2(30)) );

--
-- Virtual Column used as predicate in plan (cost = 1 and 1)
-- cost = 1 and 1 json_value
--
SELECT /*+ GATHER_PLAN_STATISTICS */ jd.json_col.Name
  FROM json_data jd
 WHERE JSON_VALUE(jd.json_col,'$.Name' RETURNING VARCHAR2(30)) = 'Marty';

SELECT /*+ GATHER_PLAN_STATISTICS */ jd.json_col.Name
  FROM json_data jd
 WHERE JSON_EXISTS(jd.json_col,'$.Name');
 
CREATE INDEX has_name_column ON json_data jd ( JSON_EXISTS(jd.json_col,'$.Name') );

SELECT *
  FROM table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));

SELECT index_name,
       column_name
  FROM user_ind_columns
 WHERE index_name = 'HAS_NAME_COLUMN';
 
--
-- Note that it includes FALSE ON ERROR so broken JSON will always return FALSE
--
SELECT data_type,
       data_length,
       data_default
  FROM user_tab_cols
 WHERE column_name = ( SELECT column_name
                         FROM user_ind_columns
                        WHERE index_name = 'HAS_NAME_COLUMN' );
+14 −0
Changes for Oracle SQL and JSON - Working Files/Chapter 10/IndexIntro.sql: 14 added lines, 0 removed lines.
Original line number Diff line number Diff line
SET LINES 3000
SET PAGES 3000
SET SQLFORMAT ANSICONSOLE

EXPLAIN PLAN FOR
SELECT jd.json_col.Name
  FROM json_data jd
 WHERE jd.json_col.Name = 'Marty';
  
SELECT *
  FROM TABLE(DBMS_XPLAN.DISPLAY)
 WHERE TRIM(plan_table_output) IS NOT NULL;
 
CREATE INDEX zebra_name_ix ON json_data jd ( jd.json_col.Name );
 No newline at end of file
+102 −0
Changes for Oracle SQL and JSON - Working Files/Chapter 10/JSONIndexes.sql: 102 added lines, 0 removed lines.
Original line number Diff line number Diff line
SET LINES 3000
SET PAGES 3000
SET SQLFORMAT ANSICONSOLE
COLUMN index_name FORMAT a15
COLUMN column_name FORMAT a15

EXPLAIN PLAN FOR
SELECT jd.json_col.Name
  FROM json_data jd
 WHERE jd.json_col.Name = 'Marty';
  
SELECT *
  FROM TABLE(DBMS_XPLAN.DISPLAY)
 WHERE TRIM(plan_table_output) IS NOT NULL;
 
--
-- gets created as an JSON_QUERY call and used as such
--
CREATE INDEX zebra_name_ix ON json_data jd ( jd.json_col.Name );

SELECT index_name,
       column_name
  FROM user_ind_columns
 WHERE index_name = 'ZEBRA_NAME_IX';
 
SELECT data_type,
       data_length,
       data_default
  FROM user_tab_cols
 WHERE column_name = ( SELECT column_name
                         FROM user_ind_columns
                        WHERE index_name = 'ZEBRA_NAME_IX' );

--
-- Recreate with smaller data length. Dot notation queries may not use it anymore...
--
DROP INDEX zebra_name_ix;
CREATE INDEX zebra_name_ix ON json_data jd ( JSON_QUERY("JSON_COL" FORMAT JSON , '$.Name' RETURNING VARCHAR2(30) ASIS  WITHOUT ARRAY WRAPPER NULL ON ERROR));

--
-- Index is updated when row is created. Be careful of the ON ERROR clause. It may cause DML to fail
--
DROP INDEX zebra_name_ix;
CREATE INDEX zebra_name_ix ON json_data jd ( JSON_QUERY("JSON_COL" FORMAT JSON , '$.Name' RETURNING VARCHAR2(30) ASIS  WITHOUT ARRAY WRAPPER ERROR ON ERROR));

INSERT INTO json_data
VALUES(3,
'{ "Reason" : [ { "Medium" : "Movie",
                  "Title"  : "Zebra With No Name",
                  "Year"   : 2016 } ] }');

--
-- Where clause must match index "closely"
--
DROP INDEX zebra_name_ix;
CREATE INDEX zebra_name_ix ON json_data jd ( JSON_QUERY("JSON_COL" FORMAT JSON , '$.Name' RETURNING VARCHAR2(30) ASIS  WITHOUT ARRAY WRAPPER NULL ON ERROR));

EXPLAIN PLAN FOR
SELECT JSON_QUERY(jd.json_col FORMAT JSON , '$.Name' RETURNING VARCHAR2(30) ASIS  WITHOUT ARRAY WRAPPER NULL ON ERROR)
  FROM json_data jd
 WHERE JSON_QUERY(jd.json_col FORMAT JSON , '$.Name' RETURNING VARCHAR2(30) ASIS  WITHOUT ARRAY WRAPPER NULL ON ERROR) = 'Marty';
  
SELECT *
  FROM TABLE(DBMS_XPLAN.DISPLAY)
 WHERE TRIM(plan_table_output) IS NOT NULL;

-- what about json value
-- what about json_exists (binary)
-- what about json exists with a value query
DROP INDEX zebra_name_ix;
CREATE INDEX zebra_name_ix ON json_data jd ( JSON_VALUE("JSON_COL", '$.Name' RETURNING VARCHAR2(30)));

EXPLAIN PLAN FOR
SELECT JSON_VALUE(json_col,'$.Name')
  FROM json_data
 WHERE JSON_VALUE(json_col,'$.Name') = 'Marty';

SELECT index_name,
       column_name
  FROM user_ind_columns
 WHERE index_name = 'ZEBRA_NAME_IX';

SELECT data_type,
       data_length,
       data_default
  FROM user_tab_cols
 WHERE column_name = ( SELECT column_name
                         FROM user_ind_columns
                        WHERE index_name = 'ZEBRA_NAME_IX' );
--
-- Use the virtual colum in the where clause!
--
EXPLAIN PLAN FOR
SELECT JSON_VALUE(json_col,'$.Name')
  FROM json_data
 WHERE SYS_NC00003$ = 'Marty';

ALTER TABLE json_data RENAME COLUMN SYS_NC00003$ TO use_index_please;

SELECT JSON_VALUE(json_col,'$.Name')
  FROM json_data
 WHERE use_index_please = 'Marty';
+19 −0
Changes for Oracle SQL and JSON - Working Files/Chapter 10/relationalindexes.sql: 19 added lines, 0 removed lines.
Original line number Diff line number Diff line
SET PAGES 3000
SET LINES 3000
SET SQLFORMAT ANSICONSOLE

EXPLAIN PLAN FOR
SELECT *
  FROM famous_zebra
 WHERE zebra_name = 'Marty';
 
SELECT *
  FROM TABLE(DBMS_XPLAN.DISPLAY)
 WHERE plan_table_output IS NOT NULL;
 
CREATE INDEX zebra_ix ON famous_zebra ( zebra_name );

SELECT index_name,
       column_name
  FROM user_ind_columns
 WHERE index_name = 'ZEBRA_IX';
Loading