|
|
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!кстати, я могу в тригере нарисовать создание "партиции" и создавать их по мере надобности автоматом. а в дб2 есть тригеры на вью ?DDL в instead of tirgger? Или в другом каком? Instead of triggers в db2 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2010, 21:31 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!Mark BarinsteinДа, наверное можно. Только это целую программу в instead of update придётся написать, чтоб корректно обработать возможное перемещение строки из партиции в другую партицию. ну да, одну-две минуты придется потратить на каждый тригер, не вижу в этом проблему.Тогда это не займёт у вас много времени. Наришите, пожалуйста, тогда instead of update триггер для, скажем , 12 партиций: - 1-я: за январь 2010 и раньше - 10 остальных, по месяцу 2010-го, начиная с февраля - последняя, за декабрь 2010 и дальше а потом сравним элегантность решений - в db2 и вашего... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2010, 22:04 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein Тогда это не займёт у вас много времени. Наришите, пожалуйста, тогда instead of update триггер для, скажем , 12 партиций: - 1-я: за январь 2010 и раньше - 10 остальных, по месяцу 2010-го, начиная с февраля - последняя, за декабрь 2010 и дальше а потом сравним элегантность решений - в db2 и вашего... ну вот на это 3 минуты ушло Код: 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. Код: 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. исходые данные create table part_01 (id int not null, v varchar(10), d date not null) ; create table part_02 (id int not null, v varchar(10), d date not null) ; create table part_03 (id int not null, v varchar(10), d date not null) ; create table part_04 (id int not null, v varchar(10), d date not null) ; create table part_05 (id int not null, v varchar(10), d date not null) ; create table part_06 (id int not null, v varchar(10), d date not null) ; create table part_07 (id int not null, v varchar(10), d date not null) ; create table part_08 (id int not null, v varchar(10), d date not null) ; create table part_09 (id int not null, v varchar(10), d date not null) ; create table part_10 (id int not null, v varchar(10), d date not null) ; create table part_11 (id int not null, v varchar(10), d date not null) ; create table part_12 (id int not null, v varchar(10), d date not null) ; create view part_v as select id, v, d from part_01 union all select id, v, d from part_02 union all select id, v, d from part_03 union all select id, v, d from part_04 union all select id, v, d from part_05 union all select id, v, d from part_06 union all select id, v, d from part_07 union all select id, v, d from part_08 union all select id, v, d from part_09 union all select id, v, d from part_10 union all select id, v, d from part_11 union all select id, v, d from part_12; попзжей включу PARTITION_VIEW_ENABLED, проверить план ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 18:07 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!ну вот на это 3 минуты ушлоЛадно, не буду вас больше мучать. На самом деле, мне был интересен instead of update, а не instead of insert. Я просто хотел, чтоб вы оценили длину кода: В общем случае для instead of insert и delete у вас в каждом триггере для 12-и партиций должно было бы быть по 12 if (или case с 12-ю вариантами) для выяснения имени таблицы. А в instead of update - по 1 такому case для старой и новой таблицы-партиции и дальше: - если таблицы совпали, то update в ней - если нет, то delete из старой, insert в новую И каждый раз при attach / detach все три триггера переписываются (и это кроме манипуляций с view и таблицами). А у меня вместо всего этого только манипуляции с view и таблицами: - если добавляется новая или удаляется старая create or replace view part_v ... - если самую старую очищаем и используем для нового месяца: alter table part_t1 drop constraint t1_c; truncate table part_t1; alter table part_t1 add constraint t1_c check (<новый диапазон>); Немного элегантнее получается :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 19:02 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
согласен, чуть элегантней но не принципиально. в instead of update будет один if с проверкой и 3 динамических SQL ну еще 3 минуты кодирования. я бы не увидел особого преимущества и если бы на пару часов кодирования была бы разница, главное что работать это дело будет так же эффективно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 19:58 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!согласен, чуть элегантней но не принципиально. в instead of update будет один if с проверкой и 3 динамических SQL ну еще 3 минуты кодирования. я бы не увидел особого преимущества и если бы на пару часов кодирования была бы разница, главное что работать это дело будет так же эффективно.Когда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 01:35 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
WarstoneКогда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли? если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 01:56 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!WarstoneКогда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли? если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения.И оптимизация планов выполнения запросов, проводимая каждый раз при вставки одной записи, на себя ничего, конечно, не отъедает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 08:36 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
WarstoneYo.!пропущено... если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения.И оптимизация планов выполнения запросов, проводимая каждый раз при вставки одной записи, на себя ничего, конечно, не отъедает? Но и заниматься таким было не обязательно. Если вы делаете N похожих таблиц, VIEW и триггер над ними, разумно написать скрипт, генерирующий, кроме DDL таблиц и view, код триггера, а не генерировать SQL в триггере. Да, получится длинный уродливый текст с огромным количеством IF, но вручную его писать не нужно. а будет ли этот явный код медленнее, чем то, что DB2 неявно сделает внутри себя - это вопрос, требующий проверки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 09:00 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Victor MetelitsaНо и заниматься таким было не обязательно. Если вы делаете N похожих таблиц, VIEW и триггер над ними, разумно написать скрипт, генерирующий, кроме DDL таблиц и view, код триггера, а не генерировать SQL в триггере. Да, получится длинный уродливый текст с огромным количеством IF, но вручную его писать не нужно. а будет ли этот явный код медленнее, чем то, что DB2 неявно сделает внутри себя - это вопрос, требующий проверки.Не надо меня этим лечить, я сам так в Pg делаю. Просто Йо, до этого не додумался... Ну или скромно умолчал... Как всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 10:12 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Результаты тестов на db2 9.7 Код: 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. 198. 199. 200. 201. 202. 203. 204. 205. - без instead of trigger: 2 сек - с instead of trigger: 27 сек (процессор всё время занят на 100%) А на оракле как дела обстоят? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 11:08 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 11:59 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.! исходые данные + create table part_01 (id int not null, v varchar(10), d date not null) ; create table part_02 (id int not null, v varchar(10), d date not null) ; create table part_03 (id int not null, v varchar(10), d date not null) ; create table part_04 (id int not null, v varchar(10), d date not null) ; create table part_05 (id int not null, v varchar(10), d date not null) ; create table part_06 (id int not null, v varchar(10), d date not null) ; create table part_07 (id int not null, v varchar(10), d date not null) ; create table part_08 (id int not null, v varchar(10), d date not null) ; create table part_09 (id int not null, v varchar(10), d date not null) ; create table part_10 (id int not null, v varchar(10), d date not null) ; create table part_11 (id int not null, v varchar(10), d date not null) ; create table part_12 (id int not null, v varchar(10), d date not null) ; create view part_v as select id, v, d from part_01 union all select id, v, d from part_02 union all select id, v, d from part_03 union all select id, v, d from part_04 union all select id, v, d from part_05 union all select id, v, d from part_06 union all select id, v, d from part_07 union all select id, v, d from part_08 union all select id, v, d from part_09 union all select id, v, d from part_10 union all select id, v, d from part_11 union all select id, v, d from part_12; попзжей включу PARTITION_VIEW_ENABLED, проверить планВы забыли в коде либо check constraint в каждой таблице, либо в каждом select во view указать where, либо всё это сразу (я не знаю, как там ораклу надо). А то боюсь, что без этого оракл partition elimination не будет делать - ему неоткуда такую информацию взять будет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 12:09 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
WarstoneИ оптимизация планов выполнения запросов, проводимая каждый раз при вставки одной записи, на себя ничего, конечно, не отъедает? нет конечно, оракл не способен отличить откуда пришел SQL, из хранимки, с клиента или динамический из хранимки. я импользовал биндинг переменных, поэтому максимум 12 запросов распарсится, после чего эти 12 планов закрепяться в кеше. Mark BarinsteinВ итоге для db2 имеем для вставки insert select из временной таблицы для 100 000 записей (ноут, 1 ядро t1300 1.66 GHz, винт 5400 rpm): - без instead of trigger: 2 сек - с instead of trigger: 27 сек (процессор всё время занят на 100%) А на оракле как дела обстоят? мне сравнить не с чем. но даже если в оракле та же картина не вижу преимущества, все время появляется из-за того, что запускается интерпритатор языка сторед процедур, а в реальной жизни по любому там будет туча логики и эти 3 строчки тригера на фоне остальной логики никакой погоды уже не сделают. вы там рассказывали, что легко сделаете логгинг для эмуляции фрешбэк, ну давайте хотя бы такую "логику" добавим и сравним на сколько инстеад усугубил в этом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 12:14 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein Вы забыли в коде либо check constraint в каждой таблице, либо в каждом select во view указать where, либо всё это сразу (я не знаю, как там ораклу надо). А то боюсь, что без этого оракл partition elimination не будет делать - ему неоткуда такую информацию взять будет... да, констреинты нужны, я еще думал параметер включать нужно, а он по дефолту включен. все работает (FILTER = partition elimination) Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 12:27 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!мне сравнить не с чем. но даже если в оракле та же картина не вижу преимущества, все время появляется из-за того, что запускается интерпритатор языка сторед процедур, а в реальной жизни по любому там будет туча логики и эти 3 строчки тригера на фоне остальной логики никакой погоды уже не сделают. А вы сравните со вставкой в непартиционированную таблицу: Вставка в непартиционированную Код: 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. Про тучи логики в реальной жизни не буду комментировать - жизнь у каждой стстемы своя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 12:27 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein А вы сравните со вставкой в непартиционированную таблицу: а какой смысл ? тогда уж более спортивно было бы сравнивать с партициированной по взрослому. но мне лень, коню ясно, что быстрей чем если бы вы для этого вью flashback пытались бы проэмулировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 12:45 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!Mark Barinstein А вы сравните со вставкой в непартиционированную таблицу: а какой смысл ? тогда уж более спортивно было бы сравнивать с партициированной по взрослому. но мне лень, коню ясно, что быстрей чем если бы вы для этого вью flashback пытались бы проэмулировать.Не мешайте вместе мух (флешбек) и котлеты (партиционирование), они не связаны друг с другом. Давайте рассмотрим цель партиционирования: ускорить работу с большой таблицей путём разбиения её на части, чтобы в зависимости от предиката оно лезло только в часть таблицы, а не во всю. И если из такой таблицы надо делать только чтения, то мы увидим выгоду от этого и в дб2, и в оракле. Но в реальности такую таблицу надо и обновлять, а здесь у оракла могут быть серьёзные проблемы. И накладные расходы на обновление могут убить все выгоды партиционирования по сравнению с непартиционированной таблицой - вот почему я прошу сравнивать с непартиционированной таблицей. Что до моего флешбека, то я не использую там вью, я просто веду историческую таблицу тремя триггерами. Флешбековые запросы я делаю из этой исторической таблицы, а не из основной. Массовые обновления у меня (ну, может, кроме insert) - это действительно тяжёлая операция, которой лучше избегать (update текущей записи и, если это update, то insert новой). Но на паре сотен затронутых записей не так долго и работает, хотя разницу видно хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 14:35 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
2 Mark Barinstein авторЧто до моего флешбека, то я не использую там вью, я просто веду историческую таблицу тремя триггерами. Флешбековые запросы я делаю из этой исторической таблицы, а не из основной. Простите, я не совсем понял. В дб2 нет возможности: Код: plaintext 1. 2. 3. 4. 5. 6. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 14:56 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
2pkarklin речь про партитионинг для бедных, которые не тянут EE edition. кстати, а что мсскл может предложить для стандарт едишено на тему партитионинга ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 15:10 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!кстати, а что мсскл может предложить для стандарт едишено на тему партитионинга ? Тока Partitioned Views. Есть во всех редакциях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 15:18 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein И накладные расходы на обновление могут убить все выгоды партиционирования по сравнению с непартиционированной таблицой - вот почему я прошу сравнивать с непартиционированной таблицей. ну это у вас воображение разыгралось, столь примитивный тригер как-то повлиять на "выгоды" не сможет. еще раз, мой поинт в том, что в реальной задаче по любому будет тригер обрабатывать входные данные + хотя бы базовые аудитные записи оставить. 4 "лишних" строчки в этом тригере добавят не более 10%. Mark BarinsteinЧто до моего флешбека, то я не использую там вью, я просто веду историческую таблицу тремя триггерами. вот и давайте посмотрим как эти 3 тригера повлияют на разницу. добавте в партицированную и во вью эти тригера и будет ли заметна разница теперь. я думаю не особо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 15:23 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!Mark Barinstein И накладные расходы на обновление могут убить все выгоды партиционирования по сравнению с непартиционированной таблицой - вот почему я прошу сравнивать с непартиционированной таблицей. ну это у вас воображение разыгралось, столь примитивный тригер как-то повлиять на "выгоды" не сможет. еще раз, мой поинт в том, что в реальной задаче по любому будет тригер обрабатывать входные данные + хотя бы базовые аудитные записи оставить. 4 "лишних" строчки в этом тригере добавят не более 10%. Да не сравниваем мы здесь флешбек, выключите его у себя! :) Ну вот, а теперь вспомните свои незачёты за какие-то копеечные накладные расходы на fenced java функции, лишние io на функциональные индексы. Вот если где и ставить незачёт, так вот за эти "4 лишних строчки", которые у меня ухудшили производительность запроса в 7 и 13 раз. дб2-шной fenced java и функциональным индексам никогда не удастся так запрос ухудшить. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 16:27 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinДа не сравниваем мы здесь флешбек, выключите его у себя! :)Никак нельзя нащальника! Это святой кароф любый оракдиста ЗЫ. Толку-то от этого флэшбэка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2010, 16:33 |
|
||
|
|

start [/forum/topic.php?fid=35&msg=36944525&tid=1552703]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 161ms |

| 0 / 0 |
