powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Оптимальная структура таблицы для хранения истории...
25 сообщений из 95, страница 3 из 4
Оптимальная структура таблицы для хранения истории...
    #35734911
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely,

я вас за язык не тянул.

вам очевидные вещи нужно продемонстрировать?

Код: 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.
drop table expla1_tmp;
drop table expla2_tmp;
create table expla1_tmp
(
  oid number,
  frd date,
  tod date
);

create table expla2_tmp
(
  oid number,
  frd date,
  op char( 1 )
);


insert into expla1_tmp
(select level, sysdate - level, sysdate - level +  1 
from dual
connect by level <  1000000 );

insert into expla2_tmp
select oid, frd, 'B'
from expla1_tmp
union all
select oid, tod, 'E'
from expla1_tmp
;

commit;
set timing on
select oid
  from
    expla1_tmp
  where
    sysdate- 5  between frd and tod;

select oid
  from
    expla2_tmp m
  where
    op = 'B'
    and (oid, frd) in
    ( select i.oid, max(i.frd)
        from
          expla2_tmp i
        where
          i.frd <= sysdate- 5 
        group by i.oid
    )
union
select oid
  from
    expla2_tmp m
  where
    op = 'B'
    and frd between sysdate- 5  and sysdate- 4 ;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> set timing on
SQL> select oid
  2    from
  3      expla1_tmp
  4    where
  5      sysdate-5 between frd and tod;

no rows selected

Elapsed: 00:00:00.57
SQL> 

Завершение второго запроса пока ожидаю....

Ещё нужны доводы?
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35735100
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Те же яйца только с индексом... и свой запрос исправил (не оттуда его скопировал).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create index expla1_ix_tmp
on expla1_tmp(oid, frd, tod);

create index expla2_ix_tmp
on expla2_tmp(oid, frd);


set timing on
select oid
  from
     expla1_tmp
  where
    sysdate- 5  <= tod and frd <= sysdate- 4 ;

Код: 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.
       OID
----------
         4
         5

Elapsed: 00:00:01.04

SQL> 
SQL> select oid
  2    from
  3      expla2_tmp m
  4    where
  5      op = 'B'
  6      and (oid, frd) in
  7      ( select i.oid, max(i.frd)
  8          from
  9            expla2_tmp i
 10          where
 11            i.frd <= sysdate-5
 12          group by i.oid
 13      )
 14  union
 15  select oid
 16    from
 17      expla2_tmp m
 18    where
 19      op = 'B'
 20      and frd between sysdate-5 and sysdate-4;

       OID
----------
         4
         5

Elapsed: 00:00:31.64

20:5 и 31:1 - неплохой результат.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35735378
Фотография Dogen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boottyВопрос в структуре для хранения истории событий . Разрешение/запрещение доступа, изменение цены товара, изменение какого-либо признака сущности с какого-то момента.

А здесь почему-то все прицепились к одному конкретному примеру...
Не побоюсь сказать банальность, но ответ содержится в вопросе.

Что касается необходимости отражать в структуре БД состояния - для обсуждения этого аспекта вы слишком узко (или наоборот, неконкретно? :) ) ставите вопросы.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35735386
Фотография Dogen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
йййййййййЗа еду нельзя работать, даже в кризис.

Когда как, товарищ. Рады за то, что вы можете делать такие заявления.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35736516
Фотография bootty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DogenЧто касается необходимости отражать в структуре БД состояния - для обсуждения этого аспекта вы слишком узко (или наоборот, неконкретно? :) ) ставите вопросы.Согласен, виноват. Но ниже уже было другое:boottyИнтересуют и события, и состояния. Предполагаю, чаще будет требоваться знать состояние.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35736953
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expla,
Более реальные тестовые данные.
Но до тех пор, пока FULL TABLE SCAN будет выгоднее досьупа по индексу, тестировать бесполезно.

Код: 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.
drop index index expla1_ix_tmp
/
drop index index expla2_ix_tmp
/
drop table expla1_tmp
/
drop table expla2_tmp
/

--truncate table expla1_tmp
--/
--truncate table expla2_tmp
--/
create table expla1_tmp
(
  oid number,
  frd date,
  tod date
)
/
create table expla2_tmp
(
  oid number,
  frd date,
  op char( 1 )
)
/


