Oren nakdimon oh really... i didn't know it is supported in standard edition

91
Oh Really? I Didn’t Know it is Supported in Standard Edition Oren Nakdimon www.db-oriented.com [email protected] +972-54-4393763 @DBoriented

Transcript of Oren nakdimon oh really... i didn't know it is supported in standard edition

Page 1: Oren nakdimon   oh really... i didn't know it is supported in standard edition

Oh Really? I Didn’t Know it is Supported in Standard Edition

Oren Nakdimon

www.db-oriented.com

[email protected]

+972-54-4393763

@DBoriented

Page 2: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Page 3: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Page 4: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

WHO AM I? A CHRONOLOGY BY “ORACLE YEARS”

Where: IAF

When: Oracle 6/7 [1991-1997]

What: Developer

Where: TELEknowledge

When: Oracle 8i/9i [1998-2003]

What: DBA Group Manager

Where: Olista

When: Oracle 10g/11g [2004-2011]

What: VP R&D + Israel Site Manager

Where:

When: Oracle 11g/12c [2011-]

What: Freelance Consultant

Where:

When: 2012-

What: Database

Architect / Developer / DBA

Where: Golden Screens

When: Oracle 8 [1997-1998]

What: Server Group Manager

Page 5: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

@DBORIENTED

Page 6: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

HTTP://DB-ORIENTED.COM

Page 7: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

DISCLAIMER

To the best of my knowledge, the features discussed in this presentation are currently (say, 12cR1) supported in Oracle Database Standard Edition

Lack of thorough official documentation

If you can do it, it doesn’t mean it’s allowed

Things change

Page 8: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Oracle Advanced

Analytics

is supported

only in

Enterprise Edition

Page 9: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Analytic

Functions

Page 10: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

SQL

Page 11: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Aggregate

Functions

Page 12: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

select department_id,

MIN(salary)

from employees

group by department_id;

DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY

30 119 Karen Colmenares 2500.00

30 118 Guy Himuro 2600.00

30 117 Sigal Tobias 2800.00

30 116 Shelli Baida 2900.00

30 115 Alexander Khoo 3100.00

30 114 Den Raphaely 11000.00

60 107 Diana Lorentz 4200.00

60 106 Valli Pataballa 4800.00

60 105 David Austin 4800.00

60 104 Bruce Ernst 6000.00

60 103 Alexander Hunold 9000.00

90 101 Neena Kochhar 17000.00

90 102 Lex De Haan 17000.00

90 100 Steven King 24000.00

DEPARTMENT_ID MIN(SALARY)

30 2500.00

60 4200.00

90 17000.00

Page 13: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

THE FIRST FUNCTION

DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY

30 119 Karen Colmenares 2500.00

30 118 Guy Himuro 2600.00

30 117 Sigal Tobias 2800.00

30 116 Shelli Baida 2900.00

30 115 Alexander Khoo 3100.00

30 114 Den Raphaely 11000.00

60 107 Diana Lorentz 4200.00

60 106 Valli Pataballa 4800.00

60 105 David Austin 4800.00

60 104 Bruce Ernst 6000.00

60 103 Alexander Hunold 9000.00

90 101 Neena Kochhar 17000.00

90 102 Lex De Haan 17000.00

90 100 Steven King 24000.00

select

department_id,

min(first_name) keep(dense_rank FIRST order by salary)

from employees

group by department_id;

DEPARTMENT_ID MIN(FIRST_NAME)…

30 Karen

60 Diana

90 Lex

Page 14: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

THE LAST FUNCTION

DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY

30 119 Karen Colmenares 2500.00

30 118 Guy Himuro 2600.00

30 117 Sigal Tobias 2800.00

30 116 Shelli Baida 2900.00

30 115 Alexander Khoo 3100.00

30 114 Den Raphaely 11000.00

60 107 Diana Lorentz 4200.00

60 106 Valli Pataballa 4800.00

60 105 David Austin 4800.00

60 104 Bruce Ernst 6000.00

60 103 Alexander Hunold 9000.00

90 101 Neena Kochhar 17000.00

90 102 Lex De Haan 17000.00

90 100 Steven King 24000.00

select

department_id,

min(first_name) keep(dense_rank LAST order by salary)

