Re: Redundant indexes with multi-column foreign key indexes

Fred Toussi <[email protected]> Tue, 10 Jan 2017 16:56:57 +0000
Newsgroups gmane.comp.java.hsqldb.user
Message-ID <[email protected]>
HSQLDB can use a multi-column index when any sequence of columns
beginning with the first column is queried. Therefore SELECT * FROM C
WHERE a_id = ? AND b_id = ? will use the c_a_b_idx index.
 

The system index on the foreign key column is used when you delete
rows from table A to check if there are any rows referencing the
deleting rows.
 

It is true that with the c_a_b_idx the system index on a_id is
redundant. But the management of indexes is a complex issue and more
complexity would be added if the system index were to be removed
automatically when you add a multi-column index that can do the same
job. You cannot eliminate a system index unless you drop the constraint
that is backed by that index.
 

Fred Toussi

 

 

On Tue, Jan 10, 2017, at 16:10, Keith Squier wrote:

> I understand that HSQL can use a multi-column index when only the
> first column of the index is used in a query. I also understand that
> HSQL automatically creates indexes on foreign keys. This can lead to
> redundant indexes when creating a multi-column index that uses
> multiple foreign key columns. For example, I have the following setup.
>  

> CREATE TABLE A (

>    id UUID NOT NULL,

>    name VARCHAR(45) NOT NULL,

>    PRIMARY KEY (id));

>  

> CREATE TABLE B (

>    id UUID NOT NULL,

>    name VARCHAR(45) NOT NULL,

>    PRIMARY KEY (id));

>  

> CREATE TABLE C (

>    id UUID NOT NULL,

>    datetime TIMESTAMP NOT NULL,

>    a_id UUID NOT NULL,

>    b_id UUID NOT NULL,

>    PRIMARY KEY (id),

>    CONSTRAINT fk_c_a FOREIGN KEY (a_id) REFERENCES A (id),

>    CONSTRAINT fk_c_b FOREIGN KEY (b_id) REFERENCES B (id));

>  

> This creates an index for each of the foreign keys on C (columns a_id
> and b_id). I know for a fact that I query table C using a_id and b_id
> together frequently, so I would like to create an index on both
> columns.
>  

> CREATE INDEX c_a_b_idx ON C(a_id, b_id);

>  

> But HSQL can also use this new index (c_a_b_idx) when querying only on
> a_id. This means the automatically created index (SYS_IDX_blah) for
> a_id is redundant, useless, and only taking up space. When I try to
> drop the SYS_IDX_blah index, I get errors about lacking privilege or
> the object is not found.
>  

> How can I eliminate the redundant index? How can I remove the
> automatically created index or prevent it from being created?
> ----------------------------------------------------------------------
> --------
> Developer Access Program for Intel Xeon Phi Processors

> Access to Intel Xeon Phi processor-based developer platforms.

> With one year of Intel Parallel Studio XE.

> Training and support from Colfax.

> Order your platform today. http://sdm.link/xeonphi

> _________________________________________________

> Hsqldb-user mailing list

> [email protected]

> https://lists.sourceforge.net/lists/listinfo/hsqldb-user

------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi

_______________________________________________
Hsqldb-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/hsqldb-user