DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some...

177
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Last Updated June 2017 – Version 12 Getting deep inside the SQL pattern matching process in Database 12c DEEP DIVE INTO 12c MATCH_RECOGNIZE @ASQLBarista oracle-big-data.blogspot.com

Transcript of DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some...

Page 1: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LastUpdatedJune2017–Version12

GettingdeepinsidetheSQLpatternmatchingprocessinDatabase12c

DEEPDIVEINTO12cMATCH_RECOGNIZE

–@ASQLBarista

–oracle-big-data.blogspot.com

Page 2: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

WhoAmI

• KeithLaker• SeniorPrincipalProductManager,AnalyticSQL• Oracle

• Twitter:@ASQLBarista• Blog:http://oracle-big-data.blogspot.com• Email:[email protected]

2

Page 3: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Purposeofthispresentationisto……

Makeyousuccessfulwith12cpatternmatching

3

Page 4: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Agenda

SQLPatternMatching–quickrecap

Usingbuilt-inmeasurestounderstandyourpattern

Greedyvs.reluctantquantifiers

Outputs:ALLROWSvs.ONEROW

Outputs:Unmatchedvs.emptymatches

SKIPtowhereexactly?

Preparingtorunaquery

1

2

3

4

5

6

7

12

Predicates:how,whereandwhen

Minimizingnumberofsorts

Understandingstatemachines

StatemachinesandtheOptimizer

Whatisbacktracking?

Recommendationsfortesting

Summary

8

9

10

11

14

13

4

Page 5: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

AppleiBook+PDF• Introduction• Usecases• Yourfirstsimplepattern

– SyntaxofMATCH_RECOGNIZE– Gettingstarted– FoundationsofMATCH_RECOGNIZE– Goingalittledeeper– SearchingforV-shapedpatterns– Listingyouroutputcolumns

AvailableshortlyviaOTNAnalyticSQLpageandiBookStore5

Page 6: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

AppleiBook+PDF• Introductionandrecap• Usingbuilt-inmeasures• Greedyvs.reluctantquantifiers• Emptymatchesandunmatchedrows

• Skiptowhere?• Statemachinesandbacktracking• Runningaquery

– explainplans,MVs,usingpredicates…

AvailableshortlyviaOTNAnalyticSQLpageandiBookStore6

Page 7: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 7

QuickrecapBackground

Page 8: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

MysampleTICKERdataset

8

0

8

15

23

30

2-Apr-15 4-Apr-15 6-Apr-15 8-Apr-15 10-Apr-15 12-Apr-15 14-Apr-15 16-Apr-15 18-Apr-15 20-Apr-15

ACMEGLOBEXOSCORP

Page 9: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Tutorialsforeachsectiononlivesql.us.oracle.com

9

http://livesql.oracle.comisaCOMPLETELYFREEservicethatgivesyouaccesstotheverylatestversionofOracleDatabase

Sampleschemasarepreloaded,youcanaddyourowntables,writeyourownscripts,saveyourscripts,runtutorialsetc

Page 10: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 10

QuickoverviewofMATCH_RECOGNIZEsyntax

RECAP:UsingMATCH_RECOGNIZEforPatternMatching

Page 11: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

FindingVshapedpatternsinatickerstreamdataset

SELECT symbol, tstamp, price, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

11

Usingnew12cMATCH_RECOGNIZEtosearchforpatterns

NewMATCH_RECGONIZEclausewithtableTICKERasinput

Page 12: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Overviewof12cMATCH_RECOGNIZEsyntax

SELECT symbol, tstamp, price, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

12

Partitioningandorderingyourdata

Orderedandpartitionedstreamofrows

Page 13: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Overviewof12cMATCH_RECOGNIZEsyntax

SELECT symbol, tstamp, price, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

13

Describingyourpattern

Variablenamesandoperators

Orderedandpartitionedstreamofrows

Page 14: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Overviewof12cMATCH_RECOGNIZEsyntax

SELECT symbol, tstamp, price, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

14

Definingyourpattern

Orderedandpartitionedstreamofrows

Variablenamesandoperators

Variabledefinition

Page 15: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Overviewof12cMATCH_RECOGNIZEsyntax

SELECT symbol, tstamp, price, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

15

DefiningvaluestoreturntoSELECTstatement

Orderedandpartitionedstreamofrows

Measures

Variablenamesandoperators

Variabledefinition

Page 16: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Overviewof12cMATCH_RECOGNIZEsyntax

SELECT symbol, tstamp, price, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

16

DetermininghowmuchdetailtoreturntoSELECTstatement

Controllingoutput:levelofdetail

Page 17: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

GettingConsistentResults• ORDERBYclauseisoptionalinsyntax(andANSIproposal)

• MydataisalreadysortedsoIdon’tneedORDERBY-correct?– TemptingtoignoreORDERBYclauseandassumedatawillbecorrectlyordered–WithoutORDERBY,consistentresultsarenotguaranteed!

• AlwaysincludeORDERBYclause– IforderoftworowsinapartitionisnotdeterminedbyORDERBYresults(non-uniqueorderbykey),theresultwillbenon-deterministic

– Ifyouhavenonuniqueorderbykeyswithinpartition,consideraddingadditionalorderbycolumnstomakeorderbyuniqueanddeterministic

– IfOraclecansuppresstheorderbythenitwilldoso!

17

Page 18: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

MostquerieswilluseONE ROW PER MATCHsyntax….SELECT symbol, start_tstamp, end_tstamp, match_numFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(down.tstamp) AS start_tstamp, LAST(up.tstamp) AS end_tstamp, match_number() AS match_num ONE ROW PER MATCH PATTERN (STRT DOWN+ UP+) DEFINE DOWN AS (price <= PREV(price)), UP AS (price >= PREV(price)))WHERE symbol = ’OSCORP’;

18

Page 19: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

…whichproducesasummaryreport

Notveryusefulforshowinghowyourpatternisbeingmatchedasrowsareprocessed.Howdoyoudebugapatternmatchingquery?

Allowsuseofbuilt-inmeasures:MATCH_NUMBER()andCLASSIFIER()19

Page 20: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

OtherquerieswilluseALL ROWS PER MATCHsyntax….SELECT symbol, tstamp, price, start_tstamp, end_tstamp, match_num, classifierFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(down.tstamp) AS start_tstamp, LAST(up.tstamp) AS end_tstamp, MATCH_NUMBER() AS match_num, CLASSIFIER() AS classifier ALL ROWS PER MATCH WITH UNMATCHED ROWS PATTERN (DOWN+ UP+) DEFINE DOWN AS (price <= PREV(price)), UP AS (price >= PREV(price)))WHERE symbol = ’GLOBEX’;

20

NOTE:ALWAYSTRUESTRTvariablehasbeenremoved,checkstartingdateforpatterncomparedwithreportonpreviouspage

Page 21: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

…whichproducesamoredetailedreport

Moreusefulforshowinghowyourpatternisbeingmatchedsoperfectfordebuggingapatternmatchingquery.

AllowsadditionalmeasuressuchasCLASSIFIER()andMATCH_NUMBER()toprovidemorefeedback

21

Page 22: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

…moredetailedreportshowmatchedrowsand…

MATCHEDrows

22

Page 23: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

…moredetailedreportalsoshowsunmatchedrows

UNMATCHEDrows

23

Page 24: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 24

Howtodetermineifyouneedanalwaystruepatternvariable

RECAP:ALWAYSTRUEvariables

Page 25: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

DoYouNeedAnALWAYSTRUEPatternVariable?• Someexamplesonlivesql.oracle.comuseALWAYSTRUEpatternvariable

– e.gsearchingforV-shapedpatternsintickerdata…

PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price))

NOTE:thereisnodefinitionforSTRTwithinDEFINEclause• WhatisthepointofanALWAYSTRUEevent?

– Needtocapturecaptureastartingrowtoenableacomparisontest.i.e>=PREV()– WithoutALWAYSTRUEpatternvariablematchwillprobablystart1rowlaterthanexpected

25

Page 26: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

