|
|
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
BelyMasterZiv> А в других СУБД разве нельзя в constraint`ах использовать функции? Функции можно как правило. Запросы нельзя. Тут есть тонкость - запрос сегодня может возвращать одно, завтра другое. В зависимости от данных, которые лежат в БД. В таком случае может получиться, что те данные, которые были введены вчера - сегодня уже неверные. Как серверу поступать с ними? Типичный пример недетерминированного правила: Код: plaintext Оракл на этот счёт уже не париться. Например, он уже определил UNIQUE без проверки. Т.е. старые данные, которые были заведены до создания UNIQUE могут содержать дубликаты, вновь создаваемые записи будут подвергаться проверке. Такое декларативное ограничение целостности можно рассматривать как бизнес правило, которое действует только во время изменения данных, но не является инвариантом всей БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 13:48:34 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_Чтений там будет меньше, чем у вас раза в полтора-два (думаю, вы и сами это проверили) - за счет однократного прохода индекса.1.Вы думаете, что поиск значения в индексе - медленнее, чем сканирование части индекса? Веть для того, чтобы отсортировать результат - именно так и придется делать. Одна надежда на то, что оптимизатор сам перевернет этот запрос к поиску max(dt_start) 2. Если строить индекс только по одной колонке, то это слабо отличается от варианта одной даты. Я бы сказал - практически никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 13:56:44 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_Bogdanov AndreyПриведенные выше примеры как раз иллюстируют то, что "извращения" намного быстрее . Не буду спорить с тем, что у меня руки кривые, но других цифр пока никто не привел. Только теоретизируют. Ссылаясь на "практика показывает" постарайтесь приводить хоть какие-то доказательства. Передергиваете. Я приводил пример оптимизированного запроса с двумя датами для вашей модели. Индекс только по start_dt. Чтений там будет меньше, чем у вас раза в полтора-два (думаю, вы и сами это проверили) - за счет однократного прохода индекса.Вы как раз приводили пример с "извращениями" - когда используется поиск минимального значения одной даты. expla утверждал, что "извращения с min(dt) ни чуть не быстрее сканирования индекса с ДВУМЯ датами" вы при этом ссылаетесь на пример с индексом по ОДНОЙ дате и говорите, что я передергиваю. Предлагаю извиниться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 13:58:49 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
explaОракл на этот счёт уже не париться. Например, он уже определил UNIQUE без проверки. Т.е. старые данные, которые были заведены до создания UNIQUE могут содержать дубликаты, вновь создаваемые записи будут подвергаться проверке.Имеете ввиду NOVALIDATE? Ну - это не совсем то же, что и "сегодня вставленная запись правильная, а завтра стала неверной". Это скорее "Я знаю, что у меня нормальные данные - не надо зря шуршать дисками". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 13:59:36 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bely ...Вы думаете, что поиск значения в индексе - медленнее, чем сканирование части индекса? ... Если строить индекс только по одной колонке, то это слабо отличается от варианта Я бы сказал - практически никак. У вас появилось время ? выполните тест, чтений там наверняка будет меньше. И это простейшем запросе по одному товару. Когда позиций будет больше - ситуация будет еще значительней отличаться. Две даты оставляют больше места для оптимизации при необходимости. При том, что в ряде случаев запросы при двух датах будут проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:05:30 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
expla...с min(dt) требуется двойной поиск по индексу, сначала чтобы вычислить min, потом, чтобы найти ROWID искомой записи А зачем искать "...ROWID искомой записи"? Дата есть в индексе (речь о конкретном запросе) И зачем двойной поиск? В одном все делается не плохо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:06:17 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_ При том, что в ряде случаев запросы при двух датах будут проще. Проще для программиста или быстрее для оракла? Пока не ответим на этот вопрос - бодаться бессмысленно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:08:33 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bely, Да я NOVALIDATE. Я о том, что обычно декларативные ограничения целостности рассматривают только как инвариант всей БД. Но не редко нам нужно проверить только постусловие транзакции, и это постусловие может меняться со временем, как из-за недетерминированных функций, типа sysdate, так и из-за изменения кода процедуры проверки. Видимо речь об этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:08:42 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
explaУ каждого саоя практика.Нисколько не сомневаюсь в вашей практике, но здесь от вас вижу одну лишь теорию. explaЕсли нужна взвешенная оценка, составте таблицу вида "аспект" X "вариант решения".В данном случае меня не интересуют ни взвешенные оценки, ни выбор какого-то варианта. В данном топике я лишь приводил примеры, доказывающие, что вопрос быстродействия для случая с двумя датами не столь очевиден. Вы взялись это оспорить, но ни одного подтверждающего примера не привели. В вопросе о быстродействии я воспринимаю только результаты экспериментов. Все остальные аргументы адресуйте кому-нибудь другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:08:54 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZivФункции можно как правило. Запросы нельзя.А что мешает убрать запрос под функцию ? MS SQL 2000 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:11:05 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andrey но других цифр пока никто не привел. Только теоретизируют. Ссылаясь на "практика показывает" постарайтесь приводить хоть какие-то доказательства ... Вы как раз приводили пример с "извращениями" - когда используется поиск минимального значения одной даты. expla утверждал, что "извращения с min(dt) ни чуть не быстрее сканирования индекса с ДВУМЯ датами" вы при этом ссылаетесь на пример с индексом по ОДНОЙ дате и говорите, что я передергиваю. Предлагаю извиниться. Отвечал именно на выделенное. Далее - про "ссылаетесь на пример с индексом по ОДНОЙ" - индекс по двум датам - ситуация будет еще лучше в общем случае (например, когда нет актуальной записи на заданную дату), т.к. проверка по end_dt будет выполнена на индексном уровне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:16:55 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHexpla...с min(dt) требуется двойной поиск по индексу, сначала чтобы вычислить min, потом, чтобы найти ROWID искомой записи А зачем искать "...ROWID искомой записи"? Дата есть в индексе (речь о конкретном запросе) И зачем двойной поиск? В одном все делается не плохо Как оракл выполняет запрос Код: plaintext 1. 2. 3. 4. 5. 6. 1. В индексе находит наименьшее значение dt большее :p, это и есть min(td) ... Замечу, что в старых версиях оракл SQL машина выгребала из индекса все подходящие ключи, сортировала их с группировкой, а затем возвращала min(dt). 2. В индексе находит ключ для искомой записи. Это уже второй поиск по индексу. 3. Используя полученный ROWID находит блок таблицы и извлекает из него нужную запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:17:13 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyВ данном топике я лишь приводил примеры, доказывающие, что вопрос быстродействия для случая с двумя датами не столь очевиден. Так и я о том же. И без всяких тестов ясно, что производительность будет зависеть от данных. Только, ИМХО, в данном случае производительность дело десятое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:24:26 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
explaИ без всяких тестов ясно, что производительность будет зависеть от данных. Только, ИМХО, в данном случае производительность дело десятое. +1. Если уже сильно прижмет (или запросы изначально часто выполняться будут) - всегда можно оптимизировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:27:08 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_Если уже сильно прижмет (или запросы изначально часто выполняться будут) - всегда можно оптимизировать.Ну-ну... "Пытайтесь все делать как можно лучше! Плохо - оно само получится" (с) Гоблин ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:35:33 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Прикинем что-нибудь более приближенное к жизни. по товару - как часто меняется цена ? Пусть блок в бд - 8K. Пусть в среднем ключ займет leaf-блоке 40 байт. Т.е. в одном блоке поместятся примерно >~200 изменений цены. Поэтому в таком случае простой запрос с двумя датами будет работать шустро без всяких оптимизаций. Для каких-то особых случаев повторяться не буду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:42:03 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_Для каких-то особых случаев повторяться не буду.Да никаких особых случаев... табличка SYS_FBA_HIST_xxx по одной нашей таблице за месяц ТЕСТИРОВАНИЯ уже насобирала 4 млн. записей. Данные пока загружены не в полном объеме (одна сотая часть). эта системная таблица выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Так что для кого-то работа с такими данными "ничего можно не делать", для кого-то потенциальная головная боль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:51:22 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Belyвопросик_Если уже сильно прижмет (или запросы изначально часто выполняться будут) - всегда можно оптимизировать.Ну-ну... Извините, вы реально сталкивались с процессом разработки ? 1) Примерно известно цели систем, характер данных, которые она будет обрабатывать, исходя из этого выстраивается логика обработки данных 2) Всегда прикидываются критичные запросы, они "вылизываются". 3) Выполняется тестирование системы. На этапе пробной эксплуатации(и последующей) выявляются "узкие" места. Вот про строить суперуниверсальную систему, сразу оптимизированную на зарнее неизвестные, все возможные в жизни случаи, которые неожиданно, не понятно откуда могут возникнут, вот это действительно - "ну-ну..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:52:21 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Belyвопросик_Если уже сильно прижмет (или запросы изначально часто выполняться будут) - всегда можно оптимизировать.Ну-ну... "Пытайтесь все делать как можно лучше! Плохо - оно само получится" (с) Гоблин Вариант с двумя датами это расширение варианта с одной датой, так что если где то производительность окажется хуже требуемой, можно будет перейти на псевдо первый вариант. Тем временем тест - "выбрать текущие состояния всех объектов": Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Индекс tp$id это (id, d_to, d_from). Возможно доработка индекса немного ускорит первый запрос (но скорее всего и первый запрос тоже ускорится), но даже в силу того, что первый код существенно сложнее я не буду его использовать. Замечу, что оракл в данном случае предпочитает не использовать индексы вообще, но тут суть в том, чтобы запрос выполнил много операций поиска по индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 14:59:08 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_Извините, вы реально сталкивались с процессом разработки ? ... Вот про строить суперуниверсальную систему, сразу оптимизированную на зарнее неизвестные, все возможные в жизни случаи, которые неожиданно, не понятно откуда могут возникнут, вот это действительно - "ну-ну..."Сталкивался и продолжаю сталкиваться . Кроме этого видел как реально работающие и протестированные системы начинали загибаться после того как менялась учетная политика организации и в системе появлялось в 10 раз больше проводимых документов. Так что к вашим пунктам надо добавить "планирование будующих потоков данных". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 15:05:45 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Belyвопросик_Для каких-то особых случаев повторяться не буду.Да никаких особых случаев... табличка SYS_FBA_HIST_xxx по одной нашей таблице за месяц ТЕСТИРОВАНИЯ уже насобирала 4 млн. записей. Данные пока загружены не в полном объеме (одна сотая часть). эта системная таблица выглядит так: Ну и ? Не можете оптимизировать обработку и, почитав этот топик решили, что без end_scn будет быстрее ? :) Андрей специально привел некий особый случай данных, на которых "лобовой" запрос с двумя данными проигрывал. Для тех же данных я привел другой (не сложнее по содержанию запроса Андрея) запрос с двумя датами, который работает оптимальней для поставленной задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 15:08:16 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_, +1. С двумя датами открывается широкое поле возможностей оптимизации. И индексы можно покрутить и запросы и планы. Оратная сторона вопроса, легко наткнуться на плохой вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 15:14:07 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
вопросик_Ну и ? Не можете оптимизировать обработку и, почитав этот топик решили, что без end_scn будет быстрее ? :) Да можем мы все, просто не стоит забывать, что песочницы у всех разного размера. Если данных мало - то индекс вобще лучше не строить. Почитав этот топик я понял, что когда придет время - надо будет тестировать, а не просто строить индекс по двум SCN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 15:16:03 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
select * from table1 where sysdate between start_date and end_date принципиально не используете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2008, 16:25:01 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
expla пишет: > У каждого саоя практика. Речь лишь о том, что на разных СУБД, на разных > экземплярах СУБД и на разных экземплярах БД результат может быть разным, > в пользу любого из решений. Я очень сильно сомневаюсь, что здесь есть какая-то специфика СУБД. B+tree индексы есть в любой СУБД, и почти одинаковы. А вот от специфики задачи может зависить многое. Хорошую вы табличку нарисовали. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2008, 13:37:39 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35668373&tid=1543554]: |
0ms |
get settings: |
8ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
88ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 458ms |

| 0 / 0 |