-- создаем тестовые данные так, что объектов 100 видов,
-- длительность предоставления доступа - 50 дней.
insert into expla1_tmp
select mod(level, 100 ), sysdate - level, sysdate - level +  50 
from dual
connect by level <  1000000 
/
insert into expla2_tmp
select oid, frd, 'B'
from expla1_tmp
union all
-- Добавляем только случившиеся отключения доступа --
select oid, tod, 'E'
from expla1_tmp
where tod < sysdate
/

create index expla1_ix_tmp
on expla1_tmp(oid, frd, tod)
/

create index expla2_ix_tmp
on expla2_tmp(oid, frd)
/

-- Собираем статистику, не забываем про CBO --
analyze table  expla1_tmp  compute statistics
/
analyze table expla2_tmp  compute statistics
/
analyze index expla1_ix_tmp  compute statistics
/
analyze index expla2_ix_tmp  compute statistics
/


теперь, собственно запросы.

Код: 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.
SQL> set autotrace on
SQL> select oid
   2     from
   3        expla1_tmp
   4     where
   5       sysdate- 50000  <= tod and frd <= sysdate- 50000 + 60 ;

       OID
----------
         40 
......
         49 

 110  rows selected.


Execution Plan
----------------------------------------------------------
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 788  Card= 2500  Bytes=
           40000 )

    1      0    TABLE ACCESS (FULL) OF 'EXPLA1_TMP' (Cost= 788  Card= 2500  By
          tes= 40000 )





Statistics
----------------------------------------------------------
           0   recursive calls
           0   db block gets
        3345   consistent gets
        3330   physical reads
           0   redo size
        1410   bytes sent via SQL*Net to client
         572   bytes received via SQL*Net from client
          18   SQL*Net roundtrips to/from client
           0   sorts (memory)
           0   sorts (disk)
         110   rows processed

SQL> 
SQL> 

SQL> 
SQL> select oid  
   2   from  expla2_tmp m  
   3   where  op = 'B'
   4     and (oid, frd) in  ( select i.oid, max(i.frd)  from expla2_tmp i 
   5                          where  i.frd <= sysdate- 5000   group by i.oid) 
   6   union all  
   7   select oid from  expla2_tmp m1
   8   where m1.op = 'B' and m1.frd between sysdate- 5000  and sysdate- 5000 + 60 
   9   ;

       OID
----------
          0 
          1 
          2 
.....
         98 
         99 

 110  rows selected.


Execution Plan
----------------------------------------------------------
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 2605  Card= 2501  Bytes
          = 25032 )

    1      0    UNION-ALL
    2      1      TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA2_TMP' (Cost= 4  Ca
          rd= 1  Bytes= 10 )

    3      2        NESTED LOOPS (Cost= 1404  Card= 1  Bytes= 32 )
    4      3          VIEW OF 'VW_NSO_1' (Cost= 1202  Card= 100  Bytes= 2200 )
    5      4            SORT (GROUP BY) (Cost= 1202  Card= 100  Bytes= 900 )
    6      5              TABLE ACCESS (FULL) OF 'EXPLA2_TMP' (Cost= 1195  C
          ard= 99997  Bytes= 899973 )

    7      3          INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (NON-UNIQUE) (
          Cost= 3  Card= 1 )

    8      1      FILTER
    9      8        TABLE ACCESS (FULL) OF 'EXPLA2_TMP' (Cost= 1201  Card= 25 
           00  Bytes= 25000 )





Statistics
----------------------------------------------------------
           0   recursive calls
           0   db block gets
       10175   consistent gets
        9278   physical reads
           0   redo size
        1410   bytes sent via SQL*Net to client
         572   bytes received via SQL*Net from client
          18   SQL*Net roundtrips to/from client
           1   sorts (memory)
           0   sorts (disk)
         110   rows processed

SQL> 
SQL> 
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35737037
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Belyexpla,
Более реальные тестовые данные.
Но до тех пор, пока FULL TABLE SCAN будет выгоднее досьупа по индексу, тестировать бесполезно.


Сделай стенд, чтобы полезно было. А то выходит, что ты гол в свои ворота забил.

Индекс тут не используется не только и не столько из-за того что "выгоднее", а по фундаментальной причине.

