powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / История одна дата vs две. Что лучше?
4 сообщений из 129, страница 6 из 6
История одна дата vs две. Что лучше?
    #35669550
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA пишет:

> CREATE TABLE t (id int PRIMARY KEY)
> GO
> CREATE FUNCTION tcnt()
....
> ALTER TABLE t ADD CONSTRAINT tcheck CHECK (dbo.tcnt() < *3*)

В некоторых СУБД нет и функций, определяемых пользователем.
Или функций, которые могут делать запросы.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35670108
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
призрак коммунизмаselect * from table1 where sysdate between start_date and end_date
принципиально не используете?
Да, потому что не верно.
Т.к. тема - история изменения значения, то в момент end_date данные этой строки не актуальны (уже другая строка должна действовать).
Читайте внимательнее ;)
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35670900
Фотография призрак коммунизма
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOT MATPOCKuHпризрак коммунизмаselect * from table1 where sysdate between start_date and end_date
принципиально не используете?
Да, потому что не верно.
Т.к. тема - история изменения значения, то в момент end_date данные этой строки не актуальны (уже другая строка должна действовать).
Читайте внимательнее ;) Кто-то мешает при добавлении новой "исторической" записи изменить end_date предыдущей записи?

(естественно, надо сначала определиться с точностью - день/час/секунда/...)
...
Рейтинг: 0 / 0
История одна дата vs две. Что лучше?
    #35671609
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Postgresql >= 8.1
Код: 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.
create type time_interval as (
  start timestamp,
  stop timestamp
);
-- + ешё 9kb исходников

create table test1 ( 
	id int4,
	period time_interval,
	value varchar
);
create unique index uix on test1 (id, period time_interval_ops );
create index ix on test1( id, ( (period).start ) );
create index ix1 on test1( ( (period).start ) );

insert into test1( id, period, value )
select i, (now - (j)*'1 day'::interval, now - (j- 1 )*'1 day'::interval)::time_interval,
    'value '||i||' '||j
from generate_series(  1 ,  500  ) as i, generate_series(  1 ,  400  ) as j,
     ( select date_trunc('day', now()) as now ) as t;

select * from test1 where id =  333  and period = now()::timestamp-'10 week'::interval;
id; period; value
--------------------------------------------------------
 333 ;"(" 2008 - 09 - 15   00 : 00 : 00 "," 2008 - 09 - 16   00 : 00 : 00 ")";"value 333 70"

explain analyze select * from test1 where id =  333  and period = now()::timestamp-'10 week'::interval;
---------------------------------------------------
"Index Scan using uix on test1  (cost=0.26..338.95 rows=196 width=49) (actual time=0.402..0.407 rows=1 loops=1)"
"  Index Cond: ((id = 333) AND (period = ((now())::timestamp without time zone - '70 days'::interval)))"
"Total runtime: 0.492 ms"

explain analyze select * from test1 where id =  333  and
	    (period).start <= now()::timestamp-'10 week'::interval 
	and (period).stop > now()::timestamp-'10 week'::interval;
----------------------------------------------------
"Index Scan using ix on test1  (cost=0.01..233.28 rows=44 width=49) (actual time=0.933..0.935 rows=1 loops=1)"
"  Index Cond: ((id = 333) AND ((period).start <= ((now())::timestamp without time zone - '70 days'::interval)))"
"  Filter: ((period).stop > ((now())::timestamp without time zone - '70 days'::interval))"
"Total runtime: 0.886 ms"

insert into test1( id, period, value )
select  333 , (now() - '11 day'::interval, now() - '10 day'::interval)::time_interval,
    'value '|| 333 ||' '|| 10 ;
----------------------------------------------------
ERROR:  duplicate key value violates unique constraint "uix"

********** Ошибка **********

ERROR: duplicate key value violates unique constraint "uix"
SQL state:  23505 

Как видим, целостность можно обеспечить.
Равно как и ускорить поиск, задействующий id, приблизительно в два раза.

А вот выбор среза быстрее с одним индексом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
explain analyze select * from test1 where period = now()::timestamp-'10 week'::interval;
---------------------------------------------------------------------------------------
"Index Scan using uix on test1  (cost=0.26..16802.73 rows=100000 width=49) (actual time=1.637..789.308 rows=500 loops=1)"
"  Index Cond: (period = ((now())::timestamp without time zone - '70 days'::interval))"
"Total runtime: 789.974 ms"

explain analyze select * from test1 where
	    (period).start <= now()::timestamp-'10 week'::interval 
	and (period).stop > now()::timestamp-'10 week'::interval;
---------------------------------------------------------------------------------------
"Bitmap Heap Scan on test1  (cost=1241.84..5303.85 rows=22222 width=49) (actual time=115.540..458.447 rows=500 loops=1)"
"  Recheck Cond: ((period).start <= ((now())::timestamp without time zone - '70 days'::interval))"
"  Filter: ((period).stop > ((now())::timestamp without time zone - '70 days'::interval))"
"  ->  Bitmap Index Scan on ix1  (cost=0.00..1236.28 rows=66667 width=0) (actual time=114.911..114.911 rows=165500 loops=1)"
"        Index Cond: ((period).start <= ((now())::timestamp without time zone - '70 days'::interval))"
"Total runtime: 459.885 ms"
Однако это потому, что нельзя построить btree индекс по полю period без поля id - пересекающиеся периоды не поддерживаются.
Однако, думаю можно будет прикрутить GIST индекс - по аналогии с RTree индексами.
...
Рейтинг: 0 / 0
4 сообщений из 129, страница 6 из 6
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / История одна дата vs две. Что лучше?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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