|
|
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
Подскажите, можно ли как-то оптимально, по другому написать: SELECT * FROM tab1 a WHERE a.pole_1 IN (SELECT b.pole FROM tab2 b START WITH b.keypole = 'XXX' CONNECT BY PRIOR b.keypole = b.keyparent) OR a.pole_2 IN (SELECT b.pole FROM tab2 b START WITH b.keypole = 'XXX' CONNECT BY PRIOR b.keypole = b.keyparent) Т.е. в одном и том же подзапросе проверяется значение поля pole_1 или значение поля pole_2. Можно ли написать не указывая дважды подзапрос? А если сделать как указано, то подзапрос будет дважды выполняться? или оптимизатор разберется сам и выполнит один раз? (Oracle 8.1.6i) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2002, 06:56 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
Оптимизатор не будет разбираться один подзапрос ему выполнять или два поскольку результат зависит от данных в таблице на текущий момент. По поводу оптимизации, несколько лучше выглядит запрос Код: plaintext 1. 2. 3. 4. 5. 6. 7. т.к. подзапрос будет выполнен только 1 раз всегда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2002, 08:10 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
to ShgGena: Если раньше оба подзапроса выполнялись всего один раз для основного запроса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. То теперь в вашем варианте, подзапрос стал коррелированным, и подзапрос выполняется для каждой строки основного запроса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. То есть дерево строится каждый раз заново, для каждой строки. В первоначальном варианте, если условие "a.pole_1 IN..." выполняется, то второе условие уже нет. А в твоём дерево строится каждый раз независимо от этого. Хотя само дерево абсолютно не зависит от таблицы tab1. Вызывает большое сомнение, что этот запрос более оптимизированный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2002, 09:45 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 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. proshu obratit vnimanie na: -- vneshniy cikl TABLE ACCESS (FULL) OF 'A_TREE' dlya obouh zaprocov (a in (select ...)) --> vizivaet "psevdo korrelirovanniy podzapros) -- consistent gets 413 protiv 660 --> poskoliku inogda nuzno proverat i vtoroe uslovie to uvelicherie na 50% kolichestva logicheskih chteniy tak chto ne vse tak procto. NOTE : obe tablicy analizirovanny, eto vidno iz (Cost= ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2002, 19:50 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
2ShgGena: На табличке с всего 19 записей Оракул всегда будет выбирать FULL_SCAN. Дешевле всего, потому что... 2ShgGena, softbuilder: Это у вас уже дискуссия на тему, что быстрее EXISTS или IN. Не очень давно на пробегал линк на статью, где всё это уже обсуждалось -- http://ln.com.ua/~openxs/projects/oracle/ora018.html . 2Ulba_2002: Как показывает статистика от ShgGena, к сожалению в варианте с IN и OR подзапрос будет выполнен дважды. Но с высокой степенью вероятности, его "цена" будет ниже за счёт того, что все данные будут в buffer cache. Ну а выбор, что в вашем случае быстрее EXISTS или IN за вами -- смотрите линк выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2002, 02:14 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2002, 03:25 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
Прошу извинения за предидущий длинный пост. Просто вместо ПРОСМОТР нажал ОТПРАВИТЬ, а корректировать нельзя. Тем не менее: 1) о FULL SCAN TABLE - эта операция остается в любом случае поскольку: -- в основном запросе стоит select * ... но до выборки строки невозможно принять решение о результате операции сравнения в where (ДЛЯ ОБОИХ ЗАПРОСОВ) 2) по поводу обшей производительности запроса основным критерием времени его выполнения будет не IN или EXISTS в данном случае а: -- количество сортировок и длина сортируемой последовательности в подзапросах при этом если -- длина последовательности не влезает в sort_area_size то мы получим огромную деградацию производительности особенно если внутренний(ние) подзапросы работают с "широким" деревом у которого мало уровней и много строк на каждом уровне при одинаковом обшем количестве строк в таблице. поскльку мой вариант хоть как-то сокращает количество сортировок то я его считаю более оптимальным (с этим можно конечно не соглашаться) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2002, 03:52 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
Насчёт твоей последней статистки не понял, что ты хотел этим сказать. Для твоего запроса стоимость 8911, для первоначального 19. Потом запросы не возвращает строк, это тоже не интересно. А для проверки под RULE, я советую тебе для сессии сделать alter session set optimizer_mode=RULE; Так как у тебя CHOOSE стоит. И непонятно какой реальный метод используется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2002, 11:28 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
2ShgGena: Судя по всему твой вариант меньше ест ресурсов и быстрее выполняется. Последнее устойчиво или нет, и какие времена при другом порядке выполнения вариантов (2-1-2) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2002, 13:33 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
2 softbuilder@inbox.ru 1. Po povodu sravneniya COST v zaprosah -- COST - velichina otnositelnya i TOLKO otnositelno raznih planov vipolneniya etogo i tolko ETOGO zaprosa. -- izmeneniya v where ili v spiske poley - eto NOVIY ZAPROS i sravnenie cost dbuh raznih zaprosov prosto BESSMISLENO poetomu sravnenie 19 i 8911 eto kak sravnenie apelsinov s taburetkami. 2. test s RULE sdelau pozge, no polagau chto rezultat budet analogichniy ili blizkiy 3. po povodu 0 row selected -- eto hudshiy predelniy variant dly OBOIH zaprosov poetomu i ego vitolnil. 4. echo raz podcherkivau chto v HIERARCHICAL zaprosah osnovnim factorom vremeni vipolneniya yavlyaetsya: KOLICHESTVO i RAZMER vnutrennich sortirovok no nikak ne IN ili EXISTS. I vipolnyal desyatki testov s raznimi dereviyami i statistika ochen postoiannaya, pochti formulnaya. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2002, 18:48 |
|
||
|
Как оптимизировать конкретный запрос
|
|||
|---|---|---|---|
|
#18+
>1. Po povodu sravneniya COST v zaprosah >-- COST - velichina otnositelnya i TOLKO otnositelno raznih planov vipolneniya >etogo i tolko ETOGO zaprosa. >-- izmeneniya v where ili v spiske poley - eto NOVIY ZAPROS i sravnenie cost >dbuh raznih zaprosov prosto BESSMISLENO >poetomu sravnenie 19 i 8911 eto kak sravnenie apelsinov s taburetkami. Не думаю, что cost - величина относительная. Т.к. при изменении запроса происходит новый парсинг и план выполнения оценивается по новому, а не относительно старого. Другое дело было бы неплохо, если была бы возможность посмотреть приблизительно одинаковые по стоимости планы выполнения. Т.к. стоимоть может отличаться на одну, две единицы, а запрос с худшей стоимостью будет выполняться в десятки раз быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2002, 15:29 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32078462&tid=1992474]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
577ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 871ms |

| 0 / 0 |