Что время то не замерил? Пока я вижу Cost 2605:788 - многообещающее начало.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35737170
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
explaСделай стенд, чтобы полезно было. А то выходит, что ты гол в свои ворота забил. Не у всех есть куча времени, чтобы его тратить на исследования.
У меня его пока нет.

explaИндекс тут не используется не только и не столько из-за того что "выгоднее", а по фундаментальной причине.Это что за "фундаментальная причина" по которой в такой таблице не используется индекс?

explaЧто время то не замерил? Пока я вижу Cost 2605:788 - многообещающее начало. А что, consistent gets и physical reads - не подходят?
Время может от чего угодно зависеть, в том числе от текущей нагрузки на сервер, чертыханий на клиента, закупоренности сетки итд.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35737253
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely,

1) понимаю... ведь тебе кучу кода писать приходится.

2) например так
Код: plaintext
1.
2.
alter table expla1_tmp modify (oid not null);
alter table expla2_tmp modify (oid not null);

3)
кого бодает consistent gets, physical reads кроме разработчика и DBA?

physical reads не сложно свести к 0.

что бы нивелировать влияние случайных факторов, к результату эксперимента применяют методы статистической обработки.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35737531
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expla1) понимаю... ведь тебе кучу кода писать приходится.

[quot expla]кого бодает consistent gets, physical reads кроме разработчика и DBA?Мэээ... ну так мы на SQL.ru вроде а не на BLONDINKA.ru

вобщем - вот тестовые данные.
Добавлена строка сообщения, чтобы таблица не состояла из одних полей по которым идет поиск.
Кроме этого - переделан индекс по таблице с одной датой.

Код: 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.
drop table expla1_tmp
/
drop table expla2_tmp
/

create table expla1_tmp
(
  oid number NOT NULL,
  frd date NOT NULL,
  tod date NOT NULL,
  msg varchar2( 600 )
)
/
create table expla2_tmp
(
  oid number NOT NULL,
  frd date NOT NULL,
  op char( 1 ) NOT NULL,
  msg varchar2( 600 )
)
/


-- создаем тестовые данные так, что объектов 100 видов,
-- длительность предоставления доступа - 50 дней.
insert into expla1_tmp
select mod(level, 100 ), sysdate - level, sysdate - level +  50 
, 'Сообщение о предоставлении доступа к объекту:('||mod(level, 100 )||')'
from dual
connect by level <  1000000 
/
insert into expla2_tmp
select oid, frd, 'B', 'Сообщение о предоставлении доступа к объекту:('||oid||')'
from expla1_tmp
union all
-- Добавляем только случившиеся отключения доступа --
select oid, tod, 'E', 'Сообщение о снятии доступа к объекту:('||oid||')'
from expla1_tmp
where tod < sysdate
/

create index expla1_ix_tmp
on expla1_tmp(oid, frd, tod)
/

create index expla2_ix_tmp
on expla2_tmp(frd, oid)
/

-- Собираем статистику, не забываем про CBO --
analyze table  expla1_tmp  compute statistics
/
analyze table expla2_tmp  compute statistics
/
analyze index expla1_ix_tmp  compute statistics
/
analyze index expla2_ix_tmp  compute statistics
/

Далее запросы - поиск в диапазоне.
Код: 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.
SQL> 
SQL> set autotrace on
SQL> select *  from  expla1_tmp
   2   where   sysdate- 500000  <= tod and frd <= sysdate- 500000 + 60 ;

       OID FRD       TOD
---------- --------- ---------
MSG
--------------------------------------------------------------------------------
         40   10 -MAR- 40   29 -APR- 40 
Сообщение о предоставлении доступа к объекту:( 40 )
......

         49   22 -NOV- 39   11 -JAN- 40 
Сообщение о предоставлении доступа к объекту:( 49 )


 110  rows selected.


Execution Plan
----------------------------------------------------------
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 3502  Card= 2500  Bytes
          = 260000 )

    1      0    TABLE ACCESS (FULL) OF 'EXPLA1_TMP' (Cost= 3502  Card= 2500  B
          ytes= 260000 )