SearchingForV-PatternwithALWAYSTRUEPatternVariableSELECT symbol, tstamp, price, start_tstamp, end_tstamp, match_num, classifierFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(down.tstamp) AS start_tstamp, LAST(up.tstamp) AS end_tstamp, MATCH_NUMBER() AS match_num, CLASSIFIER() AS classifier ALL ROWS PER MATCH WITH UNMATCHED ROWS PATTERN (STRT DOWN+ UP+) DEFINE DOWN AS (price <= PREV(price)), UP AS (price >= PREV(price)))WHERE symbol = ’GLOBEX’;

26

Page 27: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

PatternStartsMatchingV-PatternatRow3

27

Notethatthepatternstartsonrow3

Row1:matchedtoSTRT

Row2:price12isgreaterthanprice11,Row1-DOWNcannotbematched.Patternfails.

RestartmatchingatRow2:Row2:matchedtoSTRT

Row3:price13isgreaterthanprice12,Row2-DOWNcannotbematched.Patternfails.

RestartmatchingatRow3:Row3:matchedtoSTRT

Row4:price12islessthanprice13,Row3-DOWNismatched.Patterncontinues…

continuesmatchingV-patternuptorow15

1

2

3

4

5

6

Page 28: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

SearchingForV-PatternwithoutALWAYSTRUEPatternVariableSELECT symbol, tstamp, price, start_tstamp, end_tstamp, match_num, classifierFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(down.tstamp) AS start_tstamp, LAST(up.tstamp) AS end_tstamp, MATCH_NUMBER() AS match_num, CLASSIFIER() AS classifier ALL ROWS PER MATCH WITH UNMATCHED ROWS PATTERN (DOWN+ UP+) DEFINE DOWN AS (price <= PREV(price)), UP AS (price >= PREV(price)))WHERE symbol = ’GLOBEX’;

28

NOTE:ALWAYSTRUESTRTvariablehasbeenremoved,checkstartingdateforpatterncomparedwithreportonpreviouspage

Page 29: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

PatternNowStartsMatchingV-PatternatRow4

29

Notethatthepatternnowstartsonrow4

Row1:previousrowisnotvalid-DOWNcannotbematched

Row2:price12isgreaterthanprice11,Row1-DOWNcannotbematched

Row3:price13isgreaterthanprice12,Row2-DOWNcannotbematched

Row4:price12islessthanprice13,Row3-DOWNismatched

ContinuesmatchingV-patternuptorow15

1

2

3

4

Page 30: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 30

Usingbuilt-indebuggingtoolstohelpyouunderstandthepatternmatchingprocess

MATCH_NUMBER()CLASSIFIER()

Built-inMeasures

Page 31: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Twokeybuilt-inmeasurestohelpwithdebugging1. MATCH_NUMBER()

– Returnsanintegertoshowwhichrowsaremembersofwhichmatch– Assignsthesamenumbertoeachrowofaspecificmatch– Forinstance,alltherowsinthefirstmatchfoundinarowpatternpartitionareassignedthematchnumbervalueof1

– Notethatmatchnumberingstartsoveragainat1ineachrowpatternpartition

1. CLASSIFIER()– Showswhichrowsmaptowhichvariable

31

Page 32: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Examplecodeusingtwobuilt-inmeasures

SELECT symbol, tstamp, price, mn, pattern, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES MATCH_NUMBER() AS mn, CLASSIFIER() as pattern, FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

32

FindingVshapedpatternsinatickerstream

Page 33: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

1.MATCH_NUMBER()• MATCH_NUMBERassignsthesamenumbertoeachrowofaspecificmatch– Firstmatchofcompletepatternfoundinapartitionassignedmatch_number()valueof1

– Nextmatchgetsvalueof2,etc.

• Notethatmatchnumberingstartsoveragainat1ineachrowpatternpartition

33

PART

ITION

1PA

RTITION

2

Page 34: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

2.CLASSIFIER()• CLASSIFIER()showswhichrowsmaptowhichvariable:STRT,DOWNorUP

• Inthisexample,– rows1,7,11,15maptovariableSTRT– Rows2,8,12,16maptovariableDOWN– remainingrowsmaptovariableUP

34

Page 35: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

What’stheimpactofusingONEROWPERMATCH?SELECT symbol, tstamp, price, mn, pat, first_down, first_price, last_up,last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES price as price, tstamp as tstamp, MATCH_NUMBER() AS mn, CLASSIFIER() as pat, FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ONE ROW PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

35

Page 36: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

What’stheimpactofusingONEROWPERMATCH?

36

Note:CLASSIFER()canbeusedwithONE ROW PER MATCHButonlylastpatternvariableisreturned(inthiscaseUP)-sonotreallyveryuseful

Page 37: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingaggregateswithCLASSIFIER()SELECT symbol, tstamp, price, mn, pat, first_down, first_price, last_up,last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES price as price, tstamp as tstamp, MATCH_NUMBER() AS mn, FIRST(CLASSIFIER()) as f_pat, LAST(CLASSIFIER()) as l_pat FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, FINAL LAST(up.tstamp) AS last_up, FINAL LAST(up.price) as last_price ONE ROW PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))ORDER BY symbol, tstamp;

37

Page 38: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingaggregateswithCLASSIFIER()

ORA-62507: illegal use of MATCH_NUMBER or CLASSIFIER in MATCH_RECOGNIZE clause

62507. 00000 - "illegal use of MATCH_NUMBER or CLASSIFIER in MATCH_RECOGNIZE clause"*Cause: An attempt was made to use MATCH_NUMBER or CLASSIFIER in the MATCH_RECOGNIZE clause. CLASSIFIER and MATCH_NUMBER can only be used in the MEASURES clause. CLASSIFIER can only be used if the query is ALL ROWS PER MATCH. CLASSIFIER and MATCH_NUMBER cannot be used inside aggregates/FIRST/LAST/PREV/NEXT.

*Action: Modify the query and retry the operation.

38

Note-notactuallytrue.Onlythelastpatternvariablethatismappedisshownintheoutput!

Page 39: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

CanIuseMATCH_NUMBERinDEFINEClause?

• Shortansweris:Yes• Longansweris:Itdepends…• Followingispossible:

PATTERN (STRT DOWN+ UP+) DEFINE DOWN AS (price <= PREV(price) and match_number() = 1), UP AS (price >= PREV(price))

39

Page 40: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingMATCH_NUMBER()=1

40

Page 41: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

CanIuseMATCH_NUMBERinDEFINEClause?• Followingispossiblebutdoesnotfindanymatches:

PATTERN (STRT DOWN+ UP+) DEFINE DOWN AS (price <= PREV(price) and match_number() = 2), UP AS (price >= PREV(price))

41

Page 42: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingMATCH_NUMBER()=2->Norowsreturned

42

Page 43: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

CanYouStopSearchingAfterN’thMatch?• Canyoustopsearchingafterthefirstorsecondorn’thmatch?

AfteramatchisfoundIwouldlikematch_recognizetostopsearching-Iwantatmostonematchperpartition.Idon’twanttofilterbyMATCH_NUMBER()inanouterquery-thatistoowasteful(or,insomecases,Imayknowinadvancethatthereisatmostonematchperpartition,andIdon’twantmatch_recognizetowastetimesearchingformorematcheswhichIknowdon'texist).

• CanMATCH_RECOGNIZEdothisusingMATCH_NUMBER?–Shortansweris:NO.–Longansweris:StillNO.

43

Page 44: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Thefullresultsetwithnofiltering• WanttouseMATCH_RECOGNIZEtoonlyreturnthefirstmatchwithineachpartition– Rowsboundedbyredboxesshouldnotappearintheoutput

• CanMATCH_RECOGNIZEdothisusingMATCH_NUMBER?–Shortansweris:NO.–Longansweris:StillNO.

44

Page 45: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

WillThisQueryStopAfter1stMatch?SELECT symbol,tstamp, price, match_number, classifier, first_x, last_yFROM tickerMATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(x.tstamp) AS first_x, LAST(y.tstamp) AS last_y, MATCH_NUMBER() AS match_number, CLASSIFIER() AS classifier ALL ROWS PER MATCH WITH UNMATCHED ROWS AFTER MATCH SKIP PAST LAST ROW PATTERN (strt X+ Y) DEFINE X AS (price <= PREV(price)), Y AS (price >= PREV(price)))WHERE match_number = 1ORDER BY symbol, match_number, tstamp asc;

