|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
I try to replace all occurrences of NOT IN into NOT EXISTS because FB 3 admitted to have a problem with optimizer. It's very, very slow when I tested query in IBExpert I have following results: 1. Original code query select p.avg_cost, bm.item_qty, bm.part_no, bm.item_no from parts p join bills_material bm on p.part_no=bm.item_no where p.avg_cost is not null and bm.item_qty is not null and p.part_no not in (select part_no from bills_material) and bm.part_no='60-0050-00' Total time: 1min 35sec Result: AVG_COST ITEM_QTY PART_NO ITEM_NO 98.910 1.000 60-0050-00 35-0077-00 121.900 1.000 60-0050-00 39-0039-0M 0.000 1.000 60-0050-00 76-0178-00 2. select p.avg_cost, bm.item_qty, bm.part_no, bm.item_no from parts p join bills_material bm on p.part_no=bm.item_no where p.avg_cost is not null and bm.item_qty is not null and not exists(select 1 from bills_material bm where p.part_no=bm.part_no) and bm.part_no='60-0050-00' Total time: 1min 30sec Result the same as #1 3. select p.avg_cost, bm.item_qty, bm.part_no, bm.item_no from parts p join bills_material bm on p.part_no=bm.item_no where p.avg_cost is not null and bm.item_qty is not null and not exists(select 1 from bills_material bm join parts p on bm.part_no=p.part_no and p.part_no is null) and bm.part_no='60-0050-00' Total time: 1sec Result: AVG_COST ITEM_QTY PART_NO ITEM_NO 98.910 1.000 60-0050-00 35-0077-00 121.900 1.000 60-0050-00 39-0039-0M 191.869 1.000 60-0050-00 84-0456-00 0.000 1.000 60-0050-00 76-0178-00 Can anybody explain how can reach the same result for query #3 as for other two? It's not acceptable to wait for so long to get results! FB 3 is not optimized for NOT IN queries at all! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2017, 22:49 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
FredFF, if you use FB 3.0, and ISQL or up to date IBExpert, you can see explain plan and understand why query time are different. Don't tell me that IBExpert do not show extended plan, please. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2017, 22:59 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
FredFF, 1 and 2 queries are not equivalent. You forgot the difference between NOT IN and NOT EXISTS. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2017, 23:01 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
kdv, #1 Plan PLAN (BILLS_MATERIAL NATURAL) PLAN (BILLS_MATERIAL NATURAL) PLAN HASH (BM NATURAL, P NATURAL) #2 Plan PLAN (BM NATURAL) PLAN HASH (BM NATURAL, P NATURAL) #3 Plan PLAN HASH (BM NATURAL, P NATURAL) PLAN HASH (BM NATURAL, P NATURAL) #1 and #2 plans returned identical result. #3 returns one more record (total 4 records) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2017, 23:12 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
FredFF, 1. NOT IN can not be replaced with NOT EXISTS. The difference in the perception of NULL values. The coincidence of the result is just a special case. 2. There is no index on the part_no column. INNER JOIN can be performed via HASH JOIN. However NOT IN and NOT EXISTS do not execute as OUTER ANTI JOIN, and OUTER JOIN can not yet execute using the HASH JOIN algorithm. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2017, 23:33 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
FredFFPLAN HASH (BM NATURAL, P NATURAL) this is simple plan representation. You can find "explain plan" that show more details for Firebird 3.0. If you are interested in access methods, used by Firebird, use google translate for the article http://www.ibase.ru/dataaccesspaths/ or, ask us about https://ib-aid.com/en/firebird-training/ ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2017, 23:37 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
is "select part_no from bills_material" a unique or primary column ? can this existence check be reimplemented as LEFT JOIN with non-null check ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2017, 14:11 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
kdvuse google translate for the article god help him! better use dedicated www.translate.ru than monte-carlo Google/Microsoft translators ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2017, 14:13 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Arioch, I don't need god to translate - I understand Russian language - for programming issues I prefer to use English. I changed table Parts by setting part_no as PK and original query runs as fast as for FB 2.1. Little magic ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 02:20 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
I have stored procedure developed under FB 2.1 and it's very, very slow (more than 8 minutes) under FB 3 because it has NOT IN condition in WHERE clause: not SHIPPING.ORDERNO in (select orderno from invoices) I wrote equivalent NOT EXIST statement with the same result: NOT EXISTS(SELECT 1 FROM INVOICES where INVOICES.ORDERNO = SHIPPING.ORDERNO) but it's runs for 6min 45sec to get result! I tried join tables - it runs for couple seconds NOT EXISTS(SELECT 1 FROM INVOICES INNER JOIN SHIPPING ON INVOICES.ORDERNO = SHIPPING.ORDERNO) but result is wrong FB 3 is not solved the NOT IN so I try to get fast equivalent. Thanks ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2017, 19:31 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
DDL of all tables, include indexes and full text of select (with plan) need to do your select faster. ЧИТАТЬ__ВСЕМ,__КТО__ПРИШЕЛ__СЮДА__В__ПЕРВЫЙ__РАЗ! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 11:06 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
FredFF, from my POV lot of "not in" and things like "not SHIPPING.ORDERNO in (select orderno from invoices)" indicates bad database design. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 12:42 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
FredFF NOT EXISTS(SELECT 1 FROM INVOICES INNER JOIN SHIPPING ON INVOICES.ORDERNO = SHIPPING.ORDERNO) Where is "where" in this select? Короче, без полного списка объектов нихрена не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 13:22 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Ivan_PisarevskyКороче, без полного списка объектов нихрена не понятно. из этого короткого куска и так уже понятно, что он ищет неотгруженные через их отсутствие в отгрузках через суб-селект, что само по себе ужасный ужас. Если уж искать такое, то хотя бы так select ... from invoices i left join shipping s on s.orderno = i.orderno where s.orderno is null А уж если shipping и invoices связаны как 1:1, то тогда, вероятно, можно было бы от shipping вообще избавиться, перенеся столбцы в invoices. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 14:11 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Stored procedure and plan that works fast in FB 2.1 and runs for more than 7 minutes in FB 3 =============================================================== Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141.
======================================================================= PLAN (INVOICES NATURAL)(INVOICES NATURAL)MERGE (SORT (SHIPPING NATURAL), SORT (JOIN (INVOICES NATURAL, ORDERS INDEX (ORDERS_ORDNO), COMPANY INDEX (PK_COMPANY), ORDERS_PRODUCT INDEX (ORDERS_PRODUCT_ORDPART), INVOICES_PART INDEX (RDB$PRIMARY23)))) PLAN JOIN (SHIPPING NATURAL, ORDERS INDEX (ORDERS_ORDNO), COMPANY INDEX (PK_COMPANY), ORDERS_PRODUCT INDEX (ORDERS_PRODUCT_ORDPART)) PLAN MERGE (SORT (SHIPPING NATURAL), SORT (JOIN (INVOICES NATURAL, ORDERS INDEX (ORDERS_ORDNO), COMPANY INDEX (PK_COMPANY), SUBORDERS_PRODUCT INDEX (SUBORDERS_PRODUCT_OSP), ORDERS_PRODUCT INDEX (ORDERS_PRODUCT_ORDPART), INVOICES_PART INDEX (RDB$PRIMARY23)))) PLAN JOIN (SHIPPING NATURAL, ORDERS INDEX (ORDERS_ORDNO), COMPANY INDEX (PK_COMPANY), SUBORDERS_PRODUCT INDEX (SUBORDERS_PRODUCT_OSP), ORDERS_PRODUCT INDEX (ORDERS_PRODUCT_ORDPART)) ======================================================================= This procedure runs on FB 3 but very slow! In Firebird FAQ stated that the problem with NOT IN remains not solved. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 18:59 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
UNION а не UNION ALL написано сознательно? В здравом уме и твердой памяти? price float тип данных выбран сознательно? В здравом уме и твердой памяти? где DDL таблиц с индексами CREATE TABLE ... в код пока не вникал. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 19:18 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 19:24 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198.
I extracted all tables DDL. Each table has PK. How can I replace NOT IN in WHERE clause with LEFT JOIN clause? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 19:39 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128.
I already tried this - it's running for 7 minutes! May be LEFT JOIN runs faster but I don't know how to rewrite sql to use LEFT JOIN like: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 19:48 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Use tag "spoiler", Luke! (c) P.S. Show PLANs for your queries, it can help. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 19:51 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
FredFF, if you do not have duplicates in different parts of UNION, use UNION ALL instead, it will be much faster. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 20:41 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Я в его проблему не вникал, но неужто вообще без UNIONa нельзя обойтись? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 20:45 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
попрятал портянки под спойлер. жду ответа про юнионы. Если расколоть процедуру на несколько, соответственно юнионам, проблема четко локализуется на экзисте? можно применить и лефт джойн, только отсюда (не видя данных) непонятно связь там один ко многим или как? просто лефт джойн может привести к задвоению строк на выходе. P.S. за флоат в цене мне бы бухгалтерия мозг не то чтоб вынесла, она бы его выклевала. ну это так, лирика. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 22:39 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
Ivan_PisarevskyP.S. за флоат в цене мне бы бухгалтерия мозг не то чтоб вынесла, она бы его выклевала. ну это так, лирика. Это не лирика. Это железный закон проектировщика - то, что мы считаем, должно быть целого типа, то, что мереям - плавающего. А за float да, давно уже канделябром. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 23:11 |
|
Issue with NOT IN in Firebird 3
|
|||
---|---|---|---|
#18+
СПМ> железный закон проектировщика - то, что мы считаем, СПМ> должно быть целого типа, то, что мереям - плавающего. Замечательно сформулировано. Надо выбить в камне. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2017, 23:38 |
|
|
start [/forum/topic.php?fid=40&msg=39498037&tid=1561448]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 306ms |
total: | 445ms |
0 / 0 |