Statistics
----------------------------------------------------------
           0   recursive calls
           0   db block gets
       15724   consistent gets
       15706   physical reads
           0   redo size
       13091   bytes sent via SQL*Net to client
         572   bytes received via SQL*Net from client
          18   SQL*Net roundtrips to/from client
           0   sorts (memory)
           0   sorts (disk)
         110   rows processed

SQL> 
SQL> 

SQL> 
SQL> select * from  expla2_tmp m  
   2   where  op = 'B'  
   3     and (oid, frd) in  ( select i.oid, max(i.frd)  from expla2_tmp i 
   4                          where  i.frd <= sysdate- 500000   group by i.oid) 
   5   union all
   6   select * from  expla2_tmp m1
   7   where m1.op = 'B' and m1.frd between sysdate- 500000  and sysdate- 500000 + 60 
   8   ;

       OID FRD       O
---------- --------- -
MSG
--------------------------------------------------------------------------------
          0   19 -APR- 95  B
Сообщение о предоставлении доступа к объекту:( 0 )
......................

         40   10 -MAR- 40  B
Сообщение о предоставлении доступа к объекту:( 40 )


 110  rows selected.


Execution Plan
----------------------------------------------------------
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 6431  Card= 2501  Bytes
          = 225112 )

    1      0    UNION-ALL
    2      1      TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA2_TMP' (Cost= 4  Ca
          rd= 1  Bytes= 90 )

    3      2        NESTED LOOPS (Cost= 367  Card= 1  Bytes= 112 )
    4      3          VIEW OF 'VW_NSO_1' (Cost= 66  Card= 100  Bytes= 2200 )
    5      4            SORT (GROUP BY) (Cost= 66  Card= 100  Bytes= 900 )
    6      5              INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (NON-UNIQU
          E) (Cost= 59  Card= 99997  Bytes= 899973 )

    7      3          INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (NON-UNIQUE) (
          Cost= 3  Card= 1 )

    8      1      FILTER
    9      8        TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA2_TMP' (Cost= 60 
           64  Card= 2500  Bytes= 225000 )

   10      9          INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (NON-UNIQUE) (
          Cost= 31  Card= 9000 )





Statistics
----------------------------------------------------------
           0   recursive calls
           0   db block gets
        3423   consistent gets
        3078   physical reads
           0   redo size
       12574   bytes sent via SQL*Net to client
         572   bytes received via SQL*Net from client
          18   SQL*Net roundtrips to/from client
           1   sorts (memory)
           0   sorts (disk)
         110   rows processed

SQL> 

И еще - другая дата (для таблицы с одной датой)
Код: 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.
SQL> 
SQL> select * from  expla2_tmp m  
   2   where  op = 'B'  
   3     and (oid, frd) in  ( select i.oid, max(i.frd)  from expla2_tmp i 
   4                          where  i.frd <= sysdate- 900000   group by i.oid) 
   5   union all
   6   select * from  expla2_tmp m1
   7   where m1.op = 'B' and m1.frd between sysdate- 900000  and sysdate- 900000 + 60 
   8   ;

       OID FRD       O
---------- --------- -
MSG
--------------------------------------------------------------------------------
          0   19 -NOV- 56  B
Сообщение о предоставлении доступа к объекту:( 0 )
..............
         40   18 -JAN- 55  B
Сообщение о предоставлении доступа к объекту:( 40 )


 110  rows selected.


Execution Plan
----------------------------------------------------------
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 6431  Card= 2501  Bytes
          = 225112 )

    1      0    UNION-ALL
    2      1      TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA2_TMP' (Cost= 4  Ca
          rd= 1  Bytes= 90 )

    3      2        NESTED LOOPS (Cost= 367  Card= 1  Bytes= 112 )
    4      3          VIEW OF 'VW_NSO_1' (Cost= 66  Card= 100  Bytes= 2200 )
    5      4            SORT (GROUP BY) (Cost= 66  Card= 100  Bytes= 900 )
    6      5              INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (NON-UNIQU
          E) (Cost= 59  Card= 99997  Bytes= 899973 )

    7      3          INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (NON-UNIQUE) (
          Cost= 3  Card= 1 )

    8      1      FILTER
    9      8        TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA2_TMP' (Cost= 60 
           64  Card= 2500  Bytes= 225000 )

   10      9          INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (NON-UNIQUE) (
          Cost= 31  Card= 9000 )