45

Page 46: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LooksPromising….onlyfirstmatchisreturnedforeachsymbol

46

Page 47: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

BUThavewesavedanyprocessing?• Thatistosay:didMATCH_RECOGNIZEstopsearchingformatchesafterthefirstmatchwasfound?

NO!• Checkingtheexplainplanwecanseethatall60rowsfromourtablewhereprocessed:

47

Page 48: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

GoingDeeper,ALotDeeperThereisalotmoreinformationonthistopicinthefollowingblogpost:• BlogPost…MATCH_RECOGNIZE:CanIuseMATCH_NUMBER()asafilter?

• https://oracle-big-data.blogspot.co.uk/2017/03/matchrecognize-can-i-use-matchnumber-as.html

48

Page 49: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 49

Usinggreedyandreluctantquantifiersinyourpatterndefinition

GreedyQuantifiers

Page 50: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

DefiningPATTERNs• PATTERN componentisusedtospecifyregularexpressions• Regularexpressionisbuiltfromvariablenamesandoperators

–Operatorscanbeconcatenation,grouping,alternation,permutes,quantifiers,…– Alargelibraryofbuilt-onquantifiersisavailable– Regularexpressionsareamazinglypowerfulanddeeplyexpressive

• Whatisaregularexpression?– aregularexpression(sometimescalledarationalexpression)isasequenceofcharactersthatdefineasearchpattern,mainlyforuseinpatternmatchingwithstrings,orstringmatching,i.e."findandreplace”-likeoperations

50

Wikipedia:https://en.wikipedia.org/wiki/Regular_expression

Page 51: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Whatisaregularexpression?• Regularexpressionsusedtospecifyasetofstrings(tokensandquantifiers)requiredforaparticularpurpose

• Quantifierafteratokenorgroupspecifieshowoftenthatprecedingelementisallowedtooccur

• Mostcommonquantifiersare:–Questionmark,indicateszerooronematch– Asterisk,indicatesneedforzeroormorematches– Plussign,indicatesneedforoneormorematches

• Oracle'sregularexpressionsareslightlydifferent– RowpatternvariablesaredefinedbyBooleanconditionsratherthancharactersorsetsofcharacters

51

Page 52: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Quantifiersusedin PATTERN clause

• POSIX basic and extended quantifiers:

– * 0 or more matches – + 1 or more matches – ? 0 or 1 match – {n} exactly n matches – {n,} n or more matches – {n, m} at least n but not more than m (inclusive) matches – {, m} at most m (inclusive) matches

52

Page 53: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Howtousequantifiers

• The following are examples of using quantifiers: – A? matches 0 or 1 iteration of variable A – A* matches 0 or more iterations of variable A – A+ matches 1 or more iterations of variable A – A{3,6} matches 3 to 6 iterations of variable A – A{,4} matches 0 to 4 iterations of variable A

• A is defined in the DEFINE component of the MATCH_RECOGNIZE clause – For example: A AS (price <= PREV(price))

53

Page 54: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

• Pattern quantifiers are referred to as greedy – Attempt to match as many instances as possible of the regular expression on

which they are applied

• Reluctant quantifiers use a question mark ? as additional suffix – Attempt to match as few instances as possible of the regular expression on

which they are applied

• Convert greedy to reluctant quantifier by adding additional “?” – Examples: ?? or *? or +? or {n, m }?

Greedyandreluctantquantifiers

54

Page 55: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Example–usinggreedyquantifiers

SELECT symbol, tstamp, price, mn, pattern, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES MATCH_NUMBER() AS mn, CLASSIFIER() as pattern, FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, LAST(up.tstamp) AS last_up, LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+ up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))WHERE symbol = 'ACME’ORDER BY symbol, tstamp;

55

FindingVshapedpatternsinatickerstreamusingplus-signgreedyquantifier

Usingthe“+”greedyquantifier

Page 56: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Usinggreedyquantifiers

56

MatchingtovariableDOWNtakesprecedenceoverUPonrow130

8

15

23

30

Conflict:horizontalareacouldbemappedto

DOWNorUP

Result:GreedyDOWNmatchesasmany

instancespossibletoDOWNbeforematchingto

UP

Page 57: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Example-usingareluctantquantifier

SELECT symbol, tstamp, price, mn, pattern, first_down, first_price, last_up, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES MATCH_NUMBER() AS mn, CLASSIFIER() as pattern, FIRST(strt.tstamp) AS first_down, FIRST(strt.price) as first_price, LAST(up.tstamp) AS last_up, LAST(up.price) as last_price ALL ROWS PER MATCH PATTERN (strt down+? up+) DEFINE down AS (price <= PREV(price)), up AS (price >= PREV(price)))WHERE symbol = 'ACME’ORDER BY symbol, tstamp;

57

Usingquestion-marktoindicatereluctantquantifier

WhathappensifDOWNuses?tomakequantifier

‘reluctant’...

Page 58: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Usingareluctantquantifiers

58

MatchingtovariableUPtakesprecedenceoverDOWNonrow130

8

15

23

30

RecordsmatchestoUPbeforeconsidering

reluctantDOWNagainafterhavingfoundonematchofDOWNalready(pattern

satisfied)

Page 59: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 59

Returningonlytherowsyouareinterestedin...withemptymatchesvs.omitemptymatchesvs.unmatchedrowsvs.!

OUTPUT:ONEROWvs.ALLROWS...

Page 60: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

MostquerieswilluseONE ROW PER MATCHsyntax….SELECT symbol, start_tstamp, end_tstamp, match_numFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(down.tstamp) AS start_tstamp, LAST(up.tstamp) AS end_tstamp, match_number() AS match_num ONE ROW PER MATCH PATTERN (STRT DOWN+ UP+) DEFINE DOWN AS (price <= PREV(price)), UP AS (price >= PREV(price)))WHERE symbol = ’OSCORP’;

60

Page 61: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

…whichproducesasummaryreport

Notveryusefulforshowinghowyourpatternisbeingmatchedasrowsareprocessed.Howdoyoudebugapatternmatchingquery?

Allowsuseofbuilt-inmeasures:MATCH_NUMBER()andCLASSIFIER()61

Page 62: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

OtherquerieswilluseALL ROWS PER MATCHsyntax….SELECT symbol, tstamp, price, start_tstamp, end_tstamp, match_num, classifierFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(down.tstamp) AS start_tstamp, LAST(up.tstamp) AS end_tstamp, MATCH_NUMBER() AS match_num, CLASSIFIER() AS classifier ALL ROWS PER MATCH WITH UNMATCHED ROWS PATTERN (DOWN+ UP+) DEFINE DOWN AS (price <= PREV(price)), UP AS (price >= PREV(price)))WHERE symbol = ’GLOBEX’;

62

Page 63: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

…whichproducesamoredetailedreport

Moreusefulforshowinghowyourpatternisbeingmatchedsoperfectfordebuggingapatternmatchingquery.

AllowsadditionalmeasuressuchasCLASSIFIER()andMATCH_NUMBER()toprovidemorefeedback

63

Page 64: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 64

Whatisthedifferencebetweenanunmatchedrowandanemptymatch?

OUPTUT:EMPTYvs.UNMATCHEDROWS

Page 65: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

EmptyMatchesvs.UnmatchedRowsTwooutputoptionsforMATCH_RECOGNIZE• ONEROWPERMATCH:eachmatchproducesonesummaryrow.Thisisthedefault.

• ALLROWSPERMATCH:amatchspanningmultiplerowswillproduceoneoutputrowforeachrowinthematch– ALLROWSPERMATCHSHOWEMPTYMATCHES<-notethatthisisthedefault– ALLROWSPERMATCHOMITEMPTYMATCHES– ALLROWSPERMATCHWITHUNMATCHEDROWS

65

Page 66: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

EmptyMatchesvs.UnmatchedRowsHowdoyougetan“emptymatch”?• Determinedbythetypeofquantifierusedaspartofthepatterndefinition

– Currentlypossibletogetemptymatcheswithoutquantifiers• usingapatternlikePATTERN(^|A)

– Possibletogetunmatchedrowswithoutusingquantifiers

