Search Postgresql Archives

Re: Add serial in specific order?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Sep 26, 2006, at 21:22 , Poul Jensen wrote:

I have ~25 columns in my database and need to order the rows by all columns to do queries like:

SELECT a FROM table ORDER BY a, b, c, ...., z;

I suspect it would be highly ineffective to order by all columns for every query! Hence I'd like to do the ordering only once and add a serial to the database specifying the order so all subsequent queries can be done like:

SELECT b FROM table ORDER BY added_serial;

The optimal ordering is found from analysis of the database and is not known at build time. Is it possible to add the serial without having to rebuild the database? It has millions of rows, by the way...

I think what I'd do is create another table that just stores the order information and references the first table. For example, given table foo:

create table foo
(
	foo_id integer primary key
	, foo_name text not null unique
	, foo_data text not null
);

Then create your ordering table, ordered_foo.

create table ordered_foo
(
	foo_id integer primary key
		references foo (foo_id)
		on update cascade on delete cascade
	, foo_ordering serial not null unique
);

To fill ordered_foo, just do:

insert into ordered_foo(foo_id)
select foo_id
from foo
order by foo_data;

Now you just have a join which will give you the order for you:

select *
from foo
natural join ordered_foo
order by foo_ordering;

You could even throw the join in a view for convenience:

create view ordered_foo_view as
select *
from foo
natural join ordered_foo;

Then you just:

select *
from ordered_foo_view
order by foo_ordering;

To update the ordering, just truncate ordered_foo and fill it again.

Anyway, that's one way to do it.

Hope this helps.

Michael Glaesemann
grzm seespotcode net




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux