[ 
https://issues.apache.org/jira/browse/DERBY-2204?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12555438#action_12555438
 ] 

A B commented on DERBY-2204:
----------------------------

> 2) A primary key in one table matches a primary key in another table, 
> typically
> when the "sub" table contains additional optional information related to the
> main table.

[ snip ]

> Derby will create two identical backing indexes here, one for the primary key
> and one for the foreign key.

I think Derby does actually optimize for this case.  There is code in the 
"executeConstantAction()" method of CreateIndexConstantAction() which checks to 
see if a duplicate index exists, and if so, it will re-use that index instead 
of creating a new one.

That said, it looks Derby does not currently do the correct thing when the 
primary key is dropped; see DERBY-3299.

> Foreign key constraint backing index creation can be smarter when foreign key 
> is a subset of the table's primary key
> --------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-2204
>                 URL: https://issues.apache.org/jira/browse/DERBY-2204
>             Project: Derby
>          Issue Type: Improvement
>          Components: Performance, SQL
>            Reporter: Daniel John Debrunner
>
> When a foreign key's columns is a subset (or matches) the table's primary key 
> then there is no need to create an additional backing index. Such an index 
> will occupy disk space and decrease insert/update/delete performance.
> Two typical situations where this is a problem are shown in the schema for 
> the oe system test.
> 1) A multiple column primary key has a sub-set of columns which are a primary 
> key in another table.
> ALTER TABLE CUSTOMER ADD CONSTRAINT
>     CUSTOMER_PK PRIMARY KEY(C_W_ID, C_D_ID, C_ID);
> ALTER TABLE CUSTOMER ADD CONSTRAINT
>     C_D_FK_DISTRICT FOREIGN KEY (C_W_ID,C_D_ID) REFERENCES DISTRICT;
> Derby will create two backing indexes here, one for the primary key and one 
> for the foreign key. Derby could be improved
> so that no index is created for the foreign key, since Derby can perform an 
> index scan on a sub-set of the first N columns in an index.
> Not sure how easy fixing the runtime portion of constraint manipulation is, 
> if the constraint enforcement is via compiled SQL queries then it should be 
> easier than if they are direct scans against the access api.
> 2) A primary key in one table matches a primary key in another table, 
> typically when the "sub" table contains additional optional information 
> related to the main table.
> ALTER TABLE NEWORDERS ADD CONSTRAINT
>     NEWORDERS_PK PRIMARY KEY(NO_W_ID, NO_D_ID, NO_O_ID);
> ALTER TABLE NEWORDERS ADD CONSTRAINT
>     NO_O_FK FOREIGN KEY (NO_W_ID, NO_D_ID, NO_O_ID) REFERENCES ORDERS;
> Derby will create two identical backing indexes here, one for the primary key 
> and one for the foreign key.
> Fixing this case might be easier than 1) since Derby already supports having 
> mutliple logical indexes map to a single physical index.
> In both cases work is needed to handle dropping of the primary key while the 
> foreign key constraint is kept:
>   - in case 1) a new index will need to be built using the sub-set of the 
> columns, thus dropping a primary key constraint could take time.
>   - in case 2) possibly the backing index can be re-used but it needs to be 
> converted from a unique index to a non-unique one.
> Also the case where the primary key is created after the foreign key needs to 
> be covered, though that could be a follow on. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to