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

Oren Nakdimon
Oren NakdimonDatabase Expert at Moovit
Oh Really?
I Didn’t Know it is Supported in
Standard Edition
Oren Nakdimon
www.db-oriented.com
 oren@db-oriented.com
 +972-54-4393763
@DBoriented
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
@DBORIENTED
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
HTTP://DB-ORIENTED.COM
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Oracle Advanced
Analytics
is supported
only in
Enterprise Edition
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Analytic
Functions
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
SQL
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Aggregate
Functions
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
select department_id,
MIN(salary)
from employees
group by department_id;
DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
30 119Karen Colmenares 2500.00
30 118Guy Himuro 2600.00
30 117Sigal Tobias 2800.00
30 116Shelli Baida 2900.00
30 115Alexander Khoo 3100.00
30 114Den Raphaely 11000.00
60 107Diana Lorentz 4200.00
60 106Valli Pataballa 4800.00
60 105David Austin 4800.00
60 104Bruce Ernst 6000.00
60 103Alexander Hunold 9000.00
90 101Neena Kochhar 17000.00
90 102Lex De Haan 17000.00
90 100Steven King 24000.00
DEPARTMENT_ID MIN(SALARY)
30 2500.00
60 4200.00
90 17000.00
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
THE FIRST FUNCTION
DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
30 119Karen Colmenares 2500.00
30 118Guy Himuro 2600.00
30 117Sigal Tobias 2800.00
30 116Shelli Baida 2900.00
30 115Alexander Khoo 3100.00
30 114Den Raphaely 11000.00
60 107Diana Lorentz 4200.00
60 106Valli Pataballa 4800.00
60 105David Austin 4800.00
60 104Bruce Ernst 6000.00
60 103Alexander Hunold 9000.00
90 101Neena Kochhar 17000.00
90 102Lex De Haan 17000.00
90 100Steven 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)…
30Karen
60Diana
90Lex
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
THE LAST FUNCTION
DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
30 119Karen Colmenares 2500.00
30 118Guy Himuro 2600.00
30 117Sigal Tobias 2800.00
30 116Shelli Baida 2900.00
30 115Alexander Khoo 3100.00
30 114Den Raphaely 11000.00
60 107Diana Lorentz 4200.00
60 106Valli Pataballa 4800.00
60 105David Austin 4800.00
60 104Bruce Ernst 6000.00
60 103Alexander Hunold 9000.00
90 101Neena Kochhar 17000.00
90 102Lex De Haan 17000.00
90 100Steven 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)…
30Den
60Alexander
90Steven
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
©OrenNakdimon
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
©OrenNakdimon
Collections
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
©OrenNakdimon
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
©OrenNakdimon
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))
);
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
©OrenNakdimon
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')
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
©OrenNakdimon
> 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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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/
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Pattern
Matching
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
THE MOST BASIC SQL
 Row-level visibility
 Maximum one output row per input row
 WHERE clause
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
©OrenNakdimon
 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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
 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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Oracle Spatial Option
