Unneccessary index recreation occur when doing DDL "Alter table <T> alter <F> 
set | drop default" and <F> is indexed field
--------------------------------------------------------------------------------------------------------------------------

                 Key: CORE-4971
                 URL: http://tracker.firebirdsql.org/browse/CORE-4971
             Project: Firebird Core
          Issue Type: Bug
            Reporter: Pavel Zotov


When table has data and some of its fields ( say, "S" ) has index, excessive 
reads, writes, fetches and marks will occur while doing "alter table alter <S> 
set | drop default". Perhaps this is due to recreation of index though set/drop 
default value does not require this.


Test:
====

recreate table mon_log(
    measure smallint
    ,description varchar(50)
    ,dts timestamp
    ,trn int
    ,reads int
    ,writes int
    ,fetches int
    ,marks int
);
commit;

create or alter view v_mon_log as
select     
     current_timestamp dts
    ,current_transaction trn
    ,i.mon$page_reads reads
    ,i.mon$page_writes writes     
    ,i.mon$page_fetches fetches     
    ,i.mon$page_marks marks     
from mon$attachments a
left join mon$io_stats i on a.mon$stat_id=i.mon$stat_id
where
  a.mon$attachment_id = current_connection
;
commit;

recreate table test(s varchar(1000));
create index test_s on test(s);

insert into mon_log(
     measure
    ,description
    ,dts
    ,trn
    ,reads
    ,writes
    ,fetches
    ,marks
)
select 1, 'After create table & index', v.*
from v_mon_log v;

commit;

alter table test alter s set default 'qwerty';

insert into mon_log(
     measure
    ,description
    ,dts
    ,trn
    ,reads
    ,writes
    ,fetches
    ,marks
)
select 1, 'After alter table alter s add default <value>', v.*
from v_mon_log v;

commit;

alter table test alter s drop default;

insert into mon_log(
     measure
    ,description
    ,dts
    ,trn
    ,reads
    ,writes
    ,fetches
    ,marks
)
select 1, 'After alter table alter s drop default', v.*
from v_mon_log v;

commit;

----------------------------------------------------------------

insert into test select rpad('', 1000, uuid_to_char(gen_uuid())) from 
rdb$types,(select 1 i from rdb$types rows 30);
commit;

----------------------------------------------------------------

insert into mon_log(
     measure
    ,description
    ,dts
    ,trn
    ,reads
    ,writes
    ,fetches
    ,marks
)
select 2, 'After insert N rows into table', v.*
from v_mon_log v;

commit;

alter table test alter s set default 'qwerty';

insert into mon_log(
     measure
    ,description
    ,dts
    ,trn
    ,reads
    ,writes
    ,fetches
    ,marks
)
select 2, 'After alter table alter s add default <value>', v.*
from v_mon_log v;

commit;

alter table test alter s drop default;

insert into mon_log(
     measure
    ,description
    ,dts
    ,trn
    ,reads
    ,writes
    ,fetches
    ,marks
)
select 2, 'After alter table alter s drop default', v.*
from v_mon_log v;

commit;

set list on;

select
 g.measure
,g.description
,g.dts
,g.trn
,g.reads - lag(g.reads)over(partition by g.measure order by g.dts) diff_reads
,g.writes - lag(g.writes)over(partition by g.measure order by g.dts) diff_writes
,g.fetches - lag(g.fetches)over(partition by g.measure order by g.dts) 
diff_fetches
,g.marks - lag(g.marks)over(partition by g.measure order by g.dts) diff_marks
from mon_log g
;

Result:
======

MEASURE                         1
DESCRIPTION                     After create table & index
DTS                             2015-10-21 23:48:46.5780
TRN                             14
DIFF_READS                      <null>
DIFF_WRITES                     <null>
DIFF_FETCHES                    <null>
DIFF_MARKS                      <null>