Statistics
----------------------------------------------------------
           0   recursive calls
           0   db block gets
         968   consistent gets
           8   physical reads
           0   redo size
       12574   bytes sent via SQL*Net to client
         572   bytes received via SQL*Net from client
          18   SQL*Net roundtrips to/from client
           1   sorts (memory)
           0   sorts (disk)
         110   rows processed

SQL> 

Заставить запрос ходить по индексу с двумя датами - мне так и не удалось.
Позже выложу еще запросы с поиском доступа н указанную дату, а не на диапазон.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35737708
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely,

Код: 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.
col msg noprint
set autotrace on
select /*+ index_ss(t expla1_ix_tmp) */ *
  from  expla1_tmp t
  where   sysdate-500000 <= tod and frd <= sysdate-500000+60;

       OID FRD      TOD                                                         
---------- -------- --------                                                    
         0 10.01.40 29.02.40                                                    
         1 09.01.40 28.02.40                                                    
...
        98 12.01.40 02.03.40                                                    
        99 11.01.40 01.03.40                                                    

110 rows selected.


Execution Plan
----------------------------------------------------------                      
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=112769 Card=250056 Bytes=26005824)                                                      
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA1_TMP' (TABLE) (Cost=112769 Card=250056 Bytes=26005824)                                  
   2    1     INDEX (SKIP SCAN) OF 'EXPLA1_IX_TMP' (INDEX) (Cost=75176 Card=250056)                                                         
                                                                                
Statistics
----------------------------------------------------------                      
          0  recursive calls                                                    
          0  db block gets                                                      
        2253  consistent gets 
          0  physical reads                                                     
          0  redo size                                                          
      12727  bytes sent via SQL*Net to client                                   
        330  bytes received via SQL*Net from client                             
          9  SQL*Net roundtrips to/from client                                  
          0  sorts (memory)                                                     
          0  sorts (disk)                                                       
        110  rows processed                                                     

SQL> 
select * from  expla2_tmp m
    where  op = 'B'
      and (oid, frd) in  ( select i.oid, max(i.frd)  from expla2_tmp i
                           where  i.frd <= sysdate-500000  group by i.oid)
    union all
    select * from  expla2_tmp m1
    where m1.op = 'B' and m1.frd between sysdate-500000 and sysdate-500000+60
;

       OID FRD      O                                                           
---------- -------- -                                                           
        44 27.11.39 B                                                           
...
        40 10.03.40 B                                                           

110 rows selected.


Execution Plan
----------------------------------------------------------                      
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=783 Card=112 Bytes=11180)                                                               
   1    0   UNION-ALL                                                           
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA2_TMP' (TABLE) (Cost=1 Card=1 Bytes=90)                                                
   3    2       NESTED LOOPS (Cost=764 Card=50 Bytes=5600)
   4    3         VIEW OF 'VW_NSO_1' (VIEW) (Cost=748 Card=100 Bytes=2200)                                                                  
   5    4           HASH (GROUP BY) (Cost=748 Card=100 Bytes=900)               
   6    5             INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (INDEX) (Cost=471 Card=999976 Bytes=8999784)                                    
   7    3         INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (INDEX) (Cost=1 Card=1)                                                             
   8    1     FILTER                                                            
   9    8       TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA2_TMP' (TABLE)           
          (Cost=19 Card=62 Bytes=5580)                                          
  10    9         INDEX (RANGE SCAN) OF 'EXPLA2_IX_TMP' (INDEX) (Cost=1 Card=124)                                                           

Statistics
----------------------------------------------------------                      
          0  recursive calls                                                    
          0  db block gets                                                      
        3442  consistent gets                                                     
          0  physical reads                                                     
          0  redo size                                                          
      12220  bytes sent via SQL*Net to client                                   
        330  bytes received via SQL*Net from client                             
          9  SQL*Net roundtrips to/from client                                  
          0  sorts (memory)                                                     
          0  sorts (disk)                                                       
        110  rows processed                                                     

SQL> spool off


если переделать индекс

Код: plaintext
1.
2.
3.
4.
5.
6.
drop index expla1_ix_tmp
/
create index expla1_ix_tmp
on expla1_tmp(frd, tod, oid)
/
analyze index expla1_ix_tmp  compute statistics
/

