Vous êtes sur la page 1sur 123

The Features That

maybe
You Didnt Know About

Oren Nakdimon
www.db-oriented.com
oren@db-oriented.com
+972-54-4393763
@DBoriented
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
WHO AM I?
A CHRONOLOGY BY ORACLE YEARS

Where: IAF
Where:
When: Golden
Oracle Screens
6/7 [1991-1997]
Where: TELEknowledge
What: Developer 8 [1997-1998]
When: Oracle
When:Where: Olista
Oracle 8i/9i [1998-2003]
What: Server Group Manager
What:When:
DBA Oracle 10g/11g [2004-2011]
Group Manager
What: VP R&D + Israel Site Manager
Where: Where:
When: Oracle 11g/12c [2011-] When: 2012-
What: Freelance Consultant What: Database
Architect / Developer / DBA
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
@DBORIENTED
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
HTTP://DB-ORIENTED.COM
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
JoinilOUG meetup group
Download presentations

Give us your feedback


About this meeting
What do you want to hear and see next?
Initiate
and participate in discussions
Propose your presentation for upcoming
meetings
http://www.meetup.com/ilOUG-Oracle-Technologies-Meetup/

iloug16@gmail.com
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
SQL
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Aggregate
Functions
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
select department_id,
MIN(salary)
from employees
group by department_id;

DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY


30 117 Sigal Tobias 2800.00
30 119 Karen Colmenares 2500.00
30 118 Guy Himuro 2600.00
90 102 Lex De Haan 17000.00
90 101 Neena Kochhar 17000.00
30 115 Alexander Khoo 3100.00
60 104 Bruce Ernst 6000.00
30 116 Shelli Baida 2900.00
60 106 Valli Pataballa 4800.00
30 114 Den Raphaely 11000.00
90 100 Steven King 24000.00
60 103 Alexander Hunold 9000.00
60 105 David Austin 4800.00
60 107 Diana Lorentz 4200.00
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
DEPARTMENT_ID MIN(SALARY)
select department_id, 30 2500.00
MIN(salary) 60 4200.00
from employees 90 17000.00
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Aggregate
Functions

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