• Bychangingthequantifieritispossibletoproducethesimilarresultusingbothsetsofkeywords:

– ALLROWSPERMATCHSHOWEMPTYMATCHES<-notethatthisisthedefault– ALLROWSPERMATCHWITHUNMATCHEDROWS

66

Page 67: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

EmptyMatchesSELECT. . .FROM ticker MATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES FIRST(down.tstamp),            LAST(down.tstamp),            match_number() AS match_num,            classifier() AS classifier   ALL ROWS PER MATCH SHOW EMPTY MATCHES   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

67

Emptymatches:classifierisNULLeventhoughmatch_number()returnsavalue

Page 68: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Whatisanemptymatch?• Emptymatchisarowthatdoesnotmapexplicitlytoapatternvariable

– inpreviousexample–DOWN

• Usuallyresultofusingspecificquantifier:*(asterisk).– GiventhatDOWNvariablecanbematchedzeroormoretimesthereisopportunityforanemptymatchtooccur.

• Emptymatchdoesinfacthaveastartingrow– itisassignedasequentialmatchnumber,basedontheordinalpositionofitsstartingrow

68

Page 69: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

EmptyMatchesandMATCH_NUMBERSELECT. . .FROM ticker MATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES FIRST(down.tstamp),            LAST(down.tstamp),            match_number() AS match_num,            classifier() AS classifier   ALL ROWS PER MATCH OMIT EMPTY MATCHES   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

69

Notethatmatch_numberisnotcontiguous

Page 70: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

ImpactofEmptyMatchesonAnalyticsSELECT *FROM tickerMATCH_RECOGNIZE (PARTITION BY symbol ORDER BY tstampMEASURES FIRST(down.tstamp) AS start_time, LAST(down.tstamp) AS end_time, COUNT(*) AS counter_all, avg(down.price) as avg_price, MATCH_NUMBER() as mn, CLASSIFIER() as patALL ROWS PER MATCH SHOW EMPTY MATCHESPATTERN (DOWN*) DEFINE DOWN AS (price <= PREV(price)))WHERE symbol = 'GLOBEX';

70

NotethatCOUNTandAVGonlyfunctionwhereCLASSIFIERreturnsavalue

Page 71: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

SummaryofEmptyMatchesThreemainspointstorememberwhenyourpatternpermitsthistypeofmatching:1. ValueofMATCH_NUMBER()issequentialmatchnumberoftheemptymatch2. AnyCOUNTorsimilarfunction(MAX,MIN,AVGetc.)willreturn03. Anyotheraggregate,rowpatternnavigationoperation,orordinaryrowpatterncolumn

referenceisnull

• Thedefaultisalwaystoreturnemptymatches– Determinefromstarthowyouwanttomanagetheserows:

• includethem(SHOWEMPTYMATCHES)• excludethem(OMITEMPTYMATCHES).

– BecarefulifyouareusingMATCH_NUMBER()withintheDEFINEsectionaspartofaformulabecauseemptymatchesincrementtheMATCH_NUMBER()counter.

71

Page 72: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

ViewingUnmatchedRows• Alwaysusefultoviewthecompleteresultset

– atleastwhenyouarerunningyourcodeagainsttestdatasets.

• Gettingalltheinputrowsintoyouroutputisrelativelyeasybecauseyoujustneedtoincludethephrase:– ALLROWSPERMATCHWITHUNMATCHEDROWS.

• OtherthanfortestingpurposesIcan’tthinkofagoodusecaseforusingthisinproductionsomakesureyoucheckyourcodebeforesubmittingyourproduction-readycodetoyourDBA.

72

Page 73: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

RECAP:Quantifiersusedin PATTERN clause

• POSIX basic and extended quantifiers:

– * 0 or more matches – + 1 or more matches – ? 0 or 1 match – {n} exactly n matches – {n,} n or more matches – {n, m} at least n but not more than m (inclusive) matches – {, m} at most m (inclusive) matches

73

Page 74: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

RECAP:Howtousequantifiers

• The following are examples of using quantifiers: – A? matches 0 or 1 iteration of variable A – A* matches 0 or more iterations of variable A – A+ matches 1 or more iterations of variable A – A{3,6} matches 3 to 6 iterations of variable A – A{,4} matches 0 to 4 iterations of variable A

• A is defined in the DEFINE component of the MATCH_RECOGNIZE clause – For example: A AS (price <= PREV(price))

74

Page 75: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

EmptyMatchesandUnmatchedRowsInSameQuery?SELECT symbol, tstamp, price, mnm, nmr, cls FROM ticker MATCH_RECOGNIZE(  PARTITION BY symbol  ORDER BY tstamp  MEASURES match_number() AS mnm,           count(*) AS nmr,           classifier() AS cls  ALL ROWS PER MATCH SHOW EMPTY MATCHES  PATTERN ((^A*)|A+)  DEFINE A AS price > 11) WHERE symbol = 'GLOBEX' ORDER BY 1, 2;

75

Page 76: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

EmptyMatchesandUnmatchedRowsInSameQuery?SELECT symbol, tstamp, price, mnm, nmr, cls FROM ticker MATCH_RECOGNIZE(  PARTITION BY symbol  ORDER BY tstamp  MEASURES match_number() AS mnm,           count(*) AS nmr,           classifier() AS cls  ALL ROWS PER MATCH OMIT EMPTY MATCHES  PATTERN ((^A*)|A+)  DEFINE A AS price > 11) WHERE symbol = 'GLOBEX' ORDER BY 1, 2;

76

Page 77: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

EmptyMatchesandUnmatchedRowsInSameQuery?

SELECT symbol, tstamp, price, mnm, nmr, cls FROM ticker MATCH_RECOGNIZE(  PARTITION BY symbol  ORDER BY tstamp  MEASURES match_number() AS mnm,           count(*) AS nmr,           classifier() AS cls  ALL ROWS PER MATCH WITH UNMATCHED ROWS  PATTERN ((^A*)|A+)  DEFINE A AS price > 11) WHERE symbol = 'GLOBEX' ORDER BY 1, 2;

77

UnmatchedrowEmptymatch

Page 78: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 78

UsingjustasimpleSELECT*canhavesurprisingresults!

OUTPUT:WHICHCOLUMNSARERETURNED

Page 79: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

NotListingColumnsToBeReturned• SELECT * … isverytemptingbutcanhaveconsequences• Manyexamplesonlivesql.oracle.com,blogsandusergrouppresentationsusingSELECT *syntax

• Recommendyoualwayslistthecolumnstobereturned–Willpreventyourreport/appreturningmorecolumnsthanexpected

• Followingexamplesexplainimpactofnotspecifyingcolumns

79

Page 80: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingSELECT *:NoPARTITIONBY,ORDERBY,MEASURESSELECT *FROM ticker MATCH_RECOGNIZE (   ONE ROW PER MATCH   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

80

ORA-30732: table contains no user-visible columns30732. 00000 - "table contains no user-visible columns"*Cause: An attempt was made to query on a system table which has no user-visible columns.*Action: Do not query on a system table that has no user-visible columns.

Page 81: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingSELECT *:NoPARTITIONBY,ORDERBY,MEASURESSELECT *FROM ticker MATCH_RECOGNIZE (   ALL ROWS PER MATCH   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

Queryreturnsjustcolumnsfromsourcetable(ticker)

Note:resultisinfactwrong!

81

Page 82: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

WhatHappensAfterNewColumnsAddedToSource?• AddnewcolumnstodemotableTICKER

ALTER TABLE TICKER ADD opening_price NUMBER

• NowrunqueriesusingSELECT * …

• Newcolumnisautomaticallyincludedinresultset

82

Page 83: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingSELECT * withPARTITIONBYSELECT *FROM ticker MATCH_RECOGNIZE (   PARTITION BY symbol   ALL ROWS PER MATCH   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

Notedifferentresultcomparedtopreviousslidebutthisresultreliesondatabeingincorrectorder

83

Page 84: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingSELECT * withPARTITIONBYandORDERBYSELECT *FROM ticker MATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   ALL ROWS PER MATCH   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

Notesameresultaspreviousslidebutresultisnowdeterministic

84

Page 85: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingSELECT * withPARTITIONBYandORDERBYSELECT *FROM ticker MATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   ONE ROW PER MATCH   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

OnlyPARTITIONBYcolumnisreturned

85

Page 86: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingSELECT * withALLROWSPERMATCHSELECT *FROM ticker MATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES FIRST(down.tstamp) AS start_tstamp,     LAST(down.tstamp) as end_tstamp,     match_number() AS match_num,     classifier() AS classifier  ALL ROWS PER MATCH   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

86

Noteorderingofcolumns:1) Partitionbycolumn2) Orderbycolumn3) Measurecolumns4) Allothercolumnsfromsourcetable