То получаем

Код: 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.
select *
    from  expla1_tmp t
  where   sysdate-500000 <= tod and frd <= sysdate-500000+60;



110 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=921 Card=250056 Bytes=26005824)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EXPLA1_TMP' (TABLE) (Cost=921 Card=250056 Bytes=26005824)
   2    1     INDEX (RANGE SCAN) OF 'EXPLA1_IX_TMP' (INDEX) (Cost=331 Card=250056)

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        2114  consistent gets 
          0  physical reads
          0  redo size
      12728  bytes sent via SQL*Net to client
        330  bytes received via SQL*Net from client
          9  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
        110  rows processed

И, ИМХО, из-за замены union на union all в запрос таки ошибочка закралась, в случае i.frd = sysdate-500000 запись задвоится.

3442:2114.... Я доволен.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35740226
RodionAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю таблицу:
ИмяТаблицы, ИмяПоля, ДатаИзменения, Значение поля, Комментарии

А уж дальше извлекать данные по конкретному полю конкретной таблицы процедурами или функциями.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35740239
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RodionATПредлагаю таблицу:
ИмяТаблицы, ИмяПоля, ДатаИзменения, Значение поля, Комментарии

А уж дальше извлекать данные по конкретному полю конкретной таблицы процедурами или функциями.
НЕ НАДО! В 1С 7.7 так и было, ничего хорошего. Потом в 8 версии от этого ушли
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35740243
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RodionATПредлагаю таблицу:
ИмяТаблицы, ИмяПоля, ДатаИзменения, Значение поля, Комментарии

А уж дальше извлекать данные по конкретному полю конкретной таблицы процедурами или функциями.предлагаю запихнуть в такую таблицу миллионов 70 строк и посмотреть как быстро состарится полтьзователь от ожидания данных от отчетов, которые используют такую таблицу.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35740246
Фотография proposed amendment
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RodionATПредлагаю таблицу:

боян первыйнах
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35768021
TsRV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, не ломайте голову над велосипедом!

Период актуальности (время жизни и т.п. - называйте как хотите) - либо вектор, либо отрезок .
Два поля типа дата/время с возможностью нести Null-значения и все проблемы проектирования БД решены. Остальные мелочи - задача программного кода.


P.S.: На сегодня, конечно, есть теория гиперрациональных чисел, где время - это пространство... Но оно вам надо???
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35768130
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsRVГоспода, не ломайте голову над велосипедом!

Период актуальности (время жизни и т.п. - называйте как хотите) - либо вектор, либо отрезок .
Два поля типа дата/время с возможностью нести Null-значения и все проблемы проектирования БД решены. Остальные мелочи - задача программного кода.


P.S.: На сегодня, конечно, есть теория гиперрациональных чисел, где время - это пространство... Но оно вам надо??? Это про Вас?
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35768349
TsRV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely Это про Вас?

Bely, вы всегда усложняете себе жизнь из-за пары миллисекунд? Формула-1?
А Вы не задумывались, что когда-то преемнику Вашего "достояния" придется его разгребать???
Хорошо, если Вы пишете частные задачи и в них 3-4 таблицы!..

По существу поставленного вопроса:
Первый вариант - как кадры на фото- или кинопленке. Для частных случаев вполне уместен.
Считаю второй вариант универсальным, расширяемым, более полно описывающим историзм и понятным .

А быстродействие запроса - это еще спорный вопрос...
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35768351
TsRV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TsRVBely Это про Вас?

Bely, вы всегда усложняете себе жизнь из-за пары миллисекунд? Формула-1?
А Вы не задумывались, что когда-то преемнику Вашего "достояния" придется его разгребать???
Хорошо, если Вы пишете частные задачи и в них 3-4 таблицы!..

По существу поставленного вопроса:
Первый вариант - как кадры на фото- или кинопленке. Для частных случаев вполне уместен.
Считаю второй вариант универсальным, расширяемым, более полно описывающим историзм и понятным .

А быстродействие запроса - это еще спорный вопрос...

Извиняюсь, варианты перепутал с пылу-жару...
Фотопленка - второй вариант. Первый предпочтительней.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35768773
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsRVBely, вы всегда усложняете себе жизнь из-за пары миллисекунд? Формула-1?
А Вы не задумывались, что когда-то преемнику Вашего "достояния" придется его разгребать???
Хорошо, если Вы пишете частные задачи и в них 3-4 таблицы!..

