Wrong query result with match_recognize query and parallel degree equal to number of hash partition
Date: Fri, 13 Aug 2021 19:09:53 +0200
Message-ID: <CAJNN_2QtTU36VOGTvxFBRwqUa1o=+XA42VSYLs_LtpW04Kob-g_at_mail.gmail.com>
Hi,
COMMIT;
SELECT /*+ PARALLEL(16) */
*
FROM (SELECT a.id_1
, a.date_deb
, a.date_fin
, MAX(b.mt_taxe)
KEEP(DENSE_RANK FIRST ORDER BY b.pr DESC, a.id_2 ASC) AS mt_taxe FROM tmp_periode a
, tmp_data b
WHERE b.id_1 = a.id_1 AND b.id_2 = a.id_2 AND b.date_deb <= a.date_deb AND b.date_fin >= a.date_deb GROUP BY a.id_1
, a.date_deb
, a.date_fin)
MATCH_RECOGNIZE( PARTITION BY id_1 ORDER BY date_deb ASC MEASURES MIN(date_deb) AS date_deb
, MAX(date_fin) AS date_fin
, mt_taxe AS mt_taxe
ONE ROW PER MATCH PATTERN(strt ind_same*) DEFINE ind_same AS ( date_deb - 1 = PREV(date_fin) AND mt_taxe = PREV(mt_taxe)));
=> With PARALLEL(16) the query returns 1 line which is the expected result, with PARALLEL(32) the query returns 2 lines. => Without the KEEP(DENSE_RANK FIRST ORDER BY b.pr DESC, a.id_2 ASC) the result is correct even using PARALLEL(32) I have seen "Bug 31393600 - Dense_Rank Query Returns Incomplete Results (Doc ID 31393600.8)" but it should be fixed in 19.8
WITH
cte_data AS (
SELECT /*+ MATERIALIZE */
a.id_1
, a.date_deb
, a.date_fin
, MAX(b.mt_taxe)
KEEP(DENSE_RANK FIRST ORDER BY b.pr DESC, a.id_2 ASC) AS
mt_taxe
FROM tmp_periode a
, tmp_data b
WHERE b.id_1 = a.id_1
AND b.id_2 = a.id_2
AND b.date_deb <= a.date_deb
AND b.date_fin >= a.date_deb
GROUP
BY a.id_1
, a.date_deb
, a.date_fin)
SELECT /*+ PARALLEL(32) */
*
FROM cte_data
MATCH_RECOGNIZE(
PARTITION BY id_1
ORDER BY date_deb ASC
MEASURES MIN(date_deb) AS date_deb
, MAX(date_fin) AS date_fin
, mt_taxe AS mt_taxe
ONE ROW PER MATCH
PATTERN(strt ind_same*)
DEFINE ind_same AS ( date_deb - 1 = PREV(date_fin)
AND mt_taxe = PREV(mt_taxe)));
=> When using a CTE for the subquery the result is good no matter the parallel degree used.
Obviously plans are not the same between CTE and SUBQUERY :
CTE plan :
| Id | Operation | Name
| E-Rows |E-Bytes| Cost (%CPU)| E-Time | Pstart| Pstop |
TQ |IN-OUT| PQ Distrib | OMem | 1Mem | Used-Mem |
| 0 | SELECT STATEMENT |
| | | 13 (100)| | | |
| | | | | |
| 1 | TEMP TABLE TRANSFORMATION |
| | | | | | |
| | | | | |
| 2 | PX COORDINATOR |
| | | | | | |
| | | 73728 | 73728 | |
| 3 | PX SEND QC (RANDOM) | :TQ10001
| 1 | 114 | 10 (0)| 00:00:01 | | |
Q1,01 | P->S | QC (RAND) | | | |
| 4 | LOAD AS SELECT (TEMP SEGMENT MERGE) |
SYS_TEMP_0FD9EC3D5_B0240DB9 | | | | |
| | Q1,01 | PCWP | | 1043K| 1043K| 1043K (0)|
| 5 | SORT GROUP BY |
| 1 | 114 | 10 (0)| 00:00:01 | | |
Q1,01 | PCWP | | 36864 | 36864 | |
| 6 | PX RECEIVE |
| 1 | 114 | 10 (0)| 00:00:01 | | |
Q1,01 | PCWP | | | | |
| 7 | PX SEND HASH | :TQ10000
| 1 | 114 | 10 (0)| 00:00:01 | | |
Q1,00 | P->P | HASH | | | |
| 8 | SORT GROUP BY |
| 1 | 114 | 10 (0)| 00:00:01 | | |
Q1,00 | PCWP | | 2048 | 2048 | 2048 (0)|
| 9 | NESTED LOOPS |
| 1 | 114 | 10 (0)| 00:00:01 | | |
Q1,00 | PCWP | | | | |
| 10 | PARTITION HASH ALL |
| 1 | 44 | 10 (0)| 00:00:01 | 1 | 32 |
Q1,00 | PCWC | | | | |
| 11 | TABLE ACCESS FULL | TMP_PERIODE
| 1 | 44 | 10 (0)| 00:00:01 | 1 | 32 |
Q1,00 | PCWP | | | | |
| 12 | PX BLOCK ITERATOR |
| 1 | 70 | 9 (0)| 00:00:01 | KEY | KEY |
Q1,00 | PCWC | | | | |
|* 13 | TABLE ACCESS FULL | TMP_DATA
| 1 | 70 | 9 (0)| 00:00:01 | KEY | KEY |
Q1,00 | PCWP | | | | |
| 14 | PX COORDINATOR |
| | | | | | |
| | | 73728 | 73728 | |
| 15 | PX SEND QC (RANDOM) | :TQ20001
| 1 | 44 | 3 (34)| 00:00:01 | | |
Q2,01 | P->S | QC (RAND) | | | |
| 16 | BUFFER SORT |
| 1 | 44 | | | | |
Q2,01 | PCWP | | 36864 | 36864 | |
| 17 | VIEW |
| 1 | 44 | 3 (34)| 00:00:01 | | |
Q2,01 | PCWP | | | | |
| 18 | MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTO|
| 1 | 44 | 3 (34)| 00:00:01 | | |
Q2,01 | PCWP | | 36864 | 36864 | |
| 19 | PX RECEIVE |
| 1 | 44 | 2 (0)| 00:00:01 | | |
Q2,01 | PCWP | | | | |
| 20 | PX SEND HASH | :TQ20000
| 1 | 44 | 2 (0)| 00:00:01 | | |
Q2,00 | P->P | HASH | | | |
| 21 | VIEW |
| 1 | 44 | 2 (0)| 00:00:01 | | |
Q2,00 | PCWP | | | | |
| 22 | PX BLOCK ITERATOR |
| 1 | 44 | 2 (0)| 00:00:01 | | |
Q2,00 | PCWC | | | | |
|* 23 | TABLE ACCESS FULL |
SYS_TEMP_0FD9EC3D5_B0240DB9 | 1 | 44 | 2 (0)| 00:00:01 |
| | Q2,00 | PCWP | | | | |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Subquery plan :
| Id | Operation | Name |E-Rows |E-Bytes| Cost (%CPU)| E-Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | OMem | 1Mem | Used-Mem |
| 0 | SELECT STATEMENT | |
| | 10 (100)| | | | | |
| | | |
| 1 | PX COORDINATOR | |
| | | | | | | |
| 73728 | 73728 | |
| 2 | PX SEND QC (RANDOM) | :TQ10002 |
1 | 44 | 10 (0)| 00:00:01 | | | Q1,02 | P->S | QC
(RAND) | | | |
| 3 | BUFFER SORT | |
1 | 44 | | | | | Q1,02 | PCWP |
| 36864 | 36864 | |
| 4 | VIEW | |
1 | 44 | 10 (0)| 00:00:01 | | | Q1,02 | PCWP |
| | | |
| 5 | MATCH RECOGNIZE BUFFER DETERMINISTIC FINITE AU| |
1 | 44 | 10 (0)| 00:00:01 | | | Q1,02 | PCWP |
| 36864 | 36864 | |
| 6 | PX RECEIVE | |
1 | 44 | 10 (0)| 00:00:01 | | | Q1,02 | PCWP |
| | | |
| 7 | PX SEND HASH | :TQ10001 |
1 | 44 | 10 (0)| 00:00:01 | | | Q1,01 | P->P |
HASH | | | |
| 8 | VIEW | |
1 | 44 | 10 (0)| 00:00:01 | | | Q1,01 | PCWP |
| | | |
| 9 | SORT GROUP BY | |
1 | 114 | 10 (0)| 00:00:01 | | | Q1,01 | PCWP |
| 2048 | 2048 | 2048 (0)|
| 10 | PX RECEIVE | |
1 | 114 | 10 (0)| 00:00:01 | | | Q1,01 | PCWP |
| | | |
| 11 | PX SEND HASH | :TQ10000 |
1 | 114 | 10 (0)| 00:00:01 | | | Q1,00 | P->P |
HASH | | | |
| 12 | SORT GROUP BY | |
1 | 114 | 10 (0)| 00:00:01 | | | Q1,00 | PCWP |
| 2048 | 2048 | 2048 (0)|
| 13 | NESTED LOOPS | |
1 | 114 | 10 (0)| 00:00:01 | | | Q1,00 | PCWP |
| | | |
| 14 | PARTITION HASH ALL | |
1 | 44 | 10 (0)| 00:00:01 | 1 | 32 | Q1,00 | PCWC |
| | | |
| 15 | TABLE ACCESS FULL | TMP_PERIODE |
1 | 44 | 10 (0)| 00:00:01 | 1 | 32 | Q1,00 | PCWP |
| | | |
| 16 | PX BLOCK ITERATOR | |
1 | 70 | 9 (0)| 00:00:01 | KEY | KEY | Q1,00 | PCWC |
| | | |
|* 17 | TABLE ACCESS FULL | TMP_DATA |
1 | 70 | 9 (0)| 00:00:01 | KEY | KEY | Q1,00 | PCWP |
| | | |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
I don't know if it"s the culprit but with subquery I have a "MATCH RECOGNIZE BUFFER DETERMINISTIC FINITE AU" and with CTE I have a "MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTO" I have also found a bug related to match_recognize, fixed in 19.11 "Using descending order within the row_pattern_order_by syntax of a match_recognize query gives wrong final order", but I'm not using descending order in my match_recognize order by.
Is this a known problem?
Regards,
Thomas Ranchon
-- http://www.freelists.org/webpage/oracle-lReceived on Fri Aug 13 2021 - 19:09:53 CEST