from employees

group by department_id;

DEPARTMENT_ID MIN(FIRST_NAME)…

30 Den

60 Alexander

90 Steven

Page 15: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

WHAT IS THE MOST COMMON JOB IN EACH DEPARTMENT?

select department_id,

min(job_id) keep(dense_rank last order by cnt)

from (select department_id,

job_id,

count(*) cnt

from employees

group by department_id,

job_id)

group by department_id;

DEPARTMENT_ID MIN(JOB_ID)KEEP(DENSE_RANKLAST

------------- ------------------------------

30 PU_CLERK

60 IT_PROG

90 AD_VP

Page 16: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

WHAT IS THE MOST COMMON JOB IN EACH DEPARTMENT?

select department_id,

stats_mode(job_id)

from employees

group by department_id;

DEPARTMENT_ID MIN(JOB_ID)KEEP(DENSE_RANKLAST

------------- ------------------------------

30 PU_CLERK

60 IT_PROG

90 AD_VP

Page 17: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Collections

Page 18: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE

I have this table: select * from country_test;

c1 c2 c3 c4

————— ————— ————— ——————

india us china uk

india india china uk

india china china uk

us us us uk

I need the distinct count of countries across the c1,c2,c3,c4 columns of the table, so the output has to be c1 c2 c3 c4 cnt

————— ————— ————— ——— ————

india us china uk 4

india india china uk 3

india china china uk 3

us us us uk 2

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:8749607800346631637

Page 19: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE

ops$tkyte%ORA11GR2> with data(r)

2 as

3 (select 1 r from dual

4 union all

5 select r+1 from data where r < 4

6 )

7 select c1, c2, c3, c4, count(distinct c) cnt

8 from (

9 select rowid rid,

10 c1, c2, c3, c4,

11 decode(r,1,c1,2,c2,3,c3,4,c4) c

12 from data, country_test

13 )

14 group by rid, c1, c2, c3, c4

15 /

C1 C2 C3 C4 CNT

---------- ---------- ---------- ---------- ----------

india us china uk 4

us us us uk 2

india india china uk 3

india china china uk 3

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:8749607800346631637

Page 20: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE

with data as (select rownum r,c1,c2,c3,c4

from ctest)

select listagg(rpad(val,21),'') within

group (order by column_list) orig

,count(distinct val) countries

from

(

select * from data

unpivot (val for column_list in

(c1,c2,c3,c4))

)

group by r

order by r;

select * from country_test,

lateral(

select count(distinct c) cnt from (

select c1 c from dual union all

select c2 from dual union all

select c3 from dual union all

select c4 from dual

)

);

select country_test.*, cnt_tab.cnt

from country_test,

(

select count(1) cnt, rid

from (

select rowid rid, c1 c from country_test

union select rowid, c2 from country_test

union select rowid, c3 from country_test

union select rowid, c4 from country_test

)

group by rid

) cnt_tab

where country_test.rowid = cnt_tab.rid

select * from country_test,

lateral(

select count(distinct val) cnt from (

select c1,c2,c3,c4 from dual

) unpivot(val for col in (c1,c2,c3,c4))

);

Page 21: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE

create type string_ntt as

table of varchar2(4000)

Page 22: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE

select

c.*,

cardinality(set(string_ntt(c1,c2,c3,c4)))

from country_test c;

C1 C2 C3 C4 CARDINALITY(SET(STRING_NTT(C1,C2,C3,C4)))

----- ----- ----- ----- -----------------------------------------

india us china uk 4

india india china uk 3

india china china uk 3

us us us uk 2

C1 C2 C3 C4 SET(STRING_NTT(C1,C2,C3,C4))

----- ----- ----- ----- ----------------------------------------

india us china uk STRING_NTT('india', 'us', 'china', 'uk')

india india china uk STRING_NTT('india', 'china', 'uk')

india china china uk STRING_NTT('india', 'china', 'uk')

us us us uk STRING_NTT('us', 'uk')

C1 C2 C3 C4 STRING_NTT(C1,C2,C3,C4)

----- ----- ----- ----- --------------------------------------------------

india us china uk STRING_NTT('india', 'us', 'china', 'uk')

india india china uk STRING_NTT('india', 'india', 'china', 'uk')

india china china uk STRING_NTT('india', 'china', 'china', 'uk')

us us us uk STRING_NTT('us', 'us', 'us', 'uk')

Page 23: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

KAKURO

Digits 1-9

Sum = associated clue

No duplications

6 = 1+2+3

12 = 1+2+3+6

12 = 1+2+4+5

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/

Page 24: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

> select *

from table(powermultiset(integer_ntt(1,2,3,4,5,6,7,8,9)));

COLUMN_VALUE

-------------------------

INTEGER_NTT(1)

INTEGER_NTT(2)

INTEGER_NTT(1, 2)

INTEGER_NTT(3)

INTEGER_NTT(1, 3)

INTEGER_NTT(2, 3)

INTEGER_NTT(1, 2, 3)

INTEGER_NTT(4)

INTEGER_NTT(1, 4)

INTEGER_NTT(2, 4)

INTEGER_NTT(1, 2, 4)

INTEGER_NTT(3, 4)

INTEGER_NTT(1, 3, 4)

INTEGER_NTT(2, 3, 4)

INTEGER_NTT(1, 2, 3, 4)

INTEGER_NTT(5)

...

INTEGER_NTT(1, 3, 4, 5, 6, 7, 8, 9)

INTEGER_NTT(2, 3, 4, 5, 6, 7, 8, 9)

INTEGER_NTT(1, 2, 3, 4, 5, 6, 7, 8, 9)

511 rows selected.

create type integer_ntt as table of integer

Page 25: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

break on x on num_of_elements skip 1

select sum(b.column_value) x,

a.num_of_elements,

listagg(b.column_value,'+') within group(order by b.column_value) expr

from (select rownum id,

column_value combination,

cardinality(column_value) num_of_elements

from table(powermultiset(integer_ntt(1,2,3,4,5,6,7,8,9)))) a,

table(a.combination) b

where a.num_of_elements > 1

group by a.id,a.num_of_elements

order by x,num_of_elements,expr;

X NUM_OF_ELEMENTS EXPR

---------- --------------- ----------

3 2 1+2

4 2 1+3

5 2 1+4

2+3

6 2 1+5

2+4

3 1+2+3

7 2 1+6

2+5

3+4

3 1+2+4

X NUM_OF_ELEMENTS EXPR

---------- --------------- --------------------

41 7 2+4+5+6+7+8+9

8 1+2+3+5+6+7+8+9

42 7 3+4+5+6+7+8+9

8 1+2+4+5+6+7+8+9

43 8 1+3+4+5+6+7+8+9

44 8 2+3+4+5+6+7+8+9

45 9 1+2+3+4+5+6+7+8+9

502 rows selected.

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/

Page 26: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Pattern

Matching

Page 27: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

THE MOST BASIC SQL

Row-level visibility

Maximum one output row per input row

WHERE clause

Page 28: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

AGGREGATE FUNCTIONS

Group-level visibility

Strict definition of “group”

Each input row belongs to exactly one group

Maximum one output row per group

GROUP BY clause

HAVING clause

Page 29: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Window-level visibility

Strict definition of “window”

Each input row has its own window

Window-level aggregates are added to input rows

OVER

PARTITION BY

ORDER BY

ANALYTIC (WINDOW) FUNCTIONS

Page 30: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Window-level visibility

Strict definition of “window”

Each input row has its own window

Window-level aggregates are added to input rows

OVER

PARTITION BY

ORDER BY

ANALYTIC (WINDOW) FUNCTIONS

Page 31: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

ANALYTIC (WINDOW) FUNCTIONS

Window-level visibility

Strict definition of “window”

Each input row has its own window

Window-level aggregates are added to input rows

OVER

PARTITION BY

ORDER BY

Page 32: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PATTERN MATCHING

Enhanced analysis of row sequences

Match-based output

One row per match (similar to the “group by” concept)

or

All the match’s input rows (similar to the “window” concept)

Each input row may belong to 0, 1 or more matches

Page 33: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PATTERN MATCHING

http://marogel.wordpress.com/2015/05/22/a-greedy-algorithm-using-recursive-subquery-factoring/

with fib(x,f) as (

select 1 as x, 1 as f from dual

union all

select f, x+f from fib where x+f <= &n

)

select f

from fib

match_recognize(

order by f desc

all rows per match

pattern ((A|{-B-})+)

define A as sum(A.f) <= &n

)

F

89

55

34

21

13

8

5

3

2

1

A

n = 121

Page 34: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Oracle Spatial Option

is supported

only in

Enterprise Edition

Page 35: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Oracle

Locator

Page 36: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

create table stops (

stop_id varchar2(20) constraint stops_pk primary key,

stop_code varchar2(20),

stop_name varchar2(100),

stop_location mdsys.sdo_geometry,

vehicle_type number(2)

);

insert into user_sdo_geom_metadata

(table_name,column_name,diminafo,srid)

values ('STOPS',

'STOP_LOCATION',

mdsys.sdo_dim_array(

mdsys.sdo_dim_element('LONG', -180.0, 180.0, 0.05)),

mdsys.sdo_dim_element('LAT', -90.0, 90.0, 0.05),

8307);

Page 37: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

CREATE TABLE STOPS_EXT (stop_id varchar2(20),

stop_code varchar2(20),

stop_name varchar2(100),

stop_lat number,

stop_lon number,

stop_url varchar2(100),

vehicle_type number)

ORGANIZATION EXTERNAL (

TYPE ORACLE_LOADER

DEFAULT DIRECTORY EXT_TABLES_DIR

ACCESS PARAMETERS (

records delimited by 0x'0d0a'

characterset UTF8

skip 1

logfile EXT_TABLES_DIR:'stops_%p_%a.log'

badfile EXT_TABLES_DIR:'stops_%p_%a.txt'

fields terminated by 0x'09' optionally enclosed by '"'

missing field values are null

reject rows with all null fields

)

LOCATION ('stops.txt')

)

REJECT LIMIT UNLIMITED;

Page 38: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

insert /*+ append */ into stops (

stop_id,

stop_code,

stop_name,

stop_location,

vehicle_type)

select stop_id,

stop_code,

stop_name,

mdsys.sdo_geometry(2001, -- 2 dimensional point

8307, -- lat/long coordinate system

mdsys.sdo_point_type(stop_lon,

stop_lat,

null),

null, -- n/a for point type

null), -- n/a for point type

vehicle_type

from stops_ext;

commit;

Page 39: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

External

Tables

Page 40: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

insert /*+ append */ into stops (

stop_id,

stop_code,

stop_name,

stop_location,

vehicle_type)

select stop_id,

stop_code,

stop_name,

mdsys.sdo_geometry(2001, -- 2 dimensional point

8307, -- lat/long coordinate system

mdsys.sdo_point_type(stop_lon,

stop_lat,

null),

null, -- n/a for point type

null), -- n/a for point type

vehicle_type

from stops_ext;

commit;

create index stops_location_idx

on stops (stop_location)

indextype is mdsys.spatial_index

parameters ('layer_gtype=POINT');

Page 41: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

(-1.910312, 52.478861)

Page 42: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

SELECT s.stop_code,

s.stop_name,

s.stop_location.sdo_point.x longitude,

s.stop_location.sdo_point.y latitude

FROM stops s

WHERE sdo_within_distance(

s.stop_location,

sdo_geometry(2001,8307,

sdo_point_type(-1.910312, 52.478861, NULL), NULL, NULL),

'distance=200 unit=meter') = 'TRUE';

All the stops within 200

meters

Page 43: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

GEOMETRY AGGREGATION

SELECT sdo_util.to_wktgeometry(

sdo_aggr_union(sdoaggrtype(s.stop_location,0.05)))

FROM stops s

WHERE sdo_within_distance(

s.stop_location,

sdo_geometry(2001,8307,

sdo_point_type(-1.910312, 52.478861, NULL), NULL, NULL),

'distance=200 unit=meter') = 'TRUE';

MULTIPOINT ((-1.91159 52.47736), (-1.90855 52.47859), (-1.9079 52.47869),

(-1.90808 52.47886), (-1.91157 52.47958))

Page 44: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

MULTIPOINT ((-1.91159 52.47736), (-1.90855 52.47859), (-1.9079 52.47869),

(-1.90808 52.47886), (-1.91157 52.47958))

Page 45: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

SELECT s.stop_code,

s.stop_name,

s.stop_location.sdo_point.x longitude,

s.stop_location.sdo_point.y latitude

FROM stops s

WHERE sdo_nn(

s.stop_location,

sdo_geometry(2001,8307,

sdo_point_type(-1.910312, 52.478861, NULL), NULL, NULL),

'sdo_num_res=3') = 'TRUE';

3 nearest stops

Page 46: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

SELECT round(sdo_nn_distance(1)) dist_meters,

s.stop_code,

s.stop_name

FROM stops s

WHERE sdo_nn(

s.stop_location,

sdo_geometry(2001,8307,

sdo_point_type(-1.910312, 52.478861, NULL), NULL, NULL),

'sdo_num_res=3',1) = 'TRUE'

order by dist_meters;

3 nearest stops + their

distance

Page 47: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

CITIES AND POLYGONS

> desc cities

Name Null? Type

----------------------------- -------- --------------------

CITY_ID NUMBER

CITY_NAME VARCHAR2(100)

POLYGON MDSYS.SDO_GEOMETRY

Page 48: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

WHICH CITY CONTAINS OUR POINT?

select c.city_name

from cities c

where sdo_relate(

c.polygon,

sdo_geometry(2001,8307,

sdo_point_type(-1.910312, 52.478861, NULL), NULL, NULL),

'mask=contains') = 'TRUE';

Page 49: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

NEIGHBOR CITIES

select c2.city_name

from cities c1,

cities c2

where c1.city_name = 'Birmingham'

and sdo_relate(c2.polygon, c1.polygon, 'mask=touch') = 'TRUE';

Page 50: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

“Online DDl OperatiOns

Are supported

only in

enterprise eDitiOn”

Many

Page 51: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Some

Online

Operations

Page 52: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

ONLINE DDL OPERATIONS

Offline Operations Online Operations

Page 53: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

ONLINE DDL OPERATIONS

Offline Operations Online Operations

Get ORA-54 due to active transactions

Wait for active transactions to end

Page 54: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

ONLINE DDL OPERATIONS

Offline Operations Online Operations

Get ORA-54 due to active transactions

Wait for active transactions to end

Block new DML statements Do not block new DML statements

Page 55: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

THE KEYWORD ONLINE – NOT A GOOD SIGN FOR US

11g

CREATE INDEX … [ONLINE]

ALTER INDEX … REBUILD [ONLINE]

12c

ALTER TABLE … DROP CONSTRAINT … [ONLINE]

ALTER TABLE … SET UNUSED … [ONLINE]

DROP INDEX … [ONLINE]

ALTER INDEX … UNUSABLE [ONLINE]

Page 56: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

ONLINE OPERATIONS

12c

ALTER INDEX … INVISIBLE

ALTER INDEX … VISIBLE

Page 57: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Invisible

Indexes

Page 58: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

INVISIBLE INDEXES

Maintained by DML

Invisible to the optimizer

Unless optimizer_use_invisible_indexes is true

Why?

To add an index without affecting existing statements

To validate that dropping an index will not have a negative impact, before actually dropping it (*)

(*) Not good enough if the index “protects” a foreign key

Page 59: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

ONLINE OPERATIONS

Adding a new column to a non-empty table

An optional column with no default

As of 11g, adding a mandatory column with default is a meta-data only operation: Fast

No space

No redo

No undo

Online

As of 12c, the same is true also for optional columns 11g

Page 60: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

“ALMOST ONLINE” OPERATIONS

> drop index t_idx;

drop index t_idx

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified

or timeout expired

Elapsed: 00:00:00.00

Page 61: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

“ALMOST ONLINE” OPERATIONS

> alter session set ddl_lock_timeout=2;

Session altered.

> drop index t_idx;

drop index t_idx

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified

or timeout expired

Elapsed: 00:00:02.02

Page 62: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

“ALMOST ONLINE” OPERATIONS

> alter session set ddl_lock_timeout=2;

Session altered.

> drop index t_idx;

Index dropped.

Elapsed: 00:00:00.95

Page 63: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

“ALMOST ONLINE” OPERATIONS

ALTER TABLE ADD CONSTRAINT

ALTER TABLE ADD CONSTRAINT ENABLE NOVALIDATE

ALTER TABLE ENABLE VALIDATE CONSTRAINT

Page 64: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

CREATING AN INDEX ON A STATIC TABLE

create table catalog_items (

catalog_item_id number not null,

name varchar2(100) not null,

...

constraint catalog_items_pk primary key (catalog_item_id)

);

create index catalog_items_idx1 on catalog_items(...);

Page 65: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

CREATING AN INDEX ON A STATIC TABLE REFERENCED BY AN ACTIVE TABLE

create table catalog_items (

catalog_item_id number not null,

name varchar2(100) not null,

...

constraint catalog_items_pk primary key (catalog_item_id)

);

create table orders (

order_id number not null,

catalog_item_id number not null,

...

constraint orders_pk primary key (order_id),

constraint orders_fk_catalog_items

foreign key (catalog_item_id)

references catalog_items (catalog_item_id)

);

create index orders_catalog_item_id_idx on

orders (catalog_item_id);

Page 66: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

CREATING AN INDEX ON A STATIC TABLE REFERENCED BY AN ACTIVE TABLE

alter session set ddl_lock_timeout=2;

alter table orders disable constraint orders_fk_catalog_items;

Note that by doing this we (temporarily) allow entering orders that reference non-existing catalog items into the database. Think carefully if you are willing to take this risk.

create index catalog_items_idx1 on catalog_items(...);

alter table orders enable novalidate

constraint orders_fk_catalog_items;

alter table orders enable validate

constraint orders_fk_catalog_items;

Page 67: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Online index REBUILD

IS supported

only in

Enterprise Edition

But do I really

need to rebuild

indexes?

Page 68: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

INDEX REBUILD?

index on T(CREATION_TIME)

select … from T where CREATION_TIME between …

Page 69: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Index

Coalesce

Page 70: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

INDEX REBUILD?

index on T(CREATION_TIME)

select … from T where CREATION_TIME between …

Page 71: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

INDEX REBUILD?

index on T(CREATION_TIME)

select … from T where CREATION_TIME between …

Page 72: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

ONLINE APPLICATION UPGRADE?

Page 73: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Edition

Based

Redefinition

Page 74: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Procedure P

Procedure P

My Schema

Edition1

Edition2

procedure p is

begin

-- do something

end p;

create or replace

procedure p as

begin

-- do something else

end p;

Page 75: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Procedure

P

My Schema

Edition1

Edition2

Function

F

Procedure

P

View

V

Page 76: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Procedure

P

My Schema

Edition1

Edition2

Function

F

Procedure

P

View

V

Edition3 Function

F

Package

PKG

Page 77: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Procedure

P

My Schema

Edition1

procedure p is

...

select name

into ...

from people

...

Table

PEOPLE - id

- name

Page 78: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Procedure

P

My Schema

Edition1

Edition2

Edition3 Procedure

P

procedure p is

...

select name

into ...

from people

...

Table

PEOPLE - id

- name

- first_name

- last_name procedure p is

...

select

first_name,

last_name

into ...

from people

...

Page 79: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Procedure

P

My Schema

Edition1

Edition2

Edition3 Procedure

P

Editioning

View

PEOPLE

Editioning

View

PEOPLE

Table

PEOPLE$T - id

- name

- first_name

- last_name

create editioning view people

as select id, name

from people$t

create editioning view people

as select id, first_name, last_name

from people$t

select name

into ...

from people

select

first_name, last_name

into ...

from people

Page 80: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

I LOVE EBR BECAUSE…

It enables to apply any change in an online fashion

The upgrade is performed in the privacy of a new unexposed edition

The upgrade can be done at any time

Supported everywhere (since Oracle 11.2), including standard edition

Page 81: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Some Examples

USERS$T USERS2$T

USERS

Forward C.E. Trigger

Reverse C.E. Trigger

USERS

Pre-Upgrade Edition

adding an index to a big active table

Post-Upgrade Edition

ADDING AN INDEX TO A BIG ACTIVE TABLE

Page 82: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

The Partitioning Option

is supported

only in

Enterprise Edition

Page 83: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

Partition

Views

Page 84: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PARTITION VIEWS

T1

T2

T3

T4 alter table add partition create table

create or replace view

drop table alter table drop partition

Page 85: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PARTITION VIEWS

> desc events_01

Name Null? Type

--------------------------- -------- ----------------------------

EVENT_ID NOT NULL NUMBER

EVENT_TIME NOT NULL DATE

EVENT_TYPE_ID NOT NULL NUMBER

DETAILS VARCHAR2(100)

create or replace view events as

select * from events_01

where event_time >= date'2016-01-01'

and event_time < date'2016-02-01'

union all

select * from events_02

where event_time >= date'2016-02-01'

and event_time < date'2016-03-01'

union all

select * from events_03

where event_time >= date'2016-03-01'

and event_time < date'2016-04-01'

Page 86: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PARTITION VIEWS

select event_type_id,count(*)

from events

where event_time between date'2016-02-20' and date'2016-02-22'

group by event_Type_id;

-------------------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

-------------------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 7 | 21 | 19 (6)| 00:00:01 |

| 1 | HASH GROUP BY | | 7 | 21 | 19 (6)| 00:00:01 |

| 2 | VIEW | EVENTS | 2884 | 8652 | 18 (0)| 00:00:01 |

| 3 | UNION-ALL | | | | | |

|* 4 | FILTER | | | | | |

| 5 | TABLE ACCESS BY INDEX ROWID BATCHED| EVENTS_01 | 1 | 11 | 3 (0)| 00:00:01 |

|* 6 | INDEX RANGE SCAN | EVENT_01_TIME_IDX | 1 | | 2 (0)| 00:00:01 |

| 7 | TABLE ACCESS BY INDEX ROWID BATCHED | EVENTS_02 | 2882 | 31702 | 18 (0)| 00:00:01 |

|* 8 | INDEX RANGE SCAN | EVENT_02_TIME_IDX | 2882 | | 9 (0)| 00:00:01 |

|* 9 | FILTER | | | | | |

| 10 | TABLE ACCESS BY INDEX ROWID BATCHED| EVENTS_03 | 1 | 11 | 3 (0)| 00:00:01 |

|* 11 | INDEX RANGE SCAN | EVENT_03_TIME_IDX | 1 | | 2 (0)| 00:00:01 |

-------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

4 - filter(NULL IS NOT NULL)

6 - access("EVENT_TIME">=TO_DATE(' 2016-02-20 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME“ <TO_DATE(' 2016-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

8 - access("EVENT_TIME">=TO_DATE(' 2016-02-20 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME"<=TO_DATE(' 2016-02-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

9 - filter(NULL IS NOT NULL)

11 - access("EVENT_TIME">=TO_DATE(' 2016-03-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME"<=TO_DATE(' 2016-02-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

Page 87: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PARTITION VIEWS

select count(details)

from events

where event_time between date'2016-01-10' and date'2016-02-22'

and event_type_id = 1;

-------------------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

-------------------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 74 | 79 (2)| 00:00:01 |

| 1 | SORT AGGREGATE | | 1 | 74 | | |

| 2 | VIEW | EVENTS | 12366 | 893K| 79 (2)| 00:00:01 |

| 3 | UNION-ALL | | | | | |

|* 4 | TABLE ACCESS FULL | EVENTS_01 | 6367 | 99K| 40 (0)| 00:00:01 |

|* 5 | TABLE ACCESS FULL | EVENTS_02 | 5998 | 95968 | 38 (0)| 00:00:01 |

|* 6 | FILTER | | | | | |

|* 7 | TABLE ACCESS BY INDEX ROWID BATCHED| EVENTS_03 | 1 | 16 | 3 (0)| 00:00:01 |

|* 8 | INDEX RANGE SCAN | EVENT_03_TIME_IDX | 1 | | 2 (0)| 00:00:01 |

-------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

4 - filter("EVENT_TYPE_ID"=1 AND

"EVENT_TIME">=TO_DATE(' 2016-01-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME"< TO_DATE(' 2016-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

5 - filter("EVENT_TYPE_ID"=1 AND

"EVENT_TIME"<=TO_DATE(' 2016-02-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME">=TO_DATE(' 2016-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

6 - filter(NULL IS NOT NULL)

7 - filter("EVENT_TYPE_ID"=1)

8 - access("EVENT_TIME">=TO_DATE(' 2016-03-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME"<=TO_DATE(' 2016-02-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

Page 88: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PARTITION VIEWS

select count(details)

from events

where event_time between date'2016-01-10' and date'2016-02-22'

and event_type_id = 1;

-------------------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

-------------------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 74 | 79 (2)| 00:00:01 |

| 1 | SORT AGGREGATE | | 1 | 74 | | |

| 2 | VIEW | EVENTS | 12366 | 893K| 79 (2)| 00:00:01 |

| 3 | UNION-ALL | | | | | |

|* 4 | TABLE ACCESS FULL | EVENTS_01 | 6367 | 99K| 40 (0)| 00:00:01 |

|* 5 | TABLE ACCESS FULL | EVENTS_02 | 5998 | 95968 | 38 (0)| 00:00:01 |

|* 6 | FILTER | | | | | |

|* 7 | TABLE ACCESS BY INDEX ROWID BATCHED| EVENTS_03 | 1 | 16 | 3 (0)| 00:00:01 |

|* 8 | INDEX RANGE SCAN | EVENT_03_TIME_IDX | 1 | | 2 (0)| 00:00:01 |

-------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

4 - filter("EVENT_TYPE_ID"=1 AND

"EVENT_TIME">=TO_DATE(' 2016-01-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME"< TO_DATE(' 2016-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

5 - filter("EVENT_TYPE_ID"=1 AND

"EVENT_TIME"<=TO_DATE(' 2016-02-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME">=TO_DATE(' 2016-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

6 - filter(NULL IS NOT NULL)

7 - filter("EVENT_TYPE_ID"=1)

8 - access("EVENT_TIME">=TO_DATE(' 2016-03-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME"<=TO_DATE(' 2016-02-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

Page 89: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PARTITION VIEWS

select count(details)

from events

where event_time between date'2016-01-10' and date'2016-02-22'

and event_type_id = 6;

-------------------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

-------------------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 74 | 42 (0)| 00:00:01 |

| 1 | SORT AGGREGATE | | 1 | 74 | | |

| 2 | VIEW | EVENTS | 2418 | 174K| 42 (0)| 00:00:01 |

| 3 | UNION-ALL | | | | | |

|* 4 | TABLE ACCESS FULL | EVENTS_01 | 2388 | 38208 | 40 (0)| 00:00:01 |

|* 5 | TABLE ACCESS BY INDEX ROWID BATCHED | EVENTS_02 | 29 | 464 | 2 (0)| 00:00:01 |

|* 6 | INDEX RANGE SCAN | EVENT_02_TYPE_IDX | 41 | | 1 (0)| 00:00:01 |

|* 7 | FILTER | | | | | |

|* 8 | TABLE ACCESS BY INDEX ROWID BATCHED| EVENTS_03 | 1 | 16 | 2 (0)| 00:00:01 |

|* 9 | INDEX RANGE SCAN | EVENT_03_TYPE_IDX | 1 | | 1 (0)| 00:00:01 |

-------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

4 - filter("EVENT_TYPE_ID"=6 AND

"EVENT_TIME">=TO_DATE(' 2016-01-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME“ <TO_DATE(' 2016-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

5 - filter("EVENT_TIME"<=TO_DATE(' 2016-02-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME">=TO_DATE(' 2016-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

6 - access("EVENT_TYPE_ID"=6)

7 - filter(NULL IS NOT NULL)

8 - filter("EVENT_TIME"<=TO_DATE(' 2016-02-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"EVENT_TIME">=TO_DATE(' 2016-03-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

9 - access("EVENT_TYPE_ID"=6)

Page 90: Oren nakdimon   oh really... i didn't know it is supported in standard edition

This presentation is available in http://db-oriented.com/presentations © O

ren N

akdim

on

PARTITION VIEWS

It’s our responsibility to insert into the right partition

EXCHANGE PARTITION is supported

Indexing

Local indexes are supported by definition

Global indexes are not (easily) supported

Partial indexes are supported by definition

Page 91: Oren nakdimon   oh really... i didn't know it is supported in standard edition

THANK YOU

Oren Nakdimon

www.db-oriented.com

[email protected]

+972-54-4393763

@DBoriented