EXPLAIN SELECT path,node_type,change_type,base_path,base_rev FROM node_change WHERE rev=1 ORDER BY path; SQLite with key =============== CREATE TABLE node_change ( rev text, path text, node_type text, change_type text, base_path text, base_rev text, UNIQUE (rev,path,change_type) ); CREATE INDEX node_change_rev_idx ON node_change (rev); addr opcode p1 p2 p3 ---- -------------- ---------- ---------- --------------------------------- 0 Noop 0 0 1 Goto 0 30 2 Integer 0 0 3 OpenRead 0 2 4 SetNumColumns 0 6 5 Integer 0 0 6 OpenRead 2 3 keyinfo(3,BINARY,BINARY) 7 Integer 1 0 8 NotNull -1 11 9 Pop 1 0 10 Goto 0 27 11 MakeRecord 1 0 aaa 12 MemStore 0 0 13 MoveGe 2 27 14 MemLoad 0 0 15 IdxGE 2 27 + 16 RowKey 2 0 17 IdxIsNull 1 26 18 IdxRowid 2 0 19 MoveGe 0 0 20 Column 0 1 21 Column 0 2 22 Column 0 3 23 Column 0 4 24 Column 0 5 25 Callback 5 0 26 Next 2 14 27 Close 0 0 28 Close 2 0 29 Halt 0 0 30 Transaction 0 0 31 VerifyCookie 0 2 32 Goto 0 2 33 Noop 0 0 SQLite without key ================== CREATE TABLE node_change ( rev text, path text, node_type text, change_type text, base_path text, base_rev text ); CREATE INDEX node_change_rev_idx ON node_change (rev); addr opcode p1 p2 p3 ---- -------------- ---------- ---------- --------------------------------- 0 OpenVirtual 1 3 keyinfo(1,BINARY) 1 Goto 0 49 2 Integer 0 0 3 OpenRead 0 2 4 SetNumColumns 0 6 5 Integer 0 0 6 OpenRead 2 3 keyinfo(1,BINARY) 7 Integer 1 0 8 NotNull -1 11 9 Pop 1 0 10 Goto 0 32 11 MakeRecord 1 0 a 12 MemStore 0 0 13 MoveGe 2 32 14 MemLoad 0 0 15 IdxGE 2 32 + 16 RowKey 2 0 17 IdxIsNull 1 31 18 IdxRowid 2 0 19 MoveGe 0 0 20 Column 0 1 21 Column 0 2 22 Column 0 3 23 Column 0 4 24 Column 0 5 25 MakeRecord 5 0 26 Column 0 1 27 Sequence 1 0 28 Pull 2 0 29 MakeRecord 3 0 30 IdxInsert 1 0 31 Next 2 14 32 Close 0 0 33 Close 2 0 34 OpenPseudo 3 0 35 SetNumColumns 3 5 36 Sort 1 47 37 Integer 1 0 38 Column 1 2 39 Insert 3 0 40 Column 3 0 41 Column 3 1 42 Column 3 2 43 Column 3 3 44 Column 3 4 45 Callback 5 0 46 Next 1 37 47 Close 3 0 48 Halt 0 0 49 Transaction 0 0 50 VerifyCookie 0 2 51 Goto 0 2 52 Noop 0 0 PostgreSQL 8.1 with key ======================= CREATE TABLE node_change ( rev text, path text, node_type text, change_type text, base_path text, base_rev text, CONSTRAINT node_change_pk PRIMARY KEY (rev,path,change_type) ); CREATE INDEX node_change_rev_idx ON node_change (rev); Index Scan using node_change_pk on node_change (cost=0.00..8.30 rows=2 width=160) Index Cond: (rev = '1'::text) (2 rows) PostgreSQL 8.1 without key ========================== CREATE TABLE node_change ( rev text, path text, node_type text, change_type text, base_path text, base_rev text ); CREATE INDEX node_change_rev_idx ON node_change (rev); Sort (cost=8.31..8.31 rows=2 width=160) Sort Key: path -> Index Scan using node_change_rev_idx on node_change (cost=0.00..8.30 rows=2 width=160) Index Cond: (rev = '1'::text) (4 rows)