Hi,
Thanks for bearing with all the queries and sorry for long delay. I am back to the performance issue which I left half way.
As alternate solution to the problem I am trying to use connect by clause to merge lines together.
Below are scripts with table and data. Let me know if need more information.
CREATE TABLE tab1
(
line_no NUMBER
,line_seq_no NUMBER
,line_direction CHAR(1 BYTE)
,free_end_ind CHAR(1 BYTE)
,from_longitude NUMBER
,from_latitude NUMBER
,to_longitude NUMBER
,to_latitude NUMBER
,unique_num NUMBER
);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14641, 1, 'S', 'B', 168.35207,
-46.41314, 168.35368, -46.41314, 6);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14642, 1, 'S', 'B', 168.35368,
-46.41314, 168.35693, -46.41314, 7);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14643, 1, 'S', 'B', 168.35693,
-46.41314, 168.357, -46.41314, 10);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14644, 1, 'S', 'B', 168.357,
-46.41314, 168.35805, -46.41313, 12);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14645, 1, 'S', 'B', 168.35805,
-46.41313, 168.3615, -46.41312, 13);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14646, 1, 'S', 'B', 168.3615,
-46.41312, 168.36422, -46.41306, 15);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14650, 1, 'S', 'B', 168.36422,
-46.41306, 168.3671, -46.41246, 29);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14652, 1, 'S', 'B', 168.3671,
-46.41246, 168.37116, -46.41148, 33);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14656, 1, 'S', 'B', 168.37116,
-46.41148, 168.37849, -46.40972, 43);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14658, 1, 'S', 'B', 168.37849,
-46.40972, 168.37894, -46.40961, 47);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14660, 1, 'S', 'B', 168.37894,
-46.40961, 168.38088, -46.40914, 50);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14662, 1, 'S', 'B', 168.38088,
-46.40914, 168.38215, -46.40883, 54);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14664, 1, 'S', 'B', 168.38215,
-46.40883, 168.38494, -46.40817, 61);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14666, 1, 'S', 'B', 168.38494,
-46.40817, 168.38649, -46.40778, 65);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14670, 1, 'S', 'B', 168.38649,
-46.40778, 168.39041, -46.40686, 72);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14672, 1, 'S', 'B', 168.39041,
-46.40686, 168.39186, -46.40651, 77);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14674, 1, 'S', 'B', 168.39186,
-46.40651, 168.39337, -46.40608, 81);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14680, 1, 'S', 'B', 168.39337,
-46.40608, 168.39545, -46.40539, 92);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14682, 1, 'S', 'B', 168.39545,
-46.40539, 168.39834, -46.40442, 95);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14685, 1, 'S', 'B', 168.39834,
-46.40442, 168.39887, -46.40419, 98);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14686, 1, 'S', 'B', 168.39887,
-46.40419, 168.41102, -46.40086, 102);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14691, 1, 'S', 'B', 168.41102,
-46.40086, 168.41779, -46.39924, 112);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14692, 1, 'S', 'B', 168.41102,
-46.40086, 168.41777, -46.3992, 114);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14693, 1, 'S', 'B', 168.41779,
-46.39924, 168.42015, -46.39869, 116);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14694, 1, 'S', 'B', 168.41777,
-46.3992, 168.42012, -46.39862, 117);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14695, 1, 'S', 'B', 168.42015,
-46.39869, 168.42278, -46.39801, 121);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14696, 1, 'S', 'B', 168.42012,
-46.39862, 168.42278, -46.39801, 122);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14702, 1, 'S', 'B', 168.42278,
-46.39801, 168.44123, -46.39219, 133);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14705, 1, 'S', 'B', 168.44123,
-46.39219, 168.44198, -46.39179, 137);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14708, 1, 'S', 'B', 168.44198,
-46.39179, 168.44537, -46.38961, 144);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14709, 1, 'S', 'B', 168.44123,
-46.39219, 168.44537, -46.38961, 145);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14714, 1, 'S', 'B', 168.44537,
-46.38961, 168.45362, -46.3846, 155);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14927, 1, 'S', 'B', 168.45362,
-46.3846, 168.47328, -46.38075, 171);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14928, 1, 'S', 'B', 168.47328,
-46.38075, 168.48361, -46.37876, 175);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14931, 1, 'S', 'B', 168.48361,
-46.37876, 168.49542, -46.37647, 180);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14936, 1, 'S', 'B', 168.49542,
-46.37647, 168.50514, -46.37459, 189);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14937, 1, 'S', 'B', 168.50514,
-46.37459, 168.50588, -46.37446, 191);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14938, 1, 'S', 'B', 168.50588,
-46.37446, 168.51841, -46.37183, 194);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14942, 1, 'S', 'B', 168.51841,
-46.37183, 168.52407, -46.36903, 199);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14947, 1, 'S', 'B', 168.52407,
-46.36903, 168.54147, -46.36018, 208);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14949, 1, 'S', 'B', 168.54147,
-46.36018, 168.54751, -46.35709, 212);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14950, 1, 'S', 'B', 168.54751,
-46.35709, 168.54802, -46.35679, 213);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14952, 1, 'S', 'B', 168.54802,
-46.35679, 168.55038, -46.35564, 216);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14953, 1, 'S', 'B', 168.54802,
-46.35679, 168.55031, -46.35558, 217);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14954, 1, 'S', 'B', 168.55038,
-46.35564, 168.55081, -46.35541, 219);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14955, 1, 'S', 'B', 168.55031,
-46.35558, 168.55075, -46.35535, 221);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14956, 1, 'S', 'B', 168.55075,
-46.35535, 168.55217, -46.35407, 225);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14957, 1, 'S', 'B', 168.55081,
-46.35541, 168.55217, -46.35407, 226);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14958, 1, 'S', 'B', 168.55217,
-46.35407, 168.55249, -46.35364, 227);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14964, 1, 'S', 'B', 168.55249,
-46.35364, 168.56585, -46.34044, 243);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14965, 1, 'S', 'B', 168.56585,
-46.34044, 168.57014, -46.33746, 245);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14967, 1, 'S', 'B', 168.57014,
-46.33746, 168.5801, -46.33057, 248);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14971, 1, 'S', 'B', 168.5801,
-46.33057, 168.60184, -46.31736, 259);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14972, 1, 'S', 'B', 168.60184,
-46.31736, 168.60187, -46.31735, 261);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14973, 1, 'S', 'B', 168.60187,
-46.31735, 168.60245, -46.31715, 262);
Insert into TAB1
(LINE_NO,
LINE_SEQ_NO, LINE_DIRECTION, FREE_END_IND, FROM_LONGITUDE, FROM_LATITUDE,
TO_LONGITUDE, TO_LATITUDE, UNIQUE_NUM)
Values
(14977, 1, 'S', 'B', 168.60245,
-46.31715, 168.61233, -46.3144, 269);
COMMIT;
Now,my goal is to merge all lines in the tab1 by comparing their longitude and latitude respectively and since the earlier solution (discussed in previous questions above) is having huge performance impact the 2nd solution that I could think of is to merge lines using CONNECT BY clause.
Though the query below with connect by merges lines, there are 2 problems in resolving which I need your help.
Problem 1. The new_line_seq value 22 in result set is shown twice because oracle found two records (unique_num : 114,112) satisfying condition in connect by clause however I want oracle to join with any one record? How can this be done by altering the query below?
Problem 2. The total number of records in tab1 table are 56 but query below shows total count of 167 because oracle is reusing the records, for example unique_num 155 record is shown in new_line_seq 27 and 28 however it should be shown only once in any one new_line_no and new_line_seq combination. How can this be done by altering the query below?
If solution to problem 2 is not found then I may have to manually fetch repeating points and pass to query below and update table tab1 in a loop which could be a performance bottleneck again! please suggest.
SELECT CONNECT_BY_ROOT line_no AS "NEW_LINE_NO"
,LEVEL AS "NEW_LINE_SEQ"
,from_longitude
,from_latitude
,to_longitude
,to_latitude
,DECODE(
LEVEL
,CONNECT_BY_ISLEAF, free_end_ind
,DECODE(DECODE(LEVEL, 1, -1, DECODE(CONNECT_BY_ISLEAF, 1, -2, 0))
,-1, DECODE(free_end_ind, 'B', 'E', 'S', 'N')
,-2, DECODE(free_end_ind, 'B', 'T', 'T', 'N')
,'N'))
AS "free_end_ind"
FROM tab1
WHERE free_end_ind IN ('B', 'S')
CONNECT BY PRIOR to_longitude = from_longitude AND
PRIOR to_latitude = from_latitude
START WITH from_longitude = 168.35207 and from_latitude = -46.41314
order by 1,2
I have separate logic written to identify repeating points (duplicate) and only such points will be used in START WITH clause since they have another line with same point to which it will be merged.
The data in the tab1 and values in start with clause below are used as an example. Production DB will have millions of records to be merged.
Thanks,
Imran.