is supported
only in
Enterprise Edition
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Oracle
Locator
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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);
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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;
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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;
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
External
Tables
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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');
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
(-1.910312, 52.478861)
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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))
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
MULTIPOINT ((-1.91159 52.47736), (-1.90855 52.47859), (-1.9079 52.47869),
(-1.90808 52.47886), (-1.91157 52.47958))
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
CITIES AND POLYGONS
> desc cities
Name Null? Type
----------------------------- -------- --------------------
CITY_ID NUMBER
CITY_NAME VARCHAR2(100)
POLYGON MDSYS.SDO_GEOMETRY
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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';
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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';
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
“Online DDl OperatiOns
Are supported
only in
enterprise eDitiOn”
Many
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Some
Online
Operations
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
ONLINE DDL OPERATIONS
Offline Operations Online Operations
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
ONLINE DDL OPERATIONS
Offline Operations Online Operations
Get ORA-54 due to active
transactions
Wait for active transactions to
end
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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]
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
ONLINE OPERATIONS
 12c
 ALTER INDEX … INVISIBLE
 ALTER INDEX … VISIBLE
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Invisible
Indexes
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
“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
©OrenNakdimon
“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
©OrenNakdimon
“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
©OrenNakdimon
“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
©OrenNakdimon
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(...);
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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);
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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;
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Online index REBUILD
IS supported
only in
Enterprise Edition
But do I really
need to rebuild
indexes?
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
INDEX REBUILD?
index on T(CREATION_TIME)
select … from T where CREATION_TIME between …
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Index
Coalesce
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
INDEX REBUILD?
index on T(CREATION_TIME)
select … from T where CREATION_TIME between …
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
INDEX REBUILD?
index on T(CREATION_TIME)
select … from T where CREATION_TIME between …
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
ONLINE APPLICATION UPGRADE?
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Edition
Based
Redefinition
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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;
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Procedure
P
My Schema
Edition1
Edition2
Function
F
Procedure
P
View
V
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Procedure
P
My Schema
Edition1
Edition2
Function
F
Procedure
P
View
V
Edition3
Function
F
Package
PKG
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Procedure
P
My Schema
Edition1
procedure p is
...
select name
into ...
from people
...
Table
PEOPLE
- id
- name
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Procedure
P
My Schema
Edition1
Edition2
Edition3
Procedure
P
procedure p is
...
select name
into ...
from people
...
Table
PEOPLE
- id
- name
- first_name
- last_nameprocedure p is
...
select
first_name,
last_name
into ...
from people
...
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
The Partitioning Option
is supported
only in
Enterprise Edition
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
Partition
Views
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
PARTITION VIEWS
T1
T2
T3
T4alter table add partition create table
create or replace view
drop tablealter table drop partition
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
©OrenNakdimon
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'))
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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'))
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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'))
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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)
This presentation is available in http://db-oriented.com/presentations
©OrenNakdimon
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
THANK YOU
Oren Nakdimon
www.db-oriented.com
 oren@db-oriented.com
 +972-54-4393763
@DBoriented
1 of 91

Recommended