По существу поставленного вопроса:
Первый вариант - как кадры на фото- или кинопленке. Для частных случаев вполне уместен.
Считаю второй вариант универсальным, расширяемым, более полно описывающим историзм и понятным .

А быстродействие запроса - это еще спорный вопрос...Судя по вашему ответу - вы с проблемой производительности при поиске по логу не сталкивались.
А у нас лог вот уже к полусотне миллионов строк подбирается.
И я не могу сказать пользователю, что отчет готовится медленно, но зато верно.
Приходится предпринимать меры, чтобы отчет готовился в ПРИЕМЛЕМОЕ время.
Да и размер табличек и индексов на таких объемах начинает становиться не таким безразличным.

PS: что касается кино и фото - если бы кино было бы настолько круто, то оно бы выдавило уже фото. Но у фотографий есть такие варианты использования, которые никогда нельзя будет выжать из кино. Подумайте о больших выдержках затвора...
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35768836
TsRV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BelyА у нас лог вот уже к полусотне миллионов строк подбирается.

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

BelyПодумайте о больших выдержках затвора...

Углубляться в мелочи можно до бесконечности. Об этом написано много специализированной литературы. В таком понимании мира - можно и бит разбить на составные части...


P.S.: Вы явно работаете не с тиражным ПО...
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35769076
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsRVBelyА у нас лог вот уже к полусотне миллионов строк подбирается.Не проще лог раскидать по периодам или вообще элементарно - в архив? Уверен, для оперативной работы необходимы лишь несколько сотен, может тысяч, последних записей...Ну, сносить в архив дело хорошее, но вот только прозрачность теряется. И приходится генерить запросы вида
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ... FROM log_1 
UNION ALL
SELECT ... FROM log_2
UNION ALL
SELECT ... FROM log_3 
UNION ALL
SELECT ... FROM log_arch
Что не добавляет прозрачности пониманию запросов и не всегда становится быстрее.

PS: судя по тому, что вы не сказали слово партиционирование, то оно вам не знакомо :)

TsRVBelyПодумайте о больших выдержках затвора...Углубляться в мелочи можно до бесконечности. Об этом написано много специализированной литературы. В таком понимании мира - можно и бит разбить на составные части... Чтобы понимать особенности - надо знать частности.
Все знают арифметику, но не все могут работать финансовыми директорами и бухгалтерами.

Почитайте еще вот это

TsRVP.S.: Вы явно работаете не с тиражным ПО...Я видел достаточно много тиражных систем, которые используют те же самые механизмы, что и наша нетиражная.
Так что это ровным счетом ничего не значит, кроме того, что у меня больше маневра - мы можем переделать нашу систему.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35769312
TsRV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BelyНу, сносить в архив дело хорошее, но вот только прозрачность теряется. И приходится генерить запросы...
Bely, вы противоречите сами себе. А Ваши примеры реализации, описанные выше, не теряют прозрачности и не требуют генерации запросов?
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35769388
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsRVBelyНу, сносить в архив дело хорошее, но вот только прозрачность теряется. И приходится генерить запросы...Bely, вы противоречите сами себе. А Ваши примеры реализации, описанные выше, не теряют прозрачности и не требуют генерации запросов?Вы правильно поняли. НЕ теряют прозрачности и НЕ требуют запросов с UNION -ами по нескольким таблицам.
...
Рейтинг: 0 / 0
Оптимальная структура таблицы для хранения истории...
    #35769419
TsRV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely
SQL> select * from expla2_tmp m
2 where op = 'B'
3 and (oid, frd) in ( select i.oid, max(i.frd) from expla2_tmp i
4 where i.frd <= sysdate-900000 group by i.oid)
5 union all
6 select * from expla2_tmp m1
7 where m1.op = 'B' and m1.frd between sysdate-900000 and sysdate-900000+60
8 ;


Если это Вы считаете "прозрачным", то что для вас " НЕ прозрачное"?
...
Рейтинг: 0 / 0
25 сообщений из 95, страница 3 из 4
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Оптимальная структура таблицы для хранения истории...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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