powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / История одна дата vs две. Что лучше?
25 сообщений из 129, страница 5 из 6
История одна дата vs две. Что лучше?
    #35668070
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BelyMasterZiv> А в других СУБД разве нельзя в constraint`ах использовать функции?
Функции можно как правило. Запросы нельзя.
Тут есть тонкость - запрос сегодня может возвращать одно, завтра другое. В зависимости от данных, которые лежат в БД.
В таком случае может получиться, что те данные, которые были введены вчера - сегодня уже неверные. Как серверу поступать с ними?

Типичный пример недетерминированного правила:
Код: plaintext
date_fm > sysdate- 1 


Оракл на этот счёт уже не париться. Например, он уже определил UNIQUE без проверки. Т.е. старые данные, которые были заведены до создания UNIQUE могут содержать дубликаты, вновь создаваемые записи будут подвергаться проверке. Такое декларативное ограничение целостности можно рассматривать как бизнес правило, которое действует только во время изменения данных, но не является инвариантом всей БД.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668099
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросик_Чтений там будет меньше, чем у вас раза в полтора-два (думаю, вы и сами это проверили) - за счет однократного прохода индекса.1.Вы думаете, что поиск значения в индексе - медленнее, чем сканирование части индекса?
Веть для того, чтобы отсортировать результат - именно так и придется делать.
Одна надежда на то, что оптимизатор сам перевернет этот запрос к поиску max(dt_start)
2. Если строить индекс только по одной колонке, то это слабо отличается от варианта одной даты.
Я бы сказал - практически никак.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668104
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросик_Bogdanov AndreyПриведенные выше примеры как раз иллюстируют то, что "извращения" намного быстрее . Не буду спорить с тем, что у меня руки кривые, но других цифр пока никто не привел. Только теоретизируют. Ссылаясь на "практика показывает" постарайтесь приводить хоть какие-то доказательства. Передергиваете. Я приводил пример оптимизированного запроса с двумя датами для вашей модели. Индекс только по start_dt. Чтений там будет меньше, чем у вас раза в полтора-два (думаю, вы и сами это проверили) - за счет однократного прохода индекса.Вы как раз приводили пример с "извращениями" - когда используется поиск минимального значения одной даты. expla утверждал, что "извращения с min(dt) ни чуть не быстрее сканирования индекса с ДВУМЯ датами" вы при этом ссылаетесь на пример с индексом по ОДНОЙ дате и говорите, что я передергиваю. Предлагаю извиниться.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668111
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
explaОракл на этот счёт уже не париться. Например, он уже определил UNIQUE без проверки. Т.е. старые данные, которые были заведены до создания UNIQUE могут содержать дубликаты, вновь создаваемые записи будут подвергаться проверке.Имеете ввиду NOVALIDATE?
Ну - это не совсем то же, что и "сегодня вставленная запись правильная, а завтра стала неверной".
Это скорее "Я знаю, что у меня нормальные данные - не надо зря шуршать дисками".
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668126
вопросик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely ...Вы думаете, что поиск значения в индексе - медленнее, чем сканирование части индекса? ... Если строить индекс только по одной колонке, то это слабо отличается от варианта Я бы сказал - практически никак.
У вас появилось время ? выполните тест, чтений там наверняка будет меньше. И это простейшем запросе по одному товару. Когда позиций будет больше - ситуация будет еще значительней отличаться.
Две даты оставляют больше места для оптимизации при необходимости. При том, что в ряде случаев запросы при двух датах будут проще.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668129
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expla...с min(dt) требуется двойной поиск по индексу, сначала чтобы вычислить min, потом, чтобы найти ROWID искомой записи
А зачем искать "...ROWID искомой записи"? Дата есть в индексе (речь о конкретном запросе)
И зачем двойной поиск? В одном все делается не плохо
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668136
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросик_
При том, что в ряде случаев запросы при двух датах будут проще.
Проще для программиста или быстрее для оракла?
Пока не ответим на этот вопрос - бодаться бессмысленно
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668138
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely,

Да я NOVALIDATE. Я о том, что обычно декларативные ограничения целостности рассматривают только как инвариант всей БД. Но не редко нам нужно проверить только постусловие транзакции, и это постусловие может меняться со временем, как из-за недетерминированных функций, типа sysdate, так и из-за изменения кода процедуры проверки. Видимо речь об этом.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668140
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
explaУ каждого саоя практика.Нисколько не сомневаюсь в вашей практике, но здесь от вас вижу одну лишь теорию.

explaЕсли нужна взвешенная оценка, составте таблицу вида "аспект" X "вариант решения".В данном случае меня не интересуют ни взвешенные оценки, ни выбор какого-то варианта. В данном топике я лишь приводил примеры, доказывающие, что вопрос быстродействия для случая с двумя датами не столь очевиден. Вы взялись это оспорить, но ни одного подтверждающего примера не привели. В вопросе о быстродействии я воспринимаю только результаты экспериментов. Все остальные аргументы адресуйте кому-нибудь другому.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668143
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivФункции можно как правило. Запросы нельзя.А что мешает убрать запрос под функцию ?
MS SQL 2000
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
USE pubs
GO
CREATE TABLE t (id int PRIMARY KEY)
GO
CREATE FUNCTION tcnt()
RETURNS int
BEGIN
RETURN (SELECT COUNT(*) FROM t)
END
GO
ALTER TABLE t ADD CONSTRAINT tcheck CHECK (dbo.tcnt() <  3 )
GO
INSERT INTO t SELECT  1 
INSERT INTO t SELECT  2 
INSERT INTO t SELECT  3 
SELECT * FROM t
GO
DROP TABLE t
DROP FUNCTION tcnt
Эффект практически тот же самый. Невозможность указания запроса в констрейнте может являтся лишь формальным, синтаксическим, ограничением.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668166
вопросик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bogdanov Andrey но других цифр пока никто не привел. Только теоретизируют. Ссылаясь на "практика показывает" постарайтесь приводить хоть какие-то доказательства
...
Вы как раз приводили пример с "извращениями" - когда используется поиск минимального значения одной даты. expla утверждал, что "извращения с min(dt) ни чуть не быстрее сканирования индекса с ДВУМЯ датами" вы при этом ссылаетесь на пример с индексом по ОДНОЙ дате и говорите, что я передергиваю. Предлагаю извиниться.
Отвечал именно на выделенное.
Далее - про "ссылаетесь на пример с индексом по ОДНОЙ" - индекс по двум датам - ситуация будет еще лучше в общем случае (например, когда нет актуальной записи на заданную дату), т.к. проверка по end_dt будет выполнена на индексном уровне.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668168
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KOT MATPOCKuHexpla...с min(dt) требуется двойной поиск по индексу, сначала чтобы вычислить min, потом, чтобы найти ROWID искомой записи
А зачем искать "...ROWID искомой записи"? Дата есть в индексе (речь о конкретном запросе)
И зачем двойной поиск? В одном все делается не плохо

Как оракл выполняет запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
select *
from t e
where (id, dt) in
 (select id, min(dt)
  from t i
  where e.id=i.id and :p < i.dt
 )

1. В индексе находит наименьшее значение dt большее :p, это и есть min(td)
... Замечу, что в старых версиях оракл SQL машина выгребала из индекса все подходящие ключи, сортировала их с группировкой, а затем возвращала min(dt).
2. В индексе находит ключ для искомой записи. Это уже второй поиск по индексу.
3. Используя полученный ROWID находит блок таблицы и извлекает из него нужную запись.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668193
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bogdanov AndreyВ данном топике я лишь приводил примеры, доказывающие, что вопрос быстродействия для случая с двумя датами не столь очевиден.

Так и я о том же. И без всяких тестов ясно, что производительность будет зависеть от данных. Только, ИМХО, в данном случае производительность дело десятое.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668203
вопросик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
explaИ без всяких тестов ясно, что производительность будет зависеть от данных. Только, ИМХО, в данном случае производительность дело десятое.
+1.
Если уже сильно прижмет (или запросы изначально часто выполняться будут) - всегда можно оптимизировать.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668229
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросик_Если уже сильно прижмет (или запросы изначально часто выполняться будут) - всегда можно оптимизировать.Ну-ну...
"Пытайтесь все делать как можно лучше! Плохо - оно само получится" (с) Гоблин
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668260
вопросик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикинем что-нибудь более приближенное к жизни. по товару - как часто меняется цена ?
Пусть блок в бд - 8K. Пусть в среднем ключ займет leaf-блоке 40 байт. Т.е. в одном блоке поместятся примерно >~200 изменений цены. Поэтому в таком случае простой запрос с двумя датами будет работать шустро без всяких оптимизаций.
Для каких-то особых случаев повторяться не буду.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668297
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросик_Для каких-то особых случаев повторяться не буду.Да никаких особых случаев...
табличка SYS_FBA_HIST_xxx по одной нашей таблице за месяц ТЕСТИРОВАНИЯ уже насобирала 4 млн. записей. Данные пока загружены не в полном объеме (одна сотая часть).
эта системная таблица выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE sys_fba_hist_19511
    (rid                            VARCHAR2( 4000 ),
    startscn                       NUMBER,
    endscn                         NUMBER,
    xid                            RAW( 8 ),
    operation                      VARCHAR2( 1 ),
    list_id                        NUMBER( 38 , 0 ),
    object_id                      NUMBER( 9 , 0 ),
    status_id                      NUMBER( 38 , 0 ),
    priority                       NUMBER( 38 , 0 ),
    workflow_step_id               NUMBER( 38 , 0 ),
    recall_date                    DATE)
Для незнакомых с Oracle - SCN можно перетранслировать в TIMESTAMP.
Так что для кого-то работа с такими данными "ничего можно не делать", для кого-то потенциальная головная боль.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668302
вопросик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Belyвопросик_Если уже сильно прижмет (или запросы изначально часто выполняться будут) - всегда можно оптимизировать.Ну-ну...
Извините, вы реально сталкивались с процессом разработки ?

1) Примерно известно цели систем, характер данных, которые она будет обрабатывать, исходя из этого выстраивается логика обработки данных
2) Всегда прикидываются критичные запросы, они "вылизываются".
3) Выполняется тестирование системы.
На этапе пробной эксплуатации(и последующей) выявляются "узкие" места.

Вот про строить суперуниверсальную систему, сразу оптимизированную на зарнее неизвестные, все возможные в жизни случаи, которые неожиданно, не понятно откуда могут возникнут, вот это действительно - "ну-ну..."
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668331
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Belyвопросик_Если уже сильно прижмет (или запросы изначально часто выполняться будут) - всегда можно оптимизировать.Ну-ну...
"Пытайтесь все делать как можно лучше! Плохо - оно само получится" (с) Гоблин

Вариант с двумя датами это расширение варианта с одной датой, так что если где то производительность окажется хуже требуемой, можно будет перейти на псевдо первый вариант.

Тем временем тест - "выбрать текущие состояния всех объектов":

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select count(sddc) from (
select /*+ no_merge index(e tp$id) use_nl(e) */ *
from tp e
where (id, d_to) in
 (select /*+ leading(i) index(e tp$id) */ id, min(d_to)
  from tp i
  where sysdate <= i.d_to
  group by id
 )
)

~  0 . 1  sec

select count(sddc) from (
select /*+ no_merge index(e tp$id)  */ *
from tp e
where sysdate between d_from and d_to
)

~  0 . 05  sec

Индекс tp$id это (id, d_to, d_from). Возможно доработка индекса немного ускорит первый запрос (но скорее всего и первый запрос тоже ускорится), но даже в силу того, что первый код существенно сложнее я не буду его использовать.

Замечу, что оракл в данном случае предпочитает не использовать индексы вообще, но тут суть в том, чтобы запрос выполнил много операций поиска по индексу.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668360
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросик_Извините, вы реально сталкивались с процессом разработки ?
...
Вот про строить суперуниверсальную систему, сразу оптимизированную на зарнее неизвестные, все возможные в жизни случаи, которые неожиданно, не понятно откуда могут возникнут, вот это действительно - "ну-ну..."Сталкивался и продолжаю сталкиваться .

Кроме этого видел как реально работающие и протестированные системы начинали загибаться после того как менялась учетная политика организации и в системе появлялось в 10 раз больше проводимых документов.

Так что к вашим пунктам надо добавить "планирование будующих потоков данных".
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668373
вопросик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Belyвопросик_Для каких-то особых случаев повторяться не буду.Да никаких особых случаев...
табличка SYS_FBA_HIST_xxx по одной нашей таблице за месяц ТЕСТИРОВАНИЯ уже насобирала 4 млн. записей. Данные пока загружены не в полном объеме (одна сотая часть).
эта системная таблица выглядит так:
Ну и ? Не можете оптимизировать обработку и, почитав этот топик решили, что без end_scn будет быстрее ? :)

Андрей специально привел некий особый случай данных, на которых "лобовой" запрос с двумя данными проигрывал. Для тех же данных я привел другой (не сложнее по содержанию запроса Андрея) запрос с двумя датами, который работает оптимальней для поставленной задачи.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668403
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопросик_,

+1. С двумя датами открывается широкое поле возможностей оптимизации. И индексы можно покрутить и запросы и планы. Оратная сторона вопроса, легко наткнуться на плохой вариант.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668410
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросик_Ну и ? Не можете оптимизировать обработку и, почитав этот топик решили, что без end_scn будет быстрее ? :) Да можем мы все, просто не стоит забывать, что песочницы у всех разного размера. Если данных мало - то индекс вобще лучше не строить.

Почитав этот топик я понял, что когда придет время - надо будет тестировать, а не просто строить индекс по двум SCN.
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35668666
Фотография призрак коммунизма
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select * from table1 where sysdate between start_date and end_date
принципиально не используете?
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35669543
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expla пишет:

> У каждого саоя практика. Речь лишь о том, что на разных СУБД, на разных
> экземплярах СУБД и на разных экземплярах БД результат может быть разным,
> в пользу любого из решений.

Я очень сильно сомневаюсь, что здесь есть какая-то специфика СУБД.
B+tree индексы есть в любой СУБД, и почти одинаковы. А вот от специфики задачи
может зависить многое. Хорошую вы табличку нарисовали.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 129, страница 5 из 6
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / История одна дата vs две. Что лучше?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]