Write Less (code) With More (Oracle Database 12c New Features) by
Write Less (code) With More (Oracle Database 12c New Features)Write Less (code) With More (Oracle Database 12c New Features)
Write Less (code) With More (Oracle Database 12c New Features)Oren Nakdimon
2.5K views50 slides
Constraint Optimization by
Constraint OptimizationConstraint Optimization
Constraint OptimizationOren Nakdimon
1.4K views106 slides
Oracle Inter-Session Communication by
Oracle Inter-Session CommunicationOracle Inter-Session Communication
Oracle Inter-Session CommunicationOren Nakdimon
971 views60 slides
The Features That (maybe) You Didn't Know About by
The Features That (maybe) You Didn't Know AboutThe Features That (maybe) You Didn't Know About
The Features That (maybe) You Didn't Know AboutOren Nakdimon
2.8K views123 slides
Indexes and Indexing in Oracle 12c by
Indexes and Indexing in Oracle 12cIndexes and Indexing in Oracle 12c
Indexes and Indexing in Oracle 12cOren Nakdimon
3.1K views29 slides
How to upgrade your application with no downtime (using edition-based redefin... by
How to upgrade your application with no downtime (using edition-based redefin...How to upgrade your application with no downtime (using edition-based redefin...
How to upgrade your application with no downtime (using edition-based redefin...Oren Nakdimon
2.7K views52 slides

More Related Content

What's hot

Agile Database Development with JSON by
Agile Database Development with JSONAgile Database Development with JSON
Agile Database Development with JSONChris Saxon
33.2K views112 slides
06 Using More Package Concepts by
06 Using More Package Concepts06 Using More Package Concepts
06 Using More Package Conceptsrehaniltifat
1.4K views27 slides
Meg bernal insight2014 4219 by
Meg bernal insight2014 4219Meg bernal insight2014 4219
Meg bernal insight2014 4219Peter Schouboe
423 views20 slides
MODELS'16 - RESTalk by
MODELS'16 - RESTalkMODELS'16 - RESTalk
MODELS'16 - RESTalkAna Ivanchikj
496 views42 slides
New PLSQL in Oracle Database 12c by
New PLSQL in Oracle Database 12cNew PLSQL in Oracle Database 12c
New PLSQL in Oracle Database 12cConnor McDonald
152 views68 slides
Oracle PLSQL Step By Step Guide by
Oracle PLSQL Step By Step GuideOracle PLSQL Step By Step Guide
Oracle PLSQL Step By Step GuideSrinimf-Slides
4.2K views44 slides

What's hot(20)

Agile Database Development with JSON by Chris Saxon
Agile Database Development with JSONAgile Database Development with JSON
Agile Database Development with JSON
Chris Saxon33.2K views
06 Using More Package Concepts by rehaniltifat
06 Using More Package Concepts06 Using More Package Concepts
06 Using More Package Concepts
rehaniltifat1.4K views
New PLSQL in Oracle Database 12c by Connor McDonald
New PLSQL in Oracle Database 12cNew PLSQL in Oracle Database 12c
New PLSQL in Oracle Database 12c
Connor McDonald152 views
Oracle PLSQL Step By Step Guide by Srinimf-Slides
Oracle PLSQL Step By Step GuideOracle PLSQL Step By Step Guide
Oracle PLSQL Step By Step Guide
Srinimf-Slides 4.2K views
Oracle 11g new features for developers by Scott Wesley
Oracle 11g new features for developersOracle 11g new features for developers
Oracle 11g new features for developers
Scott Wesley4.3K views
Sql Objects And PL/SQL by Gary Myers
Sql Objects And PL/SQLSql Objects And PL/SQL
Sql Objects And PL/SQL
Gary Myers1.2K views
Why You Should Use TAPIs by Jeffrey Kemp
Why You Should Use TAPIsWhy You Should Use TAPIs
Why You Should Use TAPIs
Jeffrey Kemp4K views
PL/SQL Fundamentals I by Nick Buytaert
PL/SQL Fundamentals IPL/SQL Fundamentals I
PL/SQL Fundamentals I
Nick Buytaert16.8K views
Polymorphic Table Functions in SQL by Chris Saxon
Polymorphic Table Functions in SQLPolymorphic Table Functions in SQL
Polymorphic Table Functions in SQL
Chris Saxon2.5K views
Oracle Baisc Tutorial by bunny0143
Oracle Baisc TutorialOracle Baisc Tutorial
Oracle Baisc Tutorial
bunny0143629 views
Open Gurukul Language PL/SQL by Open Gurukul
Open Gurukul Language PL/SQLOpen Gurukul Language PL/SQL
Open Gurukul Language PL/SQL
Open Gurukul2.7K views
Procedure and Functions in pl/sql by Ñirmal Tatiwal
Procedure and Functions in pl/sqlProcedure and Functions in pl/sql
Procedure and Functions in pl/sql
Ñirmal Tatiwal6.5K views
Controlling execution plans 2014 by Enkitec
Controlling execution plans   2014Controlling execution plans   2014
Controlling execution plans 2014
Enkitec1.6K views
JAX-RS and CDI Bike the (Reactive) Bridge by José Paumard
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
José Paumard1.2K views
IEEE Day 2013 Oracle Database 12c: new features for developers by Ramin Orujov
IEEE Day 2013 Oracle Database 12c: new features for developersIEEE Day 2013 Oracle Database 12c: new features for developers
IEEE Day 2013 Oracle Database 12c: new features for developers
Ramin Orujov2.7K views

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

Sangam 2019 - The Latest Features by
Sangam 2019 - The Latest FeaturesSangam 2019 - The Latest Features
Sangam 2019 - The Latest FeaturesConnor McDonald
127 views241 slides
KScope19 - SQL Features by
KScope19 - SQL FeaturesKScope19 - SQL Features
KScope19 - SQL FeaturesConnor McDonald
127 views213 slides
OpenWorld 2018 - Common Application Developer Disasters by
OpenWorld 2018 - Common Application Developer DisastersOpenWorld 2018 - Common Application Developer Disasters
OpenWorld 2018 - Common Application Developer DisastersConnor McDonald
324 views229 slides
OpenWorld Sep14 12c for_developers by
OpenWorld Sep14 12c for_developersOpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersConnor McDonald
1.8K views416 slides
The Five Best Things To Happen To SQL by
The Five Best Things To Happen To SQLThe Five Best Things To Happen To SQL
The Five Best Things To Happen To SQLConnor McDonald
83 views75 slides
Oracle Database 12c Application Development by
Oracle Database 12c Application DevelopmentOracle Database 12c Application Development
Oracle Database 12c Application DevelopmentSaurabh K. Gupta
843 views14 slides

Similar to Oren nakdimon oh really... i didn't know it is supported in standard edition(20)

Sangam 2019 - The Latest Features by Connor McDonald
Sangam 2019 - The Latest FeaturesSangam 2019 - The Latest Features
Sangam 2019 - The Latest Features
Connor McDonald127 views
OpenWorld 2018 - Common Application Developer Disasters by Connor McDonald
OpenWorld 2018 - Common Application Developer DisastersOpenWorld 2018 - Common Application Developer Disasters
OpenWorld 2018 - Common Application Developer Disasters
Connor McDonald324 views
OpenWorld Sep14 12c for_developers by Connor McDonald
OpenWorld Sep14 12c for_developersOpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developers
Connor McDonald1.8K views
The Five Best Things To Happen To SQL by Connor McDonald
The Five Best Things To Happen To SQLThe Five Best Things To Happen To SQL
The Five Best Things To Happen To SQL
Connor McDonald83 views
Oracle Database 12c Application Development by Saurabh K. Gupta
Oracle Database 12c Application DevelopmentOracle Database 12c Application Development
Oracle Database 12c Application Development
Saurabh K. Gupta843 views
Riyaj: why optimizer_hates_my_sql_2010 by Riyaj Shamsudeen
Riyaj: why optimizer_hates_my_sql_2010Riyaj: why optimizer_hates_my_sql_2010
Riyaj: why optimizer_hates_my_sql_2010
Riyaj Shamsudeen548 views
Latin America Tour 2019 - 10 great sql features by Connor McDonald
Latin America Tour 2019  - 10 great sql featuresLatin America Tour 2019  - 10 great sql features
Latin America Tour 2019 - 10 great sql features
Connor McDonald126 views
SQL techniques for faster applications by Connor McDonald
SQL techniques for faster applicationsSQL techniques for faster applications
SQL techniques for faster applications
Connor McDonald51 views
Embedded R Execution using SQL by Brendan Tierney
Embedded R Execution using SQLEmbedded R Execution using SQL
Embedded R Execution using SQL
Brendan Tierney3.7K views
5asm the stackandsubroutines by Rabi Iftikhar
5asm the stackandsubroutines5asm the stackandsubroutines
5asm the stackandsubroutines
Rabi Iftikhar270 views
02 - Introduction to the cdecl ABI and the x86 stack by Alexandre Moneger
02 - Introduction to the cdecl ABI and the x86 stack02 - Introduction to the cdecl ABI and the x86 stack
02 - Introduction to the cdecl ABI and the x86 stack
Alexandre Moneger938 views
Demystifying cost based optimization by Riyaj Shamsudeen
Demystifying cost based optimizationDemystifying cost based optimization
Demystifying cost based optimization
Riyaj Shamsudeen550 views
New SQL features in latest MySQL releases by Georgi Sotirov
New SQL features in latest MySQL releasesNew SQL features in latest MySQL releases
New SQL features in latest MySQL releases
Georgi Sotirov286 views

Recently uploaded

Network Source of Truth and Infrastructure as Code revisited by
Network Source of Truth and Infrastructure as Code revisitedNetwork Source of Truth and Infrastructure as Code revisited
Network Source of Truth and Infrastructure as Code revisitedNetwork Automation Forum
32 views45 slides
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...ShapeBlue
40 views25 slides
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R... by
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...ShapeBlue
37 views15 slides
Business Analyst Series 2023 - Week 3 Session 5 by
Business Analyst Series 2023 -  Week 3 Session 5Business Analyst Series 2023 -  Week 3 Session 5
Business Analyst Series 2023 - Week 3 Session 5DianaGray10
345 views20 slides
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc
72 views29 slides
Data Integrity for Banking and Financial Services by
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial ServicesPrecisely
29 views26 slides

Recently uploaded(20)

Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by ShapeBlue
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
ShapeBlue40 views
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R... by ShapeBlue
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
ShapeBlue37 views
Business Analyst Series 2023 - Week 3 Session 5 by DianaGray10
Business Analyst Series 2023 -  Week 3 Session 5Business Analyst Series 2023 -  Week 3 Session 5
Business Analyst Series 2023 - Week 3 Session 5
DianaGray10345 views
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by TrustArc
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc72 views
Data Integrity for Banking and Financial Services by Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely29 views
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava... by ShapeBlue
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
ShapeBlue28 views
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by ShapeBlue
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
ShapeBlue54 views
NTGapps NTG LowCode Platform by Mustafa Kuğu
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform
Mustafa Kuğu28 views
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue by ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueMigrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
ShapeBlue71 views
Business Analyst Series 2023 - Week 4 Session 7 by DianaGray10
Business Analyst Series 2023 -  Week 4 Session 7Business Analyst Series 2023 -  Week 4 Session 7
Business Analyst Series 2023 - Week 4 Session 7
DianaGray1042 views
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online by ShapeBlue
KVM Security Groups Under the Hood - Wido den Hollander - Your.OnlineKVM Security Groups Under the Hood - Wido den Hollander - Your.Online
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online
ShapeBlue75 views
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
ShapeBlue26 views
PharoJS - Zürich Smalltalk Group Meetup November 2023 by Noury Bouraqadi
PharoJS - Zürich Smalltalk Group Meetup November 2023PharoJS - Zürich Smalltalk Group Meetup November 2023
PharoJS - Zürich Smalltalk Group Meetup November 2023
Noury Bouraqadi139 views
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive by Network Automation Forum
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive
"Surviving highload with Node.js", Andrii Shumada by Fwdays
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada
Fwdays33 views

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

  • 1. Oh Really? I Didn’t Know it is Supported in Standard Edition Oren Nakdimon www.db-oriented.com  oren@db-oriented.com  +972-54-4393763 @DBoriented
  • 2. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon
  • 3. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon
  • 4. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 5. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon @DBORIENTED
  • 6. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon HTTP://DB-ORIENTED.COM
  • 7. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 8. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Oracle Advanced Analytics is supported only in Enterprise Edition
  • 9. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Analytic Functions
  • 10. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon SQL
  • 11. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Aggregate Functions
  • 12. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon select department_id, MIN(salary) from employees group by department_id; DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY 30 119Karen Colmenares 2500.00 30 118Guy Himuro 2600.00 30 117Sigal Tobias 2800.00 30 116Shelli Baida 2900.00 30 115Alexander Khoo 3100.00 30 114Den Raphaely 11000.00 60 107Diana Lorentz 4200.00 60 106Valli Pataballa 4800.00 60 105David Austin 4800.00 60 104Bruce Ernst 6000.00 60 103Alexander Hunold 9000.00 90 101Neena Kochhar 17000.00 90 102Lex De Haan 17000.00 90 100Steven King 24000.00 DEPARTMENT_ID MIN(SALARY) 30 2500.00 60 4200.00 90 17000.00
  • 13. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon THE FIRST FUNCTION DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY 30 119Karen Colmenares 2500.00 30 118Guy Himuro 2600.00 30 117Sigal Tobias 2800.00 30 116Shelli Baida 2900.00 30 115Alexander Khoo 3100.00 30 114Den Raphaely 11000.00 60 107Diana Lorentz 4200.00 60 106Valli Pataballa 4800.00 60 105David Austin 4800.00 60 104Bruce Ernst 6000.00 60 103Alexander Hunold 9000.00 90 101Neena Kochhar 17000.00 90 102Lex De Haan 17000.00 90 100Steven 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)… 30Karen 60Diana 90Lex
  • 14. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon THE LAST FUNCTION DEPARTMENT_ID EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY 30 119Karen Colmenares 2500.00 30 118Guy Himuro 2600.00 30 117Sigal Tobias 2800.00 30 116Shelli Baida 2900.00 30 115Alexander Khoo 3100.00 30 114Den Raphaely 11000.00 60 107Diana Lorentz 4200.00 60 106Valli Pataballa 4800.00 60 105David Austin 4800.00 60 104Bruce Ernst 6000.00 60 103Alexander Hunold 9000.00 90 101Neena Kochhar 17000.00 90 102Lex De Haan 17000.00 90 100Steven 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)… 30Den 60Alexander 90Steven
  • 15. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 16. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 17. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Collections
  • 18. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 19. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 20. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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)) );
  • 21. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon DISTINCT COUNT OF A VALUE ACROSS COLUMNS IN A TABLE create type string_ntt as table of varchar2(4000)
  • 22. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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')
  • 23. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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/
  • 24. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon > 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
  • 25. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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/
  • 26. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Pattern Matching
  • 27. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon THE MOST BASIC SQL  Row-level visibility  Maximum one output row per input row  WHERE clause
  • 28. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 29. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon  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
  • 30. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon  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
  • 31. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 32. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 33. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 34. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Oracle Spatial Option is supported only in Enterprise Edition
  • 35. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Oracle Locator
  • 36. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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);
  • 37. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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;
  • 38. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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;
  • 39. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon External Tables
  • 40. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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');
  • 41. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon (-1.910312, 52.478861)
  • 42. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 43. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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))
  • 44. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon MULTIPOINT ((-1.91159 52.47736), (-1.90855 52.47859), (-1.9079 52.47869), (-1.90808 52.47886), (-1.91157 52.47958))
  • 45. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 46. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 47. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon CITIES AND POLYGONS > desc cities Name Null? Type ----------------------------- -------- -------------------- CITY_ID NUMBER CITY_NAME VARCHAR2(100) POLYGON MDSYS.SDO_GEOMETRY
  • 48. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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';
  • 49. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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';
  • 50. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon “Online DDl OperatiOns Are supported only in enterprise eDitiOn” Many
  • 51. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Some Online Operations
  • 52. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon ONLINE DDL OPERATIONS Offline Operations Online Operations
  • 53. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon ONLINE DDL OPERATIONS Offline Operations Online Operations Get ORA-54 due to active transactions Wait for active transactions to end
  • 54. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 55. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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]
  • 56. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon ONLINE OPERATIONS  12c  ALTER INDEX … INVISIBLE  ALTER INDEX … VISIBLE
  • 57. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Invisible Indexes
  • 58. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 59. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 60. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon “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
  • 61. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon “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
  • 62. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon “ALMOST ONLINE” OPERATIONS > alter session set ddl_lock_timeout=2; Session altered. > drop index t_idx; Index dropped. Elapsed: 00:00:00.95
  • 63. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon “ALMOST ONLINE” OPERATIONS ALTER TABLE ADD CONSTRAINT ALTER TABLE ADD CONSTRAINT ENABLE NOVALIDATE ALTER TABLE ENABLE VALIDATE CONSTRAINT
  • 64. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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(...);
  • 65. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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);
  • 66. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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;
  • 67. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Online index REBUILD IS supported only in Enterprise Edition But do I really need to rebuild indexes?
  • 68. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon INDEX REBUILD? index on T(CREATION_TIME) select … from T where CREATION_TIME between …
  • 69. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Index Coalesce
  • 70. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon INDEX REBUILD? index on T(CREATION_TIME) select … from T where CREATION_TIME between …
  • 71. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon INDEX REBUILD? index on T(CREATION_TIME) select … from T where CREATION_TIME between …
  • 72. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon ONLINE APPLICATION UPGRADE?
  • 73. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Edition Based Redefinition
  • 74. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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;
  • 75. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Procedure P My Schema Edition1 Edition2 Function F Procedure P View V
  • 76. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Procedure P My Schema Edition1 Edition2 Function F Procedure P View V Edition3 Function F Package PKG
  • 77. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Procedure P My Schema Edition1 procedure p is ... select name into ... from people ... Table PEOPLE - id - name
  • 78. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Procedure P My Schema Edition1 Edition2 Edition3 Procedure P procedure p is ... select name into ... from people ... Table PEOPLE - id - name - first_name - last_nameprocedure p is ... select first_name, last_name into ... from people ...
  • 79. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 80. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 81. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 82. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon The Partitioning Option is supported only in Enterprise Edition
  • 83. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon Partition Views
  • 84. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon PARTITION VIEWS T1 T2 T3 T4alter table add partition create table create or replace view drop tablealter table drop partition
  • 85. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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'
  • 86. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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'))
  • 87. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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'))
  • 88. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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'))
  • 89. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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)
  • 90. This presentation is available in http://db-oriented.com/presentations ©OrenNakdimon 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
  • 91. THANK YOU Oren Nakdimon www.db-oriented.com  oren@db-oriented.com  +972-54-4393763 @DBoriented