Page 87: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

UsingSELECT * withONEROWPERMATCHSELECT *FROM ticker MATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES FIRST(down.tstamp) AS start_tstamp,     LAST(down.tstamp) as end_tstamp,     match_number() AS match_num,     classifier() AS classifier  ONE ROW PER MATCH   PATTERN (DOWN*)   DEFINE     DOWN AS (price <= PREV(price)) ) WHERE symbol = 'GLOBEX';

87

Noteorderingofcolumns:1) Partitionbycolumn2) Orderbycolumn3) Measurecolumns

Allothercolumnsfromsourcetableexcluded

Page 88: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Summary:ExplicitlyListRequiredColumns

• DON’TUSESELECT * FROM…• Columnsincludedinoutputwillvaryanddependson:

–Typeofreportoutputspecified:• ALLROWSPERMATCH• ONEROWPERMATCH

–UseofPARTITIONBYandORDERBYclauses–UseofMEASURESclause

• Columnsaddedtosourcetablemaysuddenlyappearinoutputwhichcouldcauseapplicationerrors

88

Page 89: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 89

Wheretostartsearchingforthenextpattern...therearesomanyplacestochoosefrom!

AFTERMATCHSKIPTO...

Page 90: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Skipping-basicsyntax• AFTER MATCH SKIP TO NEXT ROW

– Resumepatternmatchingattherowafterthefirstrowofthecurrentmatch.

• AFTER MATCH SKIP PAST LAST ROW [DEFAULT]– Resumepatternmatchingatthenextrowafterthelastrowofthecurrentmatch.

• AFTER MATCH SKIP TO FIRST pattern_variable– Resumepatternmatchingatthefirstrowthatismappedtothepatternvariable.

• AFTER MATCH SKIP TO LAST pattern_variable– Resumepatternmatchingatthelastrowthatismappedtothepatternvariable.

• AFTER MATCH SKIP TO pattern_variable – ThesameasAFTERMATCHSKIPTOLASTpattern_variable.

90

Page 91: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Match#1Complete:Rows5-10

91

MATCH #1 STARTS HERE

MATCH #1 ENDS HERE

Page 92: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

NEXTROW:RestartSearchingForNextMatchAtRow6

92

• AFTER MATCH SKIP TO NEXT ROW

Scanningfornextmatch

Page 93: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LASTROW:RestartSearchingForNextMatchAtRow11

93

• AFTER MATCH SKIP TO NEXT ROW

• AFTER MATCH SKIP PAST LAST ROW

Scanningfornextmatch

Defaultprocessing

Page 94: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

FIRSTpattern_variable:RestartSearchingForNextMatchAtRow6

94

• AFTER MATCH SKIP TO NEXT ROW

• AFTER MATCH SKIP PAST LAST ROW

• AFTER MATCH SKIP TO FIRST DOWN

Scanningfornextmatch

Page 95: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LASTpattern_variable:RestartSearchingForNextMatchAtRow10

95

• AFTER MATCH SKIP TO NEXT ROW

• AFTER MATCH SKIP PAST LAST ROW

• AFTER MATCH SKIP TO FIRST DOWN

• AFTER MATCH SKIP TO LAST UPScanningfornextmatch

Page 96: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

pattern_variable:RestartSearchingForNextMatchAtRow10

96

• AFTER MATCH SKIP TO NEXT ROW

• AFTER MATCH SKIP PAST LAST ROW

• AFTER MATCH SKIP TO FIRST DOWN

• AFTER MATCH SKIP TO LAST UP

• AFTER MATCH SKIP TO UP

Scanningfornextmatch

Page 97: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Lookingforshapesandcontrollingskipping

97

MultipleOverlappingW-ShapesintheTickerData

Page 98: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LookingformultipleW-shapesusingAFTERMATCHSKIP…

SELECT *FROM Ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES STRT.tstamp AS start_w, LAST(z.tstamp) AS end_w ONE ROW PER MATCH AFTER MATCH SKIP PAST LAST ROW PATTERN (STRT x+ y+ w+ z+)DEFINE x AS x.price <= PREV(x.price), y AS y.price >= PREV(y.price), w AS w.price <= PREV(w.price), z AS z.price >= PREV(z.price) ) MRWHERE symbol='ACME'ORDER BY symbol, MR.start_w;

98

Findingonly1W-shape

Page 99: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LookingformultipleW-shapesusingAFTERMATCHSKIP…

99

Findingonly1W-shape

AFTER MATCH SKIP PAST LAST ROWResumesearchingfornextpatternhere,meanswecan’tfindanothercompleteW-shape

Page 100: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LookingformultipleW-shapesusingAFTERMATCHSKIP…

SELECT *FROM Ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES STRT.tstamp AS start_w,          LAST(z.tstamp) AS end_w ONE ROW PER MATCH AFTER MATCH SKIP TO LAST Y PATTERN (STRT x+ y+ w+ z+)DEFINE  x AS x.price <= PREV(x.price),  y AS y.price >= PREV(y.price),  w AS w.price <= PREV(w.price),  z AS z.price >= PREV(z.price) ) MRWHERE symbol='ACME'ORDER BY symbol, MR.start_w;

100

Finding2W-shapes

Page 101: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

OverlappingW-Shapes–rowsprocessedmultipletimes

101

Finding2w-shapes

Rows10-Apr-11to14-Apr-11areprocessedagainduringsearchforpattern#2

Page 102: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Lookingforshapesandcontrollingskipping

102

MultipleOverlappingW-ShapesintheTickerData

Page 103: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LookingformultipleW-shapesusingAFTERMATCHSKIP…

SELECT *FROM Ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES STRT.tstamp AS start_w,          LAST(z.tstamp) AS end_w ONE ROW PER MATCH AFTER MATCH SKIP TO NEXT ROW PATTERN (STRT x+ y+ w+ z+) DEFINE      x AS x.price <= PREV(x.price),      y AS y.price >= PREV(y.price),      w AS w.price <= PREV(w.price),      z AS z.price >= PREV(z.price)  ) MRWHERE symbol='ACME'ORDER BY symbol, mr.start_w;

103

Finding3W-shapes

Page 104: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

LookingformultipleW-shapesusingAFTERMATCHSKIP…

104

Finding3W-shapes

AFTER MATCH SKIP TO NEXT ROWResumesearchingfornextpatternattherowafterthefirstrowofthecurrentmatch.Therefore,wefind3completeW-shapes

Page 105: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 105

HowdoestheoptimizerpreparetorunaquerycontainingaMATCH_RECOGNIZEclause?

Preparingtorunaquery

Page 106: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

OptimizingMATCH_RECOGNIZE

CostoftheMATCH_RECOGNIZEevaluationisbasedon:1. Costofsortinginputdata

– executionofstatemachinerequiresdataispartitionedandorderedaccordingtothepartitionbyandorderbykeys

– Ifincomingdataisnotcorrectlyorderedthensortingofthedataisneededandsortingcostisadded

2. Costofexecutingthestatemachine– thiscostisaffectedbymanyfactorssuchaspatternregularexpression(andwhetherfinitestatemachineisbuilt),predicatesdefiningvariables,matchoptions,AFTERMATCHSKIPtooption.

106

Costing

Page 107: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

OptimizingMATCH_RECOGNIZE

• Optimizerattemptstoeliminatesortrequestedbyaquerybyselectinganaccessmethodwhichreturnsordereddata– forexampleindexaccessorsort-merge-joinaccess.

• Optimizercompares:1. costoftheoptimalplanitfoundsofarincludingthesortcostand2. costofplanwithorderpreservingaccessmethod– Obviouslyitselectsthecheapestone!