Oren Nakdimon
THE FIRST FUNCTION
select
department_id,
min(first_name) keep(dense_rank FIRST order by 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
THE FIRST FUNCTION
select
department_id,
min(first_name) keep(dense_rank FIRST order by 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
THE FIRST FUNCTION
select
department_id,
min(first_name) keep(dense_rank FIRST order by 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
THE FIRST FUNCTION
select
department_id,
min(first_name) keep(dense_rank FIRST order by 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
THE FIRST FUNCTION
select
department_id,
min(first_name) keep(dense_rank FIRST order by 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
THE FIRST FUNCTION DEPARTMENT_ID MIN(FIRST_NAME)
30 Karen
select 60 Diana
department_id, 90 Lex
min(first_name) keep(dense_rank FIRST order by 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Aggregate
Functions

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

Oren Nakdimon
THE LAST FUNCTION DEPARTMENT_ID MIN(FIRST_NAME)
30 Den
select 60 Alexander
department_id, 90 Steven
min(first_name) keep(dense_rank LAST order by 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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 JOB_ID CNT


------------- ---------------------------- ----------
90 AD_VP 2
30 PU_CLERK 5
60 IT_PROG 5
90 AD_PRES 1
30 PU_MAN 1
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Aggregate
Functions

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

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Collections
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE
with data as (select rownum r,c1,c2,c3,c4
from ctest) select * from country_test,
select listagg(rpad(val,21),'') within lateral(
group (order by column_list) orig select count(distinct c) cnt from (
,count(distinct val) countries select c1 c from dual union all
from select c2 from dual union all
( select c3 from dual union all
select * from data select c4 from dual
unpivot (val for column_list in )
(c1,c2,c3,c4)) );
)
group by r
order by r; select * from country_test,
lateral(
select country_test.*, cnt_tab.cnt
select count(distinct val) cnt from (
from country_test,
select c1,c2,c3,c4 from dual
(
) unpivot(val for col in (c1,c2,c3,c4))
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE

create type string_ntt as


table of varchar2(4000)
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Collections

Default
Constructor
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE

create type string_ntt as


table of varchar2(4000)

select
string_ntt('John','Paul','George','Ringo') beatles
from dual;

BEATLES
----------------------------------------------
STRING_NTT('John', 'Paul', 'George', 'Ringo')
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE

create type string_ntt as


table of varchar2(4000)

select
c.*,
cardinality(set(string_ntt(c1,c2,c3,c4)))
from country_test c;

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')
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Collections

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

Oren Nakdimon
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 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')

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')
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Collections

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

Oren Nakdimon
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 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')

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 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Collections

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

Oren Nakdimon
COLLECTION UNNESTING

select *
from
table(string_ntt('John','Paul','George','Ringo'));

COLUMN_VALUE
---------------------
John
Paul
George
Ringo
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
create type integer_ntt as table of integer

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

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

Oren Nakdimon
Collections

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

Oren Nakdimon
create type integer_ntt as table of integer

> 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.


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

Oren Nakdimon
create type integer_ntt as table of integer

> 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.


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

Oren Nakdimon
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 ,
cardinality(column_value) num_of_elements,
column_value combination
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;

ID NUM_OF_ELEMENTS COMBINATION
---------- --------------- --------------------------------------------------------------
1 1 INTEGER_NTT(1)
2 1 INTEGER_NTT(2)
3 2 INTEGER_NTT(1, 2)
4 1 INTEGER_NTT(3)
5 2 INTEGER_NTT(1, 3)
6 2 INTEGER_NTT(2, 3)
7 3 INTEGER_NTT(1, 2, 3)
...
508 7 INTEGER_NTT(3, 4, 5, 6, 7, 8, 9)
509 8 INTEGER_NTT(1, 3, 4, 5, 6, 7, 8, 9)
510 8 INTEGER_NTT(2, 3, 4, 5, 6, 7, 8, 9)
511 9 INTEGER_NTT(1, 2, 3, 4, 5, 6, 7, 8, 9)

511 rows selected.

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
break on x on num_of_elements skip 1

select sum(b.column_value) x,
a.num_of_elements,
select a.*,b.column_value
from (select rownum id ,
cardinality(column_value) num_of_elements,
column_value combination
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;

ID NUM_OF_ELEMENTS COMBINATION COLUMN_VALUE


---------- --------------- -------------------- ------------
1 1 INTEGER_NTT(1) 1
2 1 INTEGER_NTT(2) 2
3 2 INTEGER_NTT(1, 2) 1
3 2 INTEGER_NTT(1, 2) 2 1+2=3
4 1 INTEGER_NTT(3) 3
5 2 INTEGER_NTT(1, 3) 1
5 2 INTEGER_NTT(1, 3) 3
6 2 INTEGER_NTT(2, 3) 2
6 2 INTEGER_NTT(2, 3) 3
7 3 INTEGER_NTT(1, 2, 3) 1
7
7
3 INTEGER_NTT(1, 2, 3)
3 INTEGER_NTT(1, 2, 3)
2
3
1+2+3=6
...

2304 rows selected.

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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 ,
cardinality(column_value) num_of_elements,
column_value combination
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 X NUM_OF_ELEMENTS EXPR


---------- --------------- ---------- ---------- --------------- --------------------
3 2 1+2 41 7 2+4+5+6+7+8+9

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

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

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

7 2 1+6 45 9 1+2+3+4+5+6+7+8+9
2+5
3+4 502 rows selected.
3 1+2+4

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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 ,
cardinality(column_value) num_of_elements,
column_value combination
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 X NUM_OF_ELEMENTS EXPR


---------- --------------- ---------- ---------- --------------- --------------------
3 2 1+2 41 7 2+4+5+6+7+8+9

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

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

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

7 2 1+6 45 9 1+2+3+4+5+6+7+8+9
2+5
3+4 502 rows selected.
3 1+2+4

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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 ,
cardinality(column_value) num_of_elements,
column_value combination
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 X NUM_OF_ELEMENTS EXPR


---------- --------------- ---------- ---------- --------------- --------------------
3 2 1+2 41 7 2+4+5+6+7+8+9

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

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

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

7 2 1+6 45 9 1+2+3+4+5+6+7+8+9
2+5
3+4 502 rows selected.
3 1+2+4

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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 ,
cardinality(column_value) num_of_elements,
column_value combination
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 X NUM_OF_ELEMENTS EXPR


---------- --------------- ---------- ---------- --------------- --------------------
3 2 1+2 41 7 2+4+5+6+7+8+9

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

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

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

7 2 1+6 45 9 1+2+3+4+5+6+7+8+9
2+5
3+4 502 rows selected.
3 1+2+4

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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 ,
cardinality(column_value) num_of_elements,
column_value combination
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 X NUM_OF_ELEMENTS EXPR


---------- --------------- ---------- ---------- --------------- --------------------
3 2 1+2 41 7 2+4+5+6+7+8+9

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

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

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

7 2 1+6 45 9 1+2+3+4+5+6+7+8+9
2+5
3+4 502 rows selected.
3 1+2+4

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PIVOT
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
break on x skip 1

select * from (
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 ,
cardinality(column_value) num_of_elements,
column_value combination
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
)
pivot (listagg(expr, chr(10)) within group (order by expr)
for num_of_elements in(2,3,4,5,6,7,8,9));

X 2 3 4 5 6 7 8 9
-- ---- ------ -------- ---------- ------------ -------------- ---------------- ---------
3 1+2

4 1+3

5 1+4
2+3

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
pivot (listagg(expr, chr(10)) within group (order by expr)
for num_of_elements in(2,3,4,5,6,7,8,9));

X 2 3 4 5 6 7 8 9
-- ---- ------ -------- ---------- ------------ -------------- ---------------- ---------
3 1+2

4 1+3

5 1+4
2+3

6 1+5 1+2+3
2+4

21 4+8+9 1+3+8+9 1+2+3+6+9 1+2+3+4+5+6


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

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

45 1+2+3+4+

http://db-oriented.com/2016/06/10/kakuro-helper-using-sql-query-with-the-powermultiset-function/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Recursive
Subquery
Factoring
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
RECURSIVE SUBQUERY FACTORING
with fib(x,f) as ( anchor member
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;
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
RECURSIVE SUBQUERY FACTORING
with fib(x,f) as ( anchor member
select 1 as x, 1 as f from dual
union all recursive member
select f, x+f from fib where x+f <= &n
)
select f
from fib;
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
RECURSIVE SUBQUERY FACTORING
with fib(x,f) as ( anchor member
select 1 as x, 1 as f from dual
union all recursive member
select f, x+f from fib where x+f <= &n
)
Enter value for n: 121
select f
from fib;
F
----------
1
2
3
5
8
13
21
34
55
89

10 rows selected.
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Pattern
Matching
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
THE MOST BASIC SQL
Row-levelvisibility
Maximum one output row per input row

WHERE clause
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PATTERN MATCHING
Enhanced analysis of row sequences
Match-based output
One row per match (similar to the group by concept)
or
All the matchs input rows (similar to the window concept)
Each
input row may belong to 0, 1 or more
matches
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PATTERN MATCHING
Zeckendorf's theorem
Every positive integer can be represented uniquely as the sum of distinct
non-consecutive Fibonacci numbers, and this representation can be found by
using a greedy algorithm, choosing the largest possible Fibonacci number at
each stage.

6=5+1 17 = 13 + 3 + 1 34 = 34 122 = 89 + 21 + 8 + 3 + 1

http://marogel.wordpress.com/2015/05/22/a-greedy-algorithm-using-recursive-subquery-factoring/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PATTERN MATCHING
with fib(x,f) as (
select 1 as x, 1 as f from dual n = 121
union all
select f, x+f from fib where x+f <= &n
) F
1
select f 2
from fib 3
match_recognize( 5
order by f desc 8
13
all rows per match 21
pattern ((A|{-B-})+) 34
define A as sum(A.f) <= &n 55
) 89

http://marogel.wordpress.com/2015/05/22/a-greedy-algorithm-using-recursive-subquery-factoring/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PATTERN MATCHING
with fib(x,f) as (
select 1 as x, 1 as f from dual n = 121
union all
select f, x+f from fib where x+f <= &n
) F
89
select f 55
from fib 34
match_recognize( 21
order by f desc 13
8
all rows per match 5
pattern ((A|{-B-})+) 3
define A as sum(A.f) <= &n 2
) 1

http://marogel.wordpress.com/2015/05/22/a-greedy-algorithm-using-recursive-subquery-factoring/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PATTERN MATCHING
with fib(x,f) as (
select 1 as x, 1 as f from dual n = 121
union all
select f, x+f from fib where x+f <= &n
) F A
89
select f 55
from fib 34
match_recognize( 21
order by f desc 13
8
all rows per match 5
pattern ((A|{-B-})+) 3
define A as sum(A.f) <= &n 2
) 1

http://marogel.wordpress.com/2015/05/22/a-greedy-algorithm-using-recursive-subquery-factoring/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PATTERN MATCHING
with fib(x,f) as (
select 1 as x, 1 as f from dual n = 121
union all
select f, x+f from fib where x+f <= &n
) F A
89
select f 55
from fib 34
match_recognize( 21
order by f desc 13
8
all rows per match 5
pattern ((A|{-B-})+) 3
define A as sum(A.f) <= &n 2
) 1

http://marogel.wordpress.com/2015/05/22/a-greedy-algorithm-using-recursive-subquery-factoring/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PATTERN MATCHING
with fib(x,f) as (
select 1 as x, 1 as f from dual n = 121
union all
select f, x+f from fib where x+f <= &n
) F A
89
select f 55
from fib 34
match_recognize( 21
order by f desc 13
8
all rows per match 5
pattern ((A|{-B-})+) 3
define A as sum(A.f) <= &n 2
) 1

http://marogel.wordpress.com/2015/05/22/a-greedy-algorithm-using-recursive-subquery-factoring/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PATTERN MATCHING
with fib(x,f) as (
select 1 as x, 1 as f from dual n = 121
union all
select f, x+f from fib where x+f <= &n
) F A
89
select f 21
from fib 8
match_recognize( 3
order by f desc
all rows per match
pattern ((A|{-B-})+)
define A as sum(A.f) <= &n
)

http://marogel.wordpress.com/2015/05/22/a-greedy-algorithm-using-recursive-subquery-factoring/
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Oracle
Locator
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
stops.txt

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

insert into user_sdo_geom_metadata


(table_name,column_name,diminfo,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);
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
CREATE TABLE STOPS_EXT (stop_id varchar2(20),
stop_code varchar2(20),
stop_name varchar2(100),
stop_desc varchar2(100),
stop_lat number,
stop_lon number,
location_type number(1),
parent_location varchar2(20),
zone_id 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 ',' optionally enclosed by '"'
missing field values are null
reject rows with all null fields
)
LOCATION ('stops.txt')
)
REJECT LIMIT UNLIMITED;
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
insert /*+ append */ into stops (
stop_id,
stop_code,
stop_name,
stop_location)
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
from stops_ext;
commit;
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
External
Tables
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
insert /*+ append */ into stops (
stop_id,
stop_code,
stop_name,
stop_location)
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
from stops_ext;
commit;

create index stops_location_idx


on stops (stop_location)
indextype is mdsys.spatial_index
parameters ('layer_gtype=POINT');
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
(34.863356, 32.101307)
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
SELECT s.stop_code,
s.stop_name,
s.stop_location.sdo_point.x longitude,
All the stops
s.stop_location.sdo_point.y latitude within 500
FROM stops s
WHERE sdo_within_distance(
meters
s.stop_location,
sdo_geometry(2001,8307,
sdo_point_type(34.863356, 32.101307, NULL), NULL, NULL),
'distance=500 unit=meter') = 'TRUE';
STOP_CODE STOP_NAME LONGITUDE LATITUDE
---------- -------------------------------- --------- ---------
33080 / 34.860736 32.097785
30990 / 34.858287 32.101256
35378 34.86375 32.104148
31424 / 34.863596 32.105353
38334 / 34.867824 32.10336
38143 / 34.86262 32.096893
32172 / 34.864442 32.097726
32231 / 34.866672 32.098263

8 rows selected.

Elapsed: 00:00:00.13

------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 275 | 16775 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | STOPS | 275 | 16775 | 3 (0)| 00:00:01 |
|* 2 | DOMAIN INDEX (SEL: 0.100000 %)| STOPS_LOCATION_IDX | | | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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(34.863356, 32.101307, NULL), NULL, NULL),
'distance=500 unit=meter') = 'TRUE';
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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(34.863356, 32.101307, NULL), NULL, NULL),
'distance=500 unit=meter') = 'TRUE';
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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(34.863356, 32.101307, NULL), NULL, NULL),
'distance=500 unit=meter') = 'TRUE';

MULTIPOINT ((34.866672 32.098263), (34.864442 32.097726), (34.86262


32.096893), (34.867824 32.10336), (34.863596 32.105353), (34.86375
32.104148), (34.858287 32.101256), (34.860736 32.097785))
This presentation is available in http://db-oriented.com/presentations
MULTIPOINT ((34.866672 32.098263), (34.864442 32.097726), (34.86262

Oren Nakdimon
32.096893), (34.867824 32.10336), (34.863596 32.105353), (34.86375
32.104148), (34.858287 32.101256), (34.860736 32.097785))
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
SELECT s.stop_code,
s.stop_name,
s.stop_location.sdo_point.x longitude, 3 nearest
s.stop_location.sdo_point.y latitude
FROM stops s stops
WHERE sdo_nn(
s.stop_location,
sdo_geometry(2001,8307,
sdo_point_type(34.863356, 32.101307, NULL), NULL, NULL),
'sdo_num_res=3') = 'TRUE';

STOP_CODE STOP_NAME LONGITUDE LATITUDE


---------- ----------------------- --------- ----------
35378 34.86375 32.104148
32172 / 34.864442 32.097726
31424 / 34.863596 32.105353

3 rows selected.

Elapsed: 00:00:00.21

------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 28 | 1708 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | STOPS | 28 | 1708 | 3 (0)| 00:00:01 |
|* 2 | DOMAIN INDEX (SEL: 0.100000 %)| STOPS_LOCATION_IDX | | | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
SELECT round(sdo_nn_distance(1)) dist_meters,
s.stop_code,
s.stop_name
3 nearest
FROM stops s stops + their
WHERE sdo_nn(
s.stop_location,
distance
sdo_geometry(2001,8307,
sdo_point_type(34.863356, 32.101307, NULL), NULL, NULL),
'sdo_num_res=3',1) = 'TRUE'
order by dist_meters;

DIST_METERS STOP_CODE STOP_NAME


----------- ---------- ---------------------------------------------------------------------------
317 35378
410 32172 /
449 31424 /

3 rows selected.

Elapsed: 00:00:00.06
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
COUNTRIES AND POLYGONS
> desc countries
Name Null? Type
----------------------------- -------- --------------------
COUNTRY_ID NUMBER
COUNTRY_NAME VARCHAR2(100)
POLYGON MDSYS.SDO_GEOMETRY
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
WHICH COUNTRY CONTAINS OUR POINT?
select c.country_name
from countries c
where sdo_relate(
c.polygon,
sdo_geometry(2001,8307,
sdo_point_type(34.863356, 32.101307, NULL), NULL, NULL),
'mask=contains') = 'TRUE';

COUNTRY_NAME
----------------------------
Israel

1 row selected.

Elapsed: 00:00:00.03

---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 48 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | COUNTRIES | 2 | 48 | 2 (0)| 00:00:01 |
|* 2 | DOMAIN INDEX (SEL: 0.100000 %)| COUNTRIES_POLYGON_IDX | | | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Online
Operations
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
ONLINE DDL OPERATIONS
Offline Operations Online Operations
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
ONLINE DDL OPERATIONS
Offline Operations Online Operations
Get ORA-54 due to active Wait for active transactions to
transactions end
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
ONLINE DDL OPERATIONS
Offline Operations Online Operations
Get ORA-54 due to active Wait for active transactions to
transactions end
Block new DML statements Do not block new DML
statements
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
THE KEYWORD ONLINE
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]
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
ONLINE OPERATIONS
12c
ALTER INDEX INVISIBLE
ALTER INDEX VISIBLE
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Invisible
Indexes
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
INVISIBLE INDEXES
Maintained by DML
Invisible to the optimizer
Unless optimizer_use_invisible_indexes is true
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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


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

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
DDL_LOCK_TIMEOUT
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
ALMOST ONLINE OPERATIONS
> alter session set ddl_lock_timeout=2;

Session altered.

> drop index t_idx;

Index dropped.

Elapsed: 00:00:00.95
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
ALMOST ONLINE OPERATIONS
ALTER TABLE ADD CONSTRAINT
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Online
Operations

ENABLE
NOVALIDATE
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
ALMOST ONLINE OPERATIONS
ALTER TABLE ADD CONSTRAINT

ALTER TABLE ADD CONSTRAINT ENABLE NOVALIDATE


ALTER TABLE ENABLE VALIDATE CONSTRAINT
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
INDEX REBUILD?
index on T(CREATION_TIME)

select from T where CREATION_TIME between


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

Oren Nakdimon
Index
Coalesce
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
INDEX REBUILD?
index on T(CREATION_TIME)

select from T where CREATION_TIME between


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

Oren Nakdimon
INDEX REBUILD?
index on T(CREATION_TIME)

select from T where CREATION_TIME between


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

Oren Nakdimon
Edition
Based
Redefinition
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
My Schema

procedure p is
Edition1 Procedure P begin
-- do something
end p;

Edition2 Procedure P
create or replace
procedure p as
begin
-- do something else
end p;
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
My Schema

Procedure Function View


Edition1 P F V

Edition2
Procedure
P
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
My Schema

Procedure Function View


Edition1 P F V

Edition2
Procedure
P

Function Package
Edition3
F PKG
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
My Schema

procedure p is
Procedure
Edition1 ...
P
select name
into ...
from people Table
... PEOPLE
- id
- name
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
My Schema

procedure p is
Procedure
Edition1 ...
P
select name
into ...
from people Table
Edition2 ... PEOPLE
- id
- name
- first_name
procedure p is - last_name
Procedure ...
Edition3 P
select
first_name,
last_name
into ...
from people
...
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
select name
into ...
from people My Schema

Editioning
Procedure View
Edition1 P PEOPLE

create editioning view people Table


Edition2 as select id, name PEOPLE$T
- id
from people$t - name
- first_name
Editioning - last_name
Procedure View
Edition3
P PEOPLE

select
create editioning view people
first_name, last_name
into ... as select id, first_name, last_name
from people from people$t
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
I LOVE EBR BECAUSE
Itenables 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
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
Partition
Views
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PARTITION VIEWS

alter table drop partition T1 drop table

T2
create or replace view

T3

alter table add partition T4 create table


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

Oren Nakdimon
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'
This presentation is available in http://db-oriented.com/presentations
select event_type_id,count(*)

Oren Nakdimon
from events
PARTITION VIEWS
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'))
This presentation is available in http://db-oriented.com/presentations
select count(details)

Oren Nakdimon
from events
PARTITION VIEWS
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'))
This presentation is available in http://db-oriented.com/presentations
select count(details)

Oren Nakdimon
from events
PARTITION VIEWS
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'))
This presentation is available in http://db-oriented.com/presentations
select count(details)

Oren Nakdimon
from events
PARTITION VIEWS
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)
This presentation is available in http://db-oriented.com/presentations

Oren Nakdimon
PARTITION VIEWS
Its
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
THANK YOU

Oren Nakdimon
www.db-oriented.com
oren@db-oriented.com
+972-54-4393763
@DBoriented