|
|
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andrey пишет: > Блин, забыл статистику актуализировать. Вот исправленный вариант - > разница еще более впечатляющая :) Ну так во втором случае у вас индексы не используются, насколько я могу понять оракловые выкладки. А в первом используется. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 22:58 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andrey пишет: > Блин, забыл статистику актуализировать. Вот исправленный вариант - > разница еще более впечатляющая :) Первый запрос я понял что такое. А второй что ? Вроде бы второго варианта структуры там нет. Что доказывали ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 23:01 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andrey пишет: > Ну и для сравнения, вариант с двумя датами: Ну и здесь не используется индекс. подозреваю, что изза sysdate-1000 Вы заставте его использваться, а то так не интересно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 23:03 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZiv miksoft пишет: > Например, Оракл не хранит в индексе те записи, у которых все поля в > составе этого индекса IS NULL. Т.е. ни индекс (DateStart, DateEnd), ни Ну, значит оракл плохая СУБД, и для этой задачи не подходит. Есть другие. > индекс (DateEnd, DateStart) здесь не помогут. Можно, конечно, добавить > третье поле, которое всегда NOT NULL, или на базе фукнции NVL сделать > FBI-индекс. > Но это решение уже > а) обретает привязку к СУБД Это третье поле-то -- привязка к СУБД ? И что, без функции никак ? В общем, не вижу я тут ничего страшного. Полно у нас таких запросов, ничего, работают. (правда, не на оракле) Привязка к СУБД - это знанение особенностей хранения индексов в конкретной СУБД и FBI-индексы, которые есть не во всех СУБД. Я и не говорю, что это страшно. Я говорил, что использование констант вместо NULL-ов для обозначения диапазонов будет удачнее. Не придется переписывать запрос, не придется задумываться об особенностях СУБД, не придется создавать дополнительные индексы. И Оракл сразу перестанет быть плохим :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2008, 12:25 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZivЧТо за волшебный такой запрос, уже второй раз его в топике вижу.Ничего волшебного (и in вполне на равенство можно заменить - на работу оптимизатора в данном случае не влияет), а второй раз видите, потому что мне было лень его самому набивать, вот я и скопипастил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2008, 19:37 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZiv Первый запрос я понял что такое. А второй что ? Вроде бы второго варианта структуры там нет. Что доказывали ? Вы не очень внимательно смотрели - там есть три варианта запроса. Первый - с одной датой, второй тоже с одной датой и с аналитической функцией (было утверждение, что в данном месте надо аналитику использовать), ну а третий - с двумя датами. MasterZiv Ну и здесь не используется индекс. подозреваю, что изза sysdate-1000 Вы заставте его использваться, а то так не интересно. Эо я должен заставить? Увольте. Это пускай защитники варианта с двумя датами заставляют (подсказка: sysdate-1000 тут не причем). А потом посмотрим какой запрос в итоге проще и быстрее получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 09:47 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andrey, Если не сложно, можете для третьего своего варианта сделать два отдельных индекса по датам (оракул не под рукой, сам проверить не могу), и выложить результаты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 14:57 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHBogdanov Andrey, Если не сложно, можете для третьего своего варианта сделать два отдельных индекса по датам (оракул не под рукой, сам проверить не могу), и выложить результаты? Пожалуйста. Код: 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. 3591 consistent gets 1697 physical reads В варианте с запросом по одной дате Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 17:22 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andrey пишет: > Вы не очень внимательно смотрели - там есть три варианта запроса. Первый > - с одной датой, второй тоже с одной датой и с аналитической функцией > (было утверждение, что в данном месте надо аналитику использовать), ну а > третий - с двумя датами. Я это всё понял, но не про второй запрос. Теперь понял всё. > Эо я должен заставить? Увольте. Это пускай защитники варианта с двумя > датами заставляют (подсказка: sysdate-1000 тут не причем). А потом > посмотрим какой запрос в итоге проще и быстрее получится. Тогда в чем полезность вашего эксперементального сравнения ? Оно просто безполезно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 18:44 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andrey, Все-равно, чего-то я не понимаю... Короче, не понимаю, почему оракул при условиях >, >=, <, <= для нескольких полей таблицы редко использует индексы по нескольким полям. В приведенном примере - понятно, стало выгоднее делать TABLE ACCESS FULL и WINDOW SORT, чем поиск по индексу (START_DT, END_DT) или (START_DT). Поэтому, в первых результатах мы увидели такую картину. А если сделать индекс по END_DT, START_DT он его схватит или нет? Т.е. вообще иметь два индекса: 1) START_DT, END_DT 2) END_DT, START_DT Давай попробуем вариант с такими индексами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 08:23 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZivТогда в чем полезность вашего эксперементального сравнения ? Оно просто безполезно.Как известно, бремя доказывания лежит на утверждающем. В топике были утверждения, что две даты однозначно дают выигрыш скорости при выборках. Причем мне показалось, что у людей нет ни тени сомнения - будучи уверенными, что вариант с одной датой очень плох начали даже предложения по его оптимизации выдвигать. Мой эксперимент показывает, что ситуация ровно обратная. С одной датой очевидное решение дает отличные результаты, тогда как в варианте с двумя датами все не столь однозначно. По крайней мере, теперь сторонники решения с двумя датами могут хоть немного призадуматься. Вот KOT MATPOCKuH уже начал пытаться выжать максимум из двух дат :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 09:09 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHДавай попробуем вариант с такими индексами?Давайте. На всякий случай привожу результаты для трех разных дат: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 09:15 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 09:32 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andreyt1.start_dt < sysdate-500000 and t1.end_dt >=sysdate-500000 а почему вы для двух дат такое "вывернутое" условие задаете ? Намеренно сносите голову оптимизатору на специфических данных ? Imho, нечто вроде сферического коня в вакууме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 10:42 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_а почему вы для двух дат такое "вывернутое" условие задаете ?Что именно "вывернутого" в этом условии? Как бы вы его написали? Если надо найти значение, которые было на дату sysdate-500000? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 10:50 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHА если сделать индекс по END_DT, START_DT он его схватит или нет? Т.е. вообще иметь два индекса: 1) START_DT, END_DT 2) END_DT, START_DTУ меня на маленьком тесте - он схватывал индекс, но радости от этого было мало. (Oracle 9.2) Проблема составного индекса в том, что он по размеру БОЛЬШЕ чем индекс по одному полю и приходится считывать больше блоков. так что смысла в нем особого нет. Есть у теста еще одна особенность - короткая запись в таблице (мало полей) из-за этого Full Table Scan иногда становится лучше чем поиск по индексу. Я склоняюсь к мнению, что если использовать две даты, то строить надо только один индекс - по первой дате :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 13:51 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Единственное когда две даты серьезно выиграют - это если в интервалах будут разрывы и время жизни товара не будет непрерывно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 13:53 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyЕсли надо найти значение, которые было на дату sysdate-500000? Для начала определитесь - у вас в таблице хранится один товар или разные ? Если пачка разных - то тогда ваш первый запрос (который с одной датой) некорректен в приведенном вами виде; если же один товар в таблице - то очевидно, для второго запроса (который с двумя датами) исходя из вполне здравых предположений - не должно возвращаться более одной записи(не должно быть на одну дату больше одной версии). Тогда для двух дат запрос может быть примерно(навскидку, топорно) такой: Код: plaintext 1. 2. 3. 4. 5. PS аккуратнее сравнивать нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 15:47 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_Если пачка разных - то тогда ваш первый запрос (который с одной датой) некорректен в приведенном вами виде; если же один товар в таблице - то очевидно, для второго запроса (который с двумя датами) исходя из вполне здравых предположений - не должно возвращаться более одной записи(не должно быть на одну дату больше одной версии).Для этого можно использовать дополнительную группировку по типу товара и скорее всего придется добавить поле "код товара" в индекс. И что это поменяет кардинально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 16:17 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
BelyДля этого можно использовать дополнительную группировку по типу товара и скорее всего придется добавить поле "код товара" в индекс. И что это поменяет кардинально? Кардинально ? Если без кода товара ? Я вам привел вариант с двумя датами. У вас же oracle ? Проверьте этот вариант и сравните с тем, что приводил Bogdanov Andrey. Результаты в студию, если не трудно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 16:21 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_У вас же oracle ? Проверьте этот вариант и сравните с тем, что приводил Bogdanov Andrey. Результаты в студию, если не трудно.Оракл-то есть, со временем, к сожалению, туго... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 17:03 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_PS аккуратнее сравнивать нужноВ качестве преимущества варианта с двумя датами указывалась простота запросов и их производительность. Причем в качестве простого запроса предлагался имеено вариант "тупо" сравнивающий искомую дату с границами диапазона. Вы предложили "сложный" запрос, который для поиска записи фактически не использует вторую дату, то есть работает также как и для таблицы с одной датой. Вторая дата в вашем запросе используется только для отсечения случая разрывов в истории. Случай разрывов для варианта с одной датой в этом треде уже рассматривался, поэтому рассматривать его снова я смысла не вижу. PS. Читать нужно перед тем как отвечать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 17:43 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
miksoftMasterZivЕсли оптимизатор совсем тупой, переписываем SELECT * FROM Tovar_history WHERE @date_now between DateStart and DateEnd union all SELECT * FROM Tovar_history WHERE DateEnd >= @date_now and DateStart IS NULL union all SELECT * FROM Tovar_history WHERE DateStart <= @date_now and DateEnd IS NULL union all SELECT * FROM Tovar_history WHERE DateStart IS NULL and DateEnd IS NULL и приплыли... вообще то нормальные люди null не заносят а заносят константы выходящие за диапазон к примеру: '01.01.1800' и '01.01.3000' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 19:29 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
spmiksoftunion all SELECT * FROM Tovar_history WHERE DateStart IS NULL and DateEnd IS NULL и приплыли...вообще то нормальные люди null не заносят а заносят константы выходящие за диапазон к примеру: '01.01.1800' и '01.01.3000'Bogdanov AndreyЧитать нужно перед тем как отвечать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 19:39 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
sp пишет: > вообще то нормальные люди null не заносят а заносят константы выходящие > за диапазон к примеру: '01.01.1800' и '01.01.3000' Это вы что-то перепутали. как раз нормальные люди используют для этого специально придуманный для этого NULL. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2008, 17:47 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35658540&tid=1543554]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 519ms |

| 0 / 0 |