• Ifsortcanbeeliminated,optimizerdoesnotadditscosttothecostofqueryblock.

107

Sortelimination

Page 108: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

OptimizingMATCH_RECOGNIZE

• Calculationaffectedbymanyfactors:– patternregularexpression– variabledefiningconditions– rowspermatchoption+aftermatchskiptooption

• Gettinganaccurateestimateisnotfeasible.– ALLROWSPERMATCH-cardinalityestimatewillbesettothatofrowpatterninputtable

–ONEROWPERMATCH-cardinalityestimatewillbesettoestimateoftotalnumberofdistinctPARTITIONBYvaluesoutrowpatterninputtable

108

CalculatingCardinality

Page 109: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Howarethestandardquerytransformationsimplemented?• ThereareanumberofquerytransformationsthatareaffectedbyMATCH_RECOGIZEsuchas:

109

• ViewMerging• Un-nesting

• Pushingjoinpredicates• Pushingpredicates• Predicatemovearound• Predicatepullup

• Grouppruning• Groupbyplacement• Materializedviewrewrite

Page 110: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Howarethestandardquerytransformationsimplemented?• ViewMerging

– ParserexpandsaMATCH_RECOGNIZEtableexpressionintoaninlineviewqueryblock• MATCH_RECOGNIZEeviewqueryblockinvolvespatternrecognitionevaluationonly

– ViewmergingisdisabledforMATCH_RECOGNIZEviewqueryblock– IfMATCH_RECOGNIZEisappliedonaview,thenmergingofinputviewwithitsouterqueryblock(i.e.MATCH_RECOGNIZEviewqueryblock)isalsodisabled

– BUTnotethat,ifMATCH_RECOGNIZEclauseappliesonaview,thenallthequerytransformationscurrentlyavailablearestillavailablewithinview

• Un-nesting– NotdoneforsubqueriescontainingMATCH_RECOGNIZEclause

110

Page 111: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Howarethestandardquerytransformationsimplemented?• Pushingjoinpredicates

– Similartowindowfunctions,pushingofjoinpredicatesintomatchrecognizeview(cost-based)willbeenabledprovidedjoinkeysareonpartitionbykeys

• Pushingpredicates– Predicateswillbepushedonthepartitionbykeysandwillfilterentirepartitions

• PredicateMoveAround– Predicateswillbeexportedfromtheun-mergeablematchrecognizeviewonlyiftheyareonthepartitionbykeys

111

Page 112: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Howarethestandardquerytransformationsimplemented?• GroupPruningforGroupingSets

– notbeaffectedasaqueryblockcannotcontaingrouping

• GROUPBYplacement– groupbyplacementtransformationwillbedisabledforviewsusingMATCH_RECOGNIZE

• Materializedviewsrewrite– IfMVhasaMATCH_RECOGNIZECLAUSEthenonlyfullorpartialtextmatchrewritewillbesupported

112

Page 113: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

MaterializedViews-somerestrictions• Conventionalfastrefreshwillbedisabled• PCTrefreshisONLYfeasibleandsupportedIF:

–MVandbasetablesarepartitionedandthepartitioningcolumnsareasubsetofthepartition-bykeysofMATCH_RECOGNIZEclause

113

Page 114: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 114

Overview

NewKeywordsinExplainPlans

Page 115: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

NewKeyWordsinExplainPlans• Fournewkeywordsrelatingtopatternmatchingthatwillappearinyourexplainplan:

1. MATCHRECOGNIZE2. SORT3. BUFFER4. DETERMINISTICFINITEAUTO

• Importantkeywordintermsofperformance–deterministicfiniteautostatemachinesdeliverfasterprocessing!

115

Page 116: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 116

PREDICATESWhen,where,howandwhyaretheyappliedwhenusingMATCH_RECOGNIZE?

Page 117: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

WhenexactlyistheWHEREclauseprocessed?

SELECT symbol, first_x, last_z FROM ticker MATCH_RECOGNIZE (  PARTITION BY symbol ORDER BY tstamp  MEASURES FIRST(x.tstamp) AS first_x,           LAST(z.tstamp) AS last_z  ONE ROW PER MATCH  PATTERN (X+ Y+ W+ Z+)  DEFINE X AS (price < PREV(price)),         Y AS (price > PREV(price)),         W AS (price < PREV(price)),         Z AS (price > PREV(price) AND z.tstamp - FIRST(x.tstamp) <= 7 )) WHERE symbol EXISTS ('ACME', 'OSCORP');

117

ApplyingpredicatestoPARTITIONBYcolumn

Page 118: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

ApplyingpredicatestoORDERBYcolumn

SELECT symbol, first_x, last_z FROM ticker MATCH_RECOGNIZE (  PARTITION BY symbol ORDER BY tstamp  MEASURES FIRST(x.tstamp) AS first_x,           LAST(z.tstamp) AS last_z tstamp AS tstamp ONE ROW PER MATCH  PATTERN (X+ Y+ W+ Z+)  DEFINE X AS (price < PREV(price)),         Y AS (price > PREV(price)),         W AS (price < PREV(price)),         Z AS (price > PREV(price) AND z.tstamp - FIRST(x.tstamp) <= 7 )) WHERE symbol IN (‘ACME', 'OSCORP') AND tstamp BETWEEN ’01-Apr-11’ AND ’09-Apr-11’;

118

Page 119: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Applyingpredicatestoothercolumns

SELECT symbol, first_x, last_z FROM ticker MATCH_RECOGNIZE (  PARTITION BY symbol ORDER BY tstamp  MEASURES FIRST(x.tstamp) AS first_x,           LAST(z.tstamp) AS last_z,           tstamp AS tstamp,           price as price  ONE ROW PER MATCH  PATTERN (X+ Y+ W+ Z+)  DEFINE X AS (price < PREV(price)),         Y AS (price > PREV(price)),         W AS (price < PREV(price)),         Z AS (price > PREV(price) AND z.tstamp - FIRST(x.tstamp) <= 7 )) WHERE symbol IN ('ACME', 'OSCORP') AND tstamp BETWEEN ’01-Apr-11' and '09-Apr-11’ AND price > 0;

119

Page 120: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 120

SORTINGWhendoessortinghappenandhowtominimizenumberofsortsinyourexplainplan!

Page 121: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Newkeywordsinexplainplans• Fournewkeywordsrelatingtopatternmatchingthatwillappearinyourexplainplan:

1. MATCHRECOGNIZE

2. SORT

3. BUFFER

4. DETERMINISTICFINITEAUTO

121

Page 122: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Sortvs.Bufferkeywordsinexplainplan• Mostexample/sampleexplainplansshowSORTkeyword

– Indicatesdataissortedduringinitialstageofprocessing

• SORTkeywordreplacedwithBUFFERwhen…– Applyingpredicatesandanindexisavailablethatprovidesthecorrectsortorder– Nopredicatesappliedbutindexavailablethatprovidesthecorrectsortorder

• Createanindexonthecolumnssymbolandtstamp(PARTITIONBYandORDERBYcolumns)

CREATE INDEX ticker_tstamp_idx ON ticker(symbol, tstamp)

122

Page 123: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Sortvs.BufferkeywordsinexplainplanSELECT symbol, first_x, last_z FROM tickerMATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(x.tstamp) AS first_x, LAST(z.tstamp) AS last_z, tstamp AS tstamp, price as price ONE ROW PER MATCH PATTERN (X+ Y+ W+ Z+) DEFINE X AS (price < PREV(price)), Y AS (price > PREV(price)), W AS (price < PREV(price)), Z AS (price > PREV(price) AND z.tstamp - FIRST(x.tstamp) <= 7 ));WHERE symbol IN (‘ACME', 'OSCORP')AND tstamp BETWEEN '01-Apr-11' AND '09-Apr-11')

123

Page 124: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Sortsvs.Buffers

• Usingpredicatestofilteronsymbol• SORTkeywordwithintheMATCH_RECOGNIZElinehasdisappeared• IndexisabletoprovideacorrectlyorderedrowsetintoMATCH_RECOGNIZE• MATCH_RECOGNIZElineisshowingthekeywordBUFFER

– Indicatesnoadditionalsortingisbeingappliedtodataasitflowsintomatchingprocess

124

Page 125: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Sortvs.Bufferkeywordswithnopredicates

125

• Nopredicates-indexwillactuallybeused• MATCH_RECOGNIZEissmartenoughtospotthatindexisusefulandcanprovidetheorderingneededformatchingprocessing– IndexprovidescorrectsortorderandexplainplanswitchestousingBUFFERkeyword

Page 126: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Sortvs.BufferkeywordswithnopredicatesSELECT symbol, first_x, last_z FROM tickerMATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES FIRST(x.tstamp) AS first_x, LAST(z.tstamp) AS last_z, tstamp AS tstamp, price as price ONE ROW PER MATCH PATTERN (X+ Y+ W+ Z+) DEFINE X AS (price < PREV(price)), Y AS (price > PREV(price)), W AS (price < PREV(price)), Z AS (price > PREV(price) AND z.tstamp - FIRST(x.tstamp) <= 7 ));

