LINUX.ORG.RU

[postrgesql] переупорядочить таблицу


0

0

есть таблица:

# create table x (id serial not null, name text not null);
# insert into x(name) values ('a');
# insert into x(name) values ('b');
# insert into x(name) values ('c');
# select * from x;
id | name
----+------
1 | a
2 | b
3 | c
(3 rows)

# update x set name='b' where name='b';
# select * from x;
id | name
----+------
1 | a
3 | c
2 | b
(3 rows)

чем можно переупорядочить данные в таблице чтобы восстановить прежний порядок вывода ? ORDER BY не предлагать.

VACUUM FULL ANALYZE x не помогает...


> чем можно переупорядочить данные в таблице чтобы восстановить прежний порядок вывода ? ORDER BY не предлагать.

переупорядочить данные в таблице не хочешь ты. Факт упорядоченной выдачи - чистая случайность, на которую абсолютно нельзя полагаться. Читай книжки по SQL и используй ORDER BY...

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

> переупорядочить данные в таблице не хочешь ты.

Вполне запросто мог бы хотеть с точки зрения оптимизации производительности. Хотя судя по отрицанию ORDER BY - действительно не хочет ибо не знает что творит.

anonymous
()
Ответ на: комментарий от anonymous

> Вполне запросто мог бы хотеть с точки зрения оптимизации производительности.

Вообще-то да... кстате в MySQL'е есть команда ALTER TABLE ... ORDER BY ...;

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

>Факт упорядоченной выдачи - чистая случайность, на которую абсолютно нельзя полагаться. Читай книжки по SQL и используй ORDER BY...

Я в курсе. ORDER BY не нужно предлагать.

xtron
() автор топика
Ответ на: комментарий от xtron

> VACUUM FULL ANALYZE x не помог, но помог VACUUM FULL ANALYZE

то есть только всю базу целиком? А это у тебя так получилось или они в доке пишут? я чего-то в доке гарантий такого эффекта не вижу...

gods-little-toy ★★★
()

alter table x rename to x_tmp;
create table x (id serial not null, name text not null);
insert into x (id,name) select id,name from x_tmp order by id;
drop table x_tmp;

ShprotX
()
Ответ на: комментарий от gods-little-toy

>это у тебя так получилось или они в доке пишут?
у меня, но это извращение так как база может быть большой

xtron
() автор топика
Ответ на: комментарий от xtron

xtron, я бы другие способы поискал решения этой проблемы. Кэширование там итп. Любой update/delete/insert может это поломать.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> xtron, я бы другие способы поискал решения этой проблемы. Кэширование там итп. Любой update/delete/insert может это поломать.

+1.
Также после очередного vacuum тоже может слететь. А если вакуумирование не автоматическое, то по крону его надо ставить обязательно (раз в неделю, день, час... зависит от интенсивности работы).

Так что наиболее правильный подход - ORDER BY.

Топикстартер: почему "ORDER BY не предлагать", если не секрет?

Slavaz ★★★★★
()
Ответ на: комментарий от true_admin

> Любой update/delete/insert может это поломать.

Перезаливку с упорядочением делают если нужно что бы большинство данных, которые по логике приложения читаются последовательно, лежали рядом, т.е. обращаясь к блоку данных база вытягивает с диска не только строчку, которая ей нужна в текущий момент, но и те строки, которые будут вытаскиваться в последующие чтения. Смысл это имеет на больших наборах данных, а там несколько инсертов погоды не делают. Если же проходят массовые инсерты/апдейты или просто накапливаются значительные изменения - сортировку никто не мешает повторить.

anonymous
()
Ответ на: комментарий от anonymous

> Смысл это имеет на больших наборах данных,

я бы добавил "на больших простых наборах данных, простое чтение которых намного важнее получения различных чуть более сложных запросов (или последние просто отсутствуют)"

> сортировку никто не мешает повторить.

ну если данных действительно много, то это может быть и несколько проблематично.

Я к тому, что задача вырисовывается на столько специфичной, что стоит задуматься - а нужен ли вам postgresql? Может есть "более адекватные"... хм, "хранилища данных"? ИМХО, простое чтение строк (даже с парсингом, даже на шеле) из файла обгонит "select..." на ваших "оптимизированных" данных в разы...

yyk ★★★★★
()

create index id_name_indx on x ( id );
cluster x using id_name_indx ;

после изменения данных нужно будет делать снова: cluster x;

cluster x using id_name_indx ; - переупорядочивает данные на диске в соответствии с индексом.

Eshkin_kot ★★
()
Ответ на: комментарий от Slavaz

>почему "ORDER BY не предлагать", если не секрет?
например бывает что данные хочется переупорядочить не трогая запросы или изменить запросы нет возможности.

xtron
() автор топика
Ответ на: комментарий от xtron

>>почему "ORDER BY не предлагать", если не секрет? >например бывает что данные хочется переупорядочить не трогая запросы или изменить запросы нет возможности.

для этого imho логичнее использовать view, заменив им оригинальную таблицу, а таблицу переименовать в чтонить типа *_raw

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

Самое правильное решение. Безо всяких костылей и проблем со слетанием порядка сортировки. ИМХО, топикстартеру так и следует поступить...

Slavaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.