Mamta A. Satoor created DERBY-5702:
--------------------------------------
Summary: Creating a foreign key constraint does not automatically
create a statistics row if foreign key constraint will share a backing index
created for a primary key
Key: DERBY-5702
URL: https://issues.apache.org/jira/browse/DERBY-5702
Project: Derby
Issue Type: Bug
Components: SQL
Affects Versions: 10.8.2.2
Reporter: Mamta A. Satoor
When a foreign key constraints is created on a column which already has a
primary key constraint, the statistics for foreign key constraint do not get
created automatically. Have to run update statistics by hand to add statistics
for foreign key constraint. I hope my understanding of statistics creation is
correct in this regards. Following script shows the issue
java -Dderby.storage.indexStats.auto=false -Dij.exceptionTrace=true
org.apache.derby.tools.ij
connect 'jdbc:derby:db1;create=true';
CREATE TABLE TEST_TAB_1
(
ID INTEGER NOT NULL primary key
);
CREATE TABLE TEST_TAB_2
(
ID INTEGER not null, ID1 INTEGER not null
);
insert into TEST_TAB_1 values (1);
insert into test_tab_2 values(1,1);
CALL SYSCS_UTIL.SYSCS_UPDATE_STATISTICS('APP','TEST_TAB_1', null);
CALL SYSCS_UTIL.SYSCS_UPDATE_STATISTICS('APP','TEST_TAB_2', null);
--At this point, we will find statistics row for primary key constraint on
TEST_TAB_1
select
c.TABLEID,
c.CONGLOMERATENUMBER,
c.CONGLOMERATENAME,
c.ISINDEX,
c.ISCONSTRAINT,
c.CONGLOMERATEID,
t.TABLEID,
t.TABLENAME,
t.TABLETYPE,
s.STATID,
s.REFERENCEID,
s.TABLEID,
s.CREATIONTIMESTAMP,
s.TYPE,
s.VALID,
s.COLCOUNT,
CAST(STATISTICS AS VARCHAR(40)) as STATISTICS
from sys.SYSCONGLOMERATES c join sys.SYSTABLES t on c.TABLEID = t.TABLEID join
sys.SYSSTATISTICS s on s.TABLEID = t.TABLEID
where t.TABLENAME = 'TEST_TAB_1' and c.ISINDEX = false;
--Now create primary key constraint on TEST_TAB_2
ALTER TABLE TEST_TAB_2
ADD CONSTRAINT TEST_TAB_2_PK_1
PRIMARY KEY (id);
--At this point, we will find statistics row for primary key constraint on
TEST_TAB_2
select
c.TABLEID,
c.CONGLOMERATENUMBER,
c.CONGLOMERATENAME,
c.ISINDEX,
c.ISCONSTRAINT,
c.CONGLOMERATEID,
t.TABLEID,
t.TABLENAME,
t.TABLETYPE,
s.STATID,
s.REFERENCEID,
s.TABLEID,
s.CREATIONTIMESTAMP,
s.TYPE,
s.VALID,
s.COLCOUNT,
CAST(STATISTICS AS VARCHAR(40)) as STATISTICS
from sys.SYSCONGLOMERATES c join sys.SYSTABLES t on c.TABLEID = t.TABLEID join
sys.SYSSTATISTICS s on s.TABLEID = t.TABLEID
where t.TABLENAME = 'TEST_TAB_2' and c.ISINDEX = false;
--Now if we create a foreign key constraint on TEST_TAB_2(ID), there will be no
statistics created for it.
ALTER TABLE TEST_TAB_2
ADD CONSTRAINT TEST_TAB_2_FK_1
FOREIGN KEY(id) REFERENCES TEST_TAB_1(id);
--still only one statistics row for TEST_TAB_2
select
c.TABLEID,
c.CONGLOMERATENUMBER,
c.CONGLOMERATENAME,
c.ISINDEX,
c.ISCONSTRAINT,
c.CONGLOMERATEID,
t.TABLEID,
t.TABLENAME,
t.TABLETYPE,
s.STATID,
s.REFERENCEID,
s.TABLEID,
s.CREATIONTIMESTAMP,
s.TYPE,
s.VALID,
s.COLCOUNT,
CAST(STATISTICS AS VARCHAR(40)) as STATISTICS
from sys.SYSCONGLOMERATES c join sys.SYSTABLES t on c.TABLEID = t.TABLEID join
sys.SYSSTATISTICS s on s.TABLEID = t.TABLEID
where t.TABLENAME = 'TEST_TAB_2' and c.ISINDEX = false;
--Running statistics creation by hand will create 2nd statistics row for
TEST_TAB_2
CALL SYSCS_UTIL.SYSCS_UPDATE_STATISTICS('APP','TEST_TAB_2', null);
-- now will have 2 statistics rows for TEST_TAB_2
select
c.TABLEID,
c.CONGLOMERATENUMBER,
c.CONGLOMERATENAME,
c.ISINDEX,
c.ISCONSTRAINT,
c.CONGLOMERATEID,
t.TABLEID,
t.TABLENAME,
t.TABLETYPE,
s.STATID,
s.REFERENCEID,
s.TABLEID,
s.CREATIONTIMESTAMP,
s.TYPE,
s.VALID,
s.COLCOUNT,
CAST(STATISTICS AS VARCHAR(40)) as STATISTICS
from sys.SYSCONGLOMERATES c join sys.SYSTABLES t on c.TABLEID = t.TABLEID join
sys.SYSSTATISTICS s on s.TABLEID = t.TABLEID
where t.TABLENAME = 'TEST_TAB_2' and c.ISINDEX = false;
--If I create foreign key on a column that does not share backing index with
primary key, stats will get created automatically
ALTER TABLE TEST_TAB_2
ADD CONSTRAINT TEST_TAB_2_FK_2
FOREIGN KEY(id1) REFERENCES TEST_TAB_1(id);
--will have additional constraint row for new foreign key constraint on
TEST_TAB_2
select
c.TABLEID,
c.CONGLOMERATENUMBER,
c.CONGLOMERATENAME,
c.ISINDEX,
c.ISCONSTRAINT,
c.CONGLOMERATEID,
t.TABLEID,
t.TABLENAME,
t.TABLETYPE,
s.STATID,
s.REFERENCEID,
s.TABLEID,
s.CREATIONTIMESTAMP,
s.TYPE,
s.VALID,
s.COLCOUNT,
CAST(STATISTICS AS VARCHAR(40)) as STATISTICS
from sys.SYSCONGLOMERATES c join sys.SYSTABLES t on c.TABLEID = t.TABLEID join
sys.SYSSTATISTICS s on s.TABLEID = t.TABLEID
where t.TABLENAME = 'TEST_TAB_2' and c.ISINDEX = false;
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira