On Oct 14, 2010, at 10:43 PM, Alan Chandler wrote:
> I am porting an application (American Football Results Picking
> Competition) over from a Postgres databaseo to SQLite which involves
> some fairly intense queries. I am doing this partially to do some
> performance comparisons although I have some other reasons too.
>
> I just want to make sure that I am setting up the indexes to some of
> the
> tables correctly.
>
> Here is an example of a representative type of table
>
> CREATE TABLE div_winner_pick (
> cid integer NOT NULL REFERENCES competition(cid) ON UPDATE CASCADE
> ON DELETE CASCADE, -- Competition ID
> confid character(3) NOT NULL REFERENCES conference(confid) ON
> UPDATE CASCADE ON DELETE CASCADE, --Conference ID
> divid character(1) NOT NULL REFERENCES division(divid) ON UPDATE
> CASCADE ON DELETE CASCADE, --Division ID
> uid integer NOT NULL REFERENCES participant(uid) ON UPDATE CASCADE
> ON DELETE CASCADE, --User ID
> tid character(3) NOT NULL REFERENCES team(tid) ON UPDATE CASCADE
> ON
> DELETE CASCADE, --Team who will win division
> submit_time bigint DEFAULT (strftime('%s','now')) NOT NULL, --Time
> of submission
> PRIMARY KEY (cid,confid,divid,uid)
> );
>
> where the Primary key references several columns
>
> For this particular table - in my Postgres definition I created the
> following two indexes
>
> CREATE INDEX div_win_pick_uid_idx ON div_winner_pick (uid);
> CREATE INDEX div_win_pick_cid_idx ON div_winner_pick (cid);
>
> i.e. Two of the 4 fields that make up the primary key.
>
> and I was anticipating doing the same - or something similar - I am
> not
> yet convinced I don't need to do
>
> CREATE INDEX div_win_pick_uid_cid_idx ON div_winner_pick (uid,cid);
>
>
> However, I came across the following text on the SQLite Web Site as
> part
> of the explanation of the CREATE TABLE command
>
>
>
> "INTEGER PRIMARY KEY columns aside, both UNIQUE and PRIMARY KEY
> constraints are implemented by creating an index in the database (in
> the
> same way as a "CREATE UNIQUE INDEX" statement would). Such an index is
> used like any other index in the database to optimize queries. As a
> result, there often no advantage (but significant overhead) in
> creating
> an index on a set of columns that are already collectively subject
> to a
> UNIQUE or PRIMARY KEY constraint."
>
>
> I just wanted to check that lack of advantage (and overhead) applies
> purely to an index across all columns of the primary key and that if I
> need the index across a lesser number of columns (because I am
> querying
> for all records that match where I can define the values "cid" and
> "uid"
> in the example above) it is still and advantage to create it
> separately.
It should be clearer. Basically the index would be redundant
if it contains the same columns in the same order as the primary
key. Or a prefix thereof. i.e. the following indexes would be
all be redundant (pure overhead for no benefit):
CREATE INDEX x ON div_pick_winner(cid);
CREATE INDEX x ON div_pick_winner(cid,confid);
CREATE INDEX x ON div_pick_winner(cid,confid,divid);
CREATE INDEX x ON div_pick_winner(cid,confid,divid,uid);
Your index is not redundant though.
Dan.
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users