126

Page 127: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Sortsvs.Bufferswithnopredicates

127

Page 128: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 128

…andwhyyouneedtocareaboutthem!

UnderstandingStateMachines

Page 129: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

MATCH_RECOGNIZEandStateMachines• CompilationphaseofMATCH_RECOGNIZEgeneratesafinitestatemachine• WhatisanFSM?Afinite-statemachine(FSM)…isamathematicalmodelofcomputation....itisconceivedasanabstractmachinethatcanbeinoneofafinitenumberofstates.Themachineisinonlyonestateatatime…changesfromonestatetoanotherwheninitiatedbyatriggeringeventorcondition;thisiscalledatransition.AparticularFSMisdefinedbyalistofitsstates,andthetriggeringconditionforeachtransition.

Referencefromwikipedia-https://en.wikipedia.org/wiki/Finite-state_machine

129

Page 130: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

TurnstileStateMachine

130

• Hastwostates:LockedandUnlocked• Twoeventsaffectitsstate:

– Puttingacoinintheslot(coin)– Pushingthearm(push)

• Lockedstate,pushingonthearmhasnoeffect• PuttingacoininshiftsthestatefromLockedtoUnlocked– Puttingadditionalcoinsinhasnoeffect;

• Pushingthroughthearms,givingapushinput,shiftsthestatebacktoLockedImagescourtesyofwikipedia

Page 131: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

MATCH_RECOGNIZEandStateMachines• StatemachineisconstructedusinginformationinPATTERNandDEFINEcomponents:

• Statemachinerepresentedbyadirectedgraphcalledastatediagram– Eachstateisrepresentedbyanode(circle)– Edges(arrows)showtransitionsfromonestatetoanother.

• Labeledwiththeevent(condition)thattriggerstransition.

– Events(conditions)thatdon'tcauseachangeofstatearerepresentedbyacirculararrowreturningtotheoriginalstate.

131

0Start State1 State3State2

event

eventState4

Precedenceistoreadfromtop->down

eventevent event

Page 132: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

StateMachineforourpattern….• GraphrepresentationofpatterntosearchforV’sinstocktickerdata

• PATTERN(STRTDOWN+?UP+)

– NotetheprecedenceofUPoverDOWNforreluctantquantifierDOWN

132

0Start State1(strt)

State3(up)

State2(down)

down

up

downstrt up

eventprice<=PREV(down.price)

price<=PREV(down.price)

price>=PREV(up.price)price>=PREV(up.price)

stateedge

Page 133: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 133

Reviewofnewpatternmatchingkeywordsintheexplainplan

MATCH_RECOGNIZEandtheOptimizer

Page 134: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Newkeywordsinexplainplans• Fournewkeywordsrelatingtopatternmatchingthatwillappearinyourexplainplan:

1. MATCHRECOGNIZE

2. SORT

3. BUFFER

4. DETERMINISTICFINITEAUTO

134

Page 135: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

MATCH_RECOGNIZEplansbasedonStateMachines• CompilationphaseofMATCH_RECOGNIZEgeneratesafinitestatemachine• DetailsofPATTERNcomponentdetermineifstatemachineis:1. DeterministicFiniteAuto(DFA)

• Eachofitstransitionsisuniquelydeterminedbyitssourcestateandevent• DFAusesanefficientalgorithmwithoutbacktracking,runsinlineartime

2. NondeterministicFiniteAuto(NFA)• NextstateofanNFAdependsnotonlyonthecurrentevent,butalsopossiblyonanarbitrary

numberofsubsequentevents• NFAimplementsbacktracking+otheroptimizationtechniques

135

Page 136: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

MATCH_RECOGNIZEplansbasedonStateMachinesExplainplanindicateswhichalgorithmisused:

136

Page 137: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

BuiltADeterministicFiniteStateMachine…SELECT symbol, start_tstamp, end_tstamp, match_numFROM TickerMATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES STRT.tstamp AS start_tstamp,            LAST(UP.tstamp) AS end_tstamp, match_number() AS match_num   ONE ROW PER MATCH   AFTER MATCH SKIP TO LAST UP   PATTERN (STRT DOWN UP)   DEFINE      DOWN AS price < PREV(price),      UP AS price > PREV(price)) WHERE symbol= ‘ACME’ ;

137

Page 138: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

BuiltADeterministicFiniteStateMachine…

SELECT symbol, start_tstamp, end_tstamp, match_numFROM TickerMATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES strt.tstamp AS start_tstamp,            LAST(down.tstamp) AS b_tstamp,            LAST(up.tstamp) AS e_tstamp   ONE ROW PER MATCH   AFTER MATCH SKIP TO LAST UP   PATTERN (STRT DOWN UP)   DEFINE      down AS price < PREV(price),      up AS price > PREV(price)) WHERE symbol= ‘ACME’ ;

138

Nobacktrackingandrunsinlineartime...

Page 139: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

ManagedtobuildDeterministicFiniteStateMachine…SELECT symbol, start_tstamp, end_tstamp, match_numFROM TickerMATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES STRT.tstamp AS start_tstamp,            LAST(UP.tstamp) AS end_tstamp, match_number() AS match_num   ONE ROW PER MATCH   AFTER MATCH SKIP TO LAST UP   PATTERN (STRT DOWN UP*)   DEFINE      DOWN AS price < PREV(price),      UP AS price > PREV(price)) WHERE symbol= ‘ACME’ ;

139

Page 140: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

BuiltADeterministicFiniteStateMachine…• KeyattributeofaDeterministicFiniteAuto:

1. Eachofitstransitionsisuniquelydeterminedbyitssourcestateandevent PATTERN (STRT DOWN UP*)   DEFINE      DOWN AS price < PREV(price),      UP AS price > PREV(price)

• Therefore,theDFAstatemachineisabletouseanefficientalgorithm(nobacktracking)andrunsinlineartime

140

Page 141: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Didn’tmanagetobuildDeterministicFiniteStateMachine…SELECT symbol, start_tstamp, end_tstamp, match_numFROM TickerMATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES STRT.tstamp AS start_tstamp,            LAST(UP.tstamp) AS end_tstamp,  match_number() AS match_num  ONE ROW PER MATCH   AFTER MATCH SKIP TO LAST UP   PATTERN (STRT DOWN* UP*)   DEFINE      DOWN AS price < PREV(price),      UP AS price > PREV(price)) WHERE symbol= ‘ACME’ ;

141

Page 142: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

CouldNotBuildADeterministicFiniteStateMachine…• KeyreasonwhyitisnotpossibletobuildDeterministicFiniteAutostatemachine:

1. NextstateofanNFAdependsnotonlyonthecurrentevent,butalsopossiblyonanarbitrarynumberofsubsequentevents

PATTERN (STRT DOWN* UP*)DEFINE DOWN AS price < PREV(price),       UP AS price > PREV(price)

• Therefore:1. NFAimplementsbacktracking2. Butotheroptimizationtechniquesimplementedtoensuregoodperformance

142

Page 143: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Non-deterministicstatemachine