MEASURE                         1
DESCRIPTION                     After alter table alter s add default <value>
DTS                             2015-10-21 23:48:46.6400
TRN                             18
DIFF_READS                      6
DIFF_WRITES                     22
DIFF_FETCHES                    313
DIFF_MARKS                      37

MEASURE                         1
DESCRIPTION                     After alter table alter s drop default
DTS                             2015-10-21 23:48:46.7030
TRN                             21
DIFF_READS                      0
DIFF_WRITES                     16
DIFF_FETCHES                    300
DIFF_MARKS                      33

MEASURE                         2
DESCRIPTION                     After insert N rows into table
DTS                             2015-10-21 23:49:54.0780
TRN                             26
DIFF_READS                      <null>
DIFF_WRITES                     <null>
DIFF_FETCHES                    <null>
DIFF_MARKS                      <null>

MEASURE                         2
DESCRIPTION                     After alter table alter s add default <value>
DTS                             2015-10-21 23:49:59.7340
TRN                             28
DIFF_READS                      1666
DIFF_WRITES                     1282
DIFF_FETCHES                    24837
DIFF_MARKS                      4873

MEASURE                         2
DESCRIPTION                     After alter table alter s drop default
DTS                             2015-10-21 23:50:05.1400
TRN                             31
DIFF_READS                      1132
DIFF_WRITES                     1282
DIFF_FETCHES                    22812
DIFF_MARKS                      3848


1. Compare values of DIFF_* columns with the same suffixes for records with:

1) TRN = 18 vs 28  ("After alter table alter s add default <value>") 
and 
2) TRN = 21 vs 31  ("After alter table alter s drop default")

-- all of these values have too big or even undefined due to zero-division 
ratio ( 1666 : 6; 1282 : 22;  24837 : 313 etc).

2. Query: 

select rdb$statistics from rdb$indices where rdb$index_name='TEST_S'; 

-- gives (begin issued after all steps):

RDB$STATISTICS                  0.0001312335953116417

This looks like index TEST_S was recreated, because statistics should be zero 
(because it does not auto updated when we modify table AFTER its index has been 
created - this is well known FB feature).

3. Trace statistics sample for "alter table alter s add default <...>": note 
that there was "delay" about 8 (eight) seconds between two adjacent events:

2015-10-21T23:01:39.2340 (1200:01822A08) EXECUTE_STATEMENT_FINISH
        e30 (ATT_34, SYSDBA:NONE, NONE, TCPv4:192.168.0.107)
        C:\1INSTALL\FIREBIRD\fb30sS\isql.exe:3132
                (TRA_0, CONCURRENCY | WAIT | READ_WRITE)

Statement 35:
-------------------------------------------------------------------------------
 select rel.rdb$relation_id, rel.rdb$relation_type from rdb$indices idx join 
rdb$relations rel using (rdb$relation_name) where idx.rdb$index_name = ?   and 
rel.rdb$relation_id is not null

param0 = varchar(93), "TEST_S"

1 records fetched
      0 ms, 8 fetch(es)

Table                             Natural     Index    Update    Insert    
Delete   Backout     Purge   Expunge
***************************************************************************************************************
RDB$INDICES                                       1                             
                               
RDB$RELATIONS                                     1                             
                               

2015-10-21T23:01:47.2500 (1200:01822A08) PREPARE_STATEMENT
        e30 (ATT_34, SYSDBA:NONE, NONE, TCPv4:192.168.0.107)
        C:\1INSTALL\FIREBIRD\fb30sS\isql.exe:3132
                (TRA_0, CONCURRENCY | WAIT | READ_WRITE)

Statement 47:
-------------------------------------------------------------------------------
 select rel.rdb$relation_id, rel.rdb$relation_type from rdb$indices idx join 
rdb$relations rel using (rdb$relation_name) where idx.rdb$index_name = ?   and 
rel.rdb$relation_id is not null
      1 ms
. . .


PS.  WI-V3.0.0.32081

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to