Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индексирование полей массива. / 5 сообщений из 5, страница 1 из 1
05.08.2005, 21:56
    #33205044
Индексирование полей массива.
Доброго времени суток.
Возник конкретный вопрос.... На который я не могу ответить =(

Суть дела в том что у меня есть таблица

message (id integer, id_board integer, name text, value text[])

Первые 3 поля понятно для чего....
А вот value.... Это массив значений. Он имеет фиксированное колличество элементов для конкретного значения id_board.
Возможно ли сделать индексированние по каждому эллементу массива? Помогите плз.... А при колличестве записей > 600000 база просто ложится спать если учесть что выборка ведётся практически по всем полям....

И второй вопрос. (оптимизация запросов....)


Код: plaintext
1.
2.
3.
4.
$colres=pg_exec("select id, array_upper(value,1) as value, array_upper(metrik,1) as mertik from param where id_params=(select id_params from boards where id=".$board.") order by id"); 
   while($col = pg_fetch_array($colres)){ 
         $datres=pg_exec("select name, type[1] as type, type[5] as important, ".brows($col[ 1 ], 'value').", ".brows($col[ 2 ], 'metrik')." from param where id_params=(select id_params from boards where id=".$board.") and id=".$col[ 0 ]); 
         while($dat = pg_fetch_array($datres)){ 
......

Вот этот код сначала вычасляет размерность массива а потом с помощью ф-ии brows($col[1], 'value') подставляет в запрос поля вида "value[N] as valueN". Т.е. перечисляет все елементы массива в запросе.
Сопственно вопрос: Как это переписать одним запросом с использованием хранимой процедуры?

Плиз хелп. Я с постгресом знаком всего 2 дня. А проект уже написал. Теперь надо оптимизировать.
Спасибо заранее всем кто откликнится.....

ЗЫ PostgreSQL 8.0.3
ЗЫ2 Сорри за 2 вопроса в одном топике.
...
Рейтинг: 0 / 0
05.08.2005, 22:08
    #33205051
Индексирование полей массива.
Есть конечно вариант....
value text[] заменить на intarray и использовать индексы вместо полного текста. Но тогда запросы будут гораздо длиннее и не уверен что скорость будет на много выше =\
...
Рейтинг: 0 / 0
06.08.2005, 13:39
    #33205242
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование полей массива.
Gustavo Hamogrizerov
Суть дела в том что у меня есть таблица
message (id integer, id_board integer, name text, value text[])

Первые 3 поля понятно для чего.... (прим. XM: нифига не понятно для чего, одни догадки)
А вот value.... Это массив значений. Он имеет фиксированное колличество элементов для конкретного значения id_board.
Впечатления:
1. вы пытаетесь сделать то ли форум, то ли блог или что-то в этом духе (что само по себе излише в виду наличия туевой хучи уже готовых отлажованых)

2. в таблицу message, похоже пытаетесь втюхать все реплики, что не есть правильно.
Стандартные подходы (грубо) :
- одна таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
messages (
   id serial primary key, 
   board_id int not null references boards,
   reply_to int references messages,
   subject  varchar( 200 ) not null,   
   body text not null
 );
- две таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
topics(
   id serial primary key, 
   board_id int not null references boards
);
messages(
   id serial primary key,
   topic_id int references topics,
   subject  varchar( 200 ) not null,   
   body text not null 
);

Gustavo Hamogrizerov
Возможно ли сделать индексированние по каждому эллементу массива? Помогите плз.... А при колличестве записей > 600000 база просто ложится спать если учесть что выборка ведётся практически по всем полям....

Нах..., в смысле, ЗАЧЕМ нужны такие запросы?
Совет - пока база спит на запросах, почитайте книжек (но только не по проектированию СУБД, боже упаси!)

Gustavo Hamogrizerov
И второй вопрос. (оптимизация запросов....)

А можно на чуть более логическом уровне объяснить ЗАЧЕМ он это делает, ЦЕЛЬ с т.з. пользователя ?

Gustavo Hamogrizerov
Плиз хелп. Я с постгресом знаком всего 2 дня. А проект уже написал. Теперь надо оптимизировать.

Слов нет.
Вы - монстр. Просто монстр.
...
Рейтинг: 0 / 0
06.08.2005, 16:29
    #33205327
Индексирование полей массива.
CREATE TABLE boards (
id bigserial NOT NULL,
id_board bigint,
id_params bigint,
name character varying(255),
"type" character varying(255)
);

CREATE TABLE message (
id bigserial NOT NULL,
id_board bigint,
value text[]
);

CREATE TABLE param (
id bigserial NOT NULL,
id_params bigint,
id_param bigint,
id_value integer,
name character varying(255),
value text[],
metrik text[],
"type" text[]
);

CREATE TABLE params (
id bigserial NOT NULL,
name character varying(255)
);

INSERT INTO boards (id, id_board, id_params, name, "type") VALUES (1, 0, 0, 'Автомобили', 'list');
INSERT INTO boards (id, id_board, id_params, name, "type") VALUES (2, 1, 1, 'BMW', 'board');

INSERT INTO message (id, id_board, value) VALUES (1, 2, '{1995,Зелёный,"Титановые диски",Да,"453453 EU",543534534,"04-08-2005 19:31:16"}');
INSERT INTO message (id, id_board, value) VALUES (2, 2, '{1997,Синий,"Кожанный салон",Нет,"43534644 MLD",4264254,"04-08-2005 19:38:22"}');
INSERT INTO message (id, id_board, value) VALUES (3, 2, '{1999,Красный,"Руль для распальцовки",Да,"555 US",6546756,"04-08-2005 19:39:20"}');
.........

INSERT INTO param (id, id_params, id_param, id_value, name, value, metrik, "type") VALUES (1, 1, 0, 0, 'Год', '{1995,1996,1997,1998,1999,2000}', NULL, '{combobox,true,true,false,true}');
INSERT INTO param (id, id_params, id_param, id_value, name, value, metrik, "type") VALUES (6, 1, 0, 0, 'Телефон', NULL, NULL, '{inputbox,false,false,false,true}');
INSERT INTO param (id, id_params, id_param, id_value, name, value, metrik, "type") VALUES (4, 1, 0, 0, 'Обмен', '{Да,Нет}', NULL, '{radiobox,true,true,false,true}');
INSERT INTO param (id, id_params, id_param, id_value, name, value, metrik, "type") VALUES (2, 1, 0, 0, 'Цвет', '{Красный,Зелёный,Синий}', NULL, '{combobox,true,true,false,false}');
INSERT INTO param (id, id_params, id_param, id_value, name, value, metrik, "type") VALUES (5, 1, 0, 0, 'Цена', NULL, '{US,EU,MLD}', '{inputbox,true,false,true,true}');
INSERT INTO param (id, id_params, id_param, id_value, name, value, metrik, "type") VALUES (3, 1, 0, 0, 'Фишки', '{"Фишка 1","Фишка 2","Фишка 3"}', NULL, '{checkbox,false,false,false,false}');
INSERT INTO param (id, id_params, id_param, id_value, name, value, metrik, "type") VALUES (7, 1, 0, 0, 'Время', NULL, NULL, '{time,true,false,false,false}');

INSERT INTO params (id, name) VALUES (1, 'Автомобили');

XM
Впечатления:
1. вы пытаетесь сделать то ли форум, то ли блог или что-то в этом духе (что само по себе излише в виду наличия туевой хучи уже готовых отлажованых)

У вас не верное впечатление. Я пытаюсь создать доску объявлений.

XM
2. в таблицу message, похоже пытаетесь втюхать все реплики, что не есть правильно.

В эту таблицу я буду пихать все объявления.

XM
Нах..., в смысле, ЗАЧЕМ нужны такие запросы?
Совет - пока база спит на запросах, почитайте книжек (но только не по проектированию СУБД, боже упаси!)

Необходимость возникла и пришлось писать без книжек. Такие запросы нужны по тому что выборка ведётся по всем полям.
У меня было оперативы 256 любой запрос вешался. Поставил ещё 256 и выборка стала занимать доли секунды. Вот только при сортировке order by value[N] desc|asc он опять таки задумывается на долго.
По поводу манов это будет обязательно.
Но как по другому организовать рассширяемую базу данных где будет более 100 досок объявлений и у каждой будет своё колличество полей разных типов!

XM
А можно на чуть более логическом уровне объяснить ЗАЧЕМ он это делает, ЦЕЛЬ с т.з. пользователя ?

Можно. Я просто сначала узнаю какое колличество полей в массиве а потом выбираю из этих полей значения. Всё это можно сделать одним запросом.
точнее одной хранимой процедурой.

XM
Слов нет.
Вы - монстр. Просто монстр.
А можно без иронии?
...
Рейтинг: 0 / 0
07.08.2005, 13:47
    #33205527
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование полей массива.
Ну вот, на конкретных данных лучше видны корни проблем.

Gustavo Hamogrizerov wrote:
> INSERT INTO message (id, id_board, value) VALUES (1, 2,
> '{1995,Зелёный,"Титановые диски",Да,"453453 EU",543534534,"04-08-2005
> 19:31:16"}');
> INSERT INTO message (id, id_board, value) VALUES (2, 2,
> '{1997,Синий,"Кожанный салон",Нет,"43534644 MLD",4264254,"04-08-2005
> 19:38:22"}');
> INSERT INTO message (id, id_board, value) VALUES (3, 2,
> '{1999,Красный,"Руль для распальцовки",Да,"555 US",6546756,"04-08-2005
> 19:39:20"}');
.......
> Я пытаюсь создать доску объявлений.
> В эту таблицу я буду пихать все объявления.
Естественно будет тормозить ужасно, т.к. говно структура, я таких и не видал еще, налицо нарушение 1НФ.
(хотя может я отстал от жизни и это какое-то новое течение?)
Лучший способ оптимизации в этом случае - вдумчиво перепроектировать всю схему.

> Но как по другому организовать рассширяемую базу данных где будет более
> 100 досок объявлений и у каждой будет своё колличество полей разных типов!
>
На форуме "Проектирование БД" такие темы постоянно всплывают, не изобретайте велосипед,
а посмотрите как это делают другие и какие грабли вас ожидают.

> А можно без иронии?
В данном случае нельзя
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индексирование полей массива. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]