SELECT *FROM TickerMATCH_RECOGNIZE (   PARTITION BY symbol ORDER BY tstamp   MEASURES strt.tstamp AS start_tstamp,            LAST(down.tstamp) AS b_tstamp,            LAST(up.tstamp) AS e_tstamp   ONE ROW PER MATCH   AFTER MATCH SKIP TO LAST up   PATTERN (strt down* up*)   DEFINE      down AS price <= PREV(price),      up AS price >= PREV(price)) WHERE symbol= ‘ACME’ ;

143

Determinismunknown,backtrackinginplace,runsinnon-lineartime...

Page 144: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 144

WhatisBacktrackingWhyshouldIcareaboutbacktracking?

Page 145: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Extendingthepatterntotestfinalpricevs.initialpriceSELECT symbol, mn, tstamp, pattern, price, first_price, last_priceFROM ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES MATCH_NUMBER() AS mn, FIRST(strt.tstamp) AS first_x, FIRST(strt.price) AS first_price, LAST(z.tstamp) AS last_z, last(z.price) AS last_price, classifier() AS pattern ALL ROWS PER MATCH WITH UNMATCHED ROWS PATTERN (STRT X+ Y+ W+ Z+ AVGP) DEFINE X AS (price < PREV(price)), Y AS (price > PREV(price)), W AS (price < PREV(price)), Z AS (price > PREV(price)), AVGP AS (last(z.price) < strt.price*1.5)) ;

145

Page 146: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Comparingresultsoffirstandsecondstatement

146

Howaretherowsofdatanowprocessedthroughthenon-deterministicstatemachine?

BasicPattern

ModifiedpatternwithAVGPasfinalpartofpattern

Page 147: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Comparingresultsoffirstandsecondstatement

1. ROW2isnotmatchedanymoretoalways-trueeventSTRT2. STRTvariablenowmatchedatrow3.3. W-patternstillendsatROW8

4. ROW9isnowmappedtovariableAVGP

147

Backtrackinginaction!

12

34

Page 148: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 148

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

0 1 strt Y 1

Page 149: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 149

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

0 1 strt Y 1

1 2 X N 1

• Patternhasfailedtomatch• Movepointertonextrow:Row2• Startapplyingstatemachinetotestforpattern

Page 150: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 150

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

0 1 strt Y 1

Page 151: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 151

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

0 2 strt Y 1

1 3 X Y 2

Page 152: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 152

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

Page 153: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 153

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

Page 154: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 154

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

2 6 X N 2

Page 155: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 155

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

2 6 X N 2

2 6 Y Y 3

Page 156: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 156

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

2 6 X N 2

2 6 Y Y 3

3 7 Y N 3

Page 157: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 157

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

2 6 X N 2

2 6 Y Y 3

3 7 Y N 3

3 7 W Y 4

Page 158: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 158

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

2 6 X N 2

2 6 Y Y 3

3 7 Y N 3

3 7 W Y 4

4 8 W N 4

4 8 Z Y 5

Page 159: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 159

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

2 6 X N 2

2 6 Y Y 3

3 7 Y N 3

3 7 W Y 4

4 8 W N 4

4 8 Z Y 5

5 9 Z N 5

Page 160: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 160

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

2 6 X N 2

2 6 Y Y 3

3 7 Y N 3

3 7 W Y 4

4 8 W N 4

4 8 Z Y 5

5 9 Z N 5

5 9 Avgp(2–8) N FAIL

Page 161: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 161

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X Y 2

BACK

TRAC

KING

STAR

TED

Page 162: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 162

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X Y 2

2 5 X IGNORE 2

2 5 Y N FAIL

BACK

TRAC

KING

STAR

TED

Page 163: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 163

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y 2

2 4 X IGNORE 2

2 4 X N FAIL

BACK

TRAC

KING

STAR

TED

Page 164: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 164

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

1 2 strt Y 1

2 3 X Y FAILBA

CKTR

ACKING

STAR

TED

Page 165: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 165

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

0 2 Rowskipped

0 3 Strt Y 1

• Can’tbacktrackanyfurtherbecausetherearenomorematchesforX

• Patternhasfailedtomatch!• Movepointertonextrow:Row3• Startapplyingstatemachinetotestforpattern

Page 166: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 166

(STRT X+ Y+ W+ Z+ AVGP)

0Start State1(strt)

State3(y)

State2(x)

State4(w)

x y

wxstrt

yState5

(z)State6(avgp)

z

avgp

w

z

Currentstate Rowevaluated Event Eventmet Newstate

0 3 strt Y 1

Page 167: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Patterncompletes:startsRow3,endsRow9

167

Page 168: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Backtracking• Non-deterministicstatemachinecapturesstateateachrowatpatternevaluationtimeandpushesdetailsintostack– Backtrackingsimplywalksbackthroughthestack,lookingforpossiblere-evaluation

• Movingforwardweputmoreandmorerowsintothestack– Repeatedwithineachpartition

• Dependingoncomplexityofpatternthiscanbecomememory-consuming– ChancetorunoutofPGA (ORA-30009) forlarge,complexpatternmatchingstatements

– Circumventsuchsituationsbyallocatingmorememoryor…– Considersimplifyyourpattern!

168

Page 169: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 169

NAMINGBLOCKSKeepingyourcodeneatlyandclearlydefinedforthenextdeveloperwhohastoworkonit…

Page 170: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Nameyourblocks-notmandatory,justhelpful• Nameyourblocks• ExplicitlymarktheMATCH_RECOGNIZEblock– ReferenceinSELECTclauseandpredicates

• Makeslifealoteasierforpersontryingtoupdateyourcode

170

SELECT mr.symbol, mr.first_x, mr.last_z FROM ticker t MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp  MEASURES FIRST(x.tstamp) AS first_x,           LAST(z.tstamp) AS last_z,           tstamp AS tstamp  ONE ROW PER MATCH  PATTERN (X+ Y+ W+ Z+)  DEFINE X AS (price < PREV(price)),         Y AS (price > PREV(price)),         W AS (price < PREV(price)),         Z AS (price > PREV(price) AND z.tstamp - FIRST(x.tstamp) <= 7 )) mr WHERE mr.symbol IN ('ACME', 'OSCORP') AND mr.tstamp BETWEEN '01-Apr-11' AND '09-Apr-11';

Page 171: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Don’trelyonDEFAULTSorexcludeoptionalkeywords!

171

• Manykeywords/clauseshavedefaultvalues– AFTERMATCHSKIP….defaultisPASTLASTROW– ALLROWSPERMATCH….DefaultisSHOWEMPTYMATCHES

• Somekeywords/clausesareoptional– PARTITIONBYandORDERBY:don’texpectsourcedatatobeincorrectorder!–MEASURES:mostpatternscontainusefuldatapointssoaddadditionalmeasures

• MATCH_NUMBERandCLASSIFIERareusefulasdebuggingtoolsbutprobablyneedtoberemoved

Page 172: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 172

TESTINGYOURPATTERNBuilddatasetsthattestallpossibilitiesformatchingyourpatterntoavoidunexpectedresults

Page 173: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Youwillneedthreedatasetsfortesting…

173

1

2

3

Datasetcontainingnomatchessoyoucanmakesurethatyourpatterndoesnotunexpectedlyfindpatterns

DatasetcontainingpartialmatchessoyoucanmakesurethatyourpatterndoesnotconsumeallyourPGAresourcesandgenerateanORA-3009error.Checkyourgreedy/reluctantquantifiersarematchingasexpected

Datasetcontainsatleastonecompletematch(preferablyalotmore)foryourpattern

Page 174: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Summary

SQLPatternMatchingisapowerfultool

Howtousemostimportantkeywords

KeythingstoconsiderbeforeyourunaMATCH_RECOGINZEquery

Howstatemachinesworkandimpactofbacktracking

GoanduseSQLPatternMatchingtoyouradvantage!

174

Page 175: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

TryMATCH_RECOGNIZEtodayusinglivesql.us.oracle.com

175

Largeselectedofpatternmatchingscriptsandtutorialsonlivesql.us.oracle.com

Page 176: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Nowyouareready……

..tobesuccessfulwithSQLpatternmatching

176

Page 177: DEEP DIVE INTO 12c MATCH RECOGNIZE - Oracle...Do You Need An ALWAYS TRUE Pattern Variable? • Some examples on livesql.oracle.com use ALWAYS TRUE pattern variable – e.g searching