[PROPOSAL] Covering + unique indexes. - Mailing list pgsql-hackers

From Anastasia Lubennikova
Subject [PROPOSAL] Covering + unique indexes.
Date
Msg-id 55F2CCD0.7040608@postgrespro.ru
Whole thread Raw
Responses Re: [PROPOSAL] Covering + unique indexes.  (Jim Nasby <Jim.Nasby@BlueTreble.com>)
Re: [PROPOSAL] Covering + unique indexes.  (David Rowley <david.rowley@2ndquadrant.com>)
Re: [PROPOSAL] Covering + unique indexes.  (Anastasia Lubennikova <a.lubennikova@postgrespro.ru>)
List pgsql-hackers
Hi, hackers!<br /><div class="moz-forward-container"><br /> Use case:<br /> Index-only scans is a wonderful feature
thatallows to speed up select queries of indexed columns.<br /> Therefore some users want to create multicolumn indexes
oncolumns which are queried often.<br /> But if there's unique constraint on some column, they have to maintain another
uniqueindex.<br /> Even if the column is already in covering index.<br /> This adds overhead to data manipulation
operationsand database size.<br /><br /> I've started work on a patch that allows to combine covering and unique
functionality.<br/> The main idea is to allow user create multicolumn indexes with a definite number of unique
columns.<br/> For example (don't mind SQL syntax here, please):<br /> CREATE INDEX index ON table (c1, c2, c3) UNIQUE
ON(c1, c2);<br /> Created index has three columns, but only two of them have unique constraint.<br /><br /> This idea
hasobvious restriction. We can set unique only for first index columns.<br /> There is no clear way to maintain
followingindex.<br /> CREATE INDEX index ON table (c1, c2, c3) UNIQUE ON (c1, c3);<br /><br /> So I suggest following
syntax:<br/> CREATE [UNIQUE {ON FIRST {COLUMN | n_unique_column COLUMNS}} INDEX ON table_name (column_name1,
column_name2...);<br /><br /> Examples:<br /> CREATE UNIQUE INDEX ON table_name (c1, c2, c3); // (c1,c2, c3) must be
UNIQUE.That's how it works now.<br /><br /> CREATE UNIQUE ON FIRST COLUMN INDEX ON table_name (c1, c2, c3); // (c1)
mustbe UNIQUE<br /> CREATE UNIQUE ON FIRST 2 COLUMNS INDEX ON table_name (c1, c2, c3); // (c1,c2) must be UNIQUE<br />
CREATEUNIQUE ON FIRST 3 COLUMNS INDEX ON table_name (c1, c2, c3); // (c1,c2, c3) must be UNIQUE<br /><br /><div
class="line">Nextissue is pg_index changes.<br /> Now there's only a boolean flag<br /><div class="line"><ul><li><span
class="keywordtype">bool</span>indisunique; <span class="comment">/* is this a unique index? */</span></ul><span
class="comment">Butnew algorithm requires to store a single number<br /></span><ul><li>unit16<span class="comment">
n_unique_columns;/* number of first columns of index which has unique constrains. */<br /></span></ul> I think, that
numbersof all attributes themselves are not needed. Is it right?<br /></div></div><br /> I'd like to see your
suggestionsabout syntax changes. <br /> And of course any other comments are welcome.<br /><pre class="moz-signature"
cols="72">--
 
Anastasia Lubennikova
Postgres Professional: <a class="moz-txt-link-freetext" href="http://www.postgrespro.com"
moz-do-not-send="true">http://www.postgrespro.com</a>
The Russian Postgres Company</pre></div>

pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: Proposal: Implement failover on libpq connect level.
Next
From: Tom Lane
Date:
Subject: Re: Moving SS_finalize_plan processing to the end of planning