powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как построить GiST индекс по первым субполям составного типа данных?
6 сообщений из 6, страница 1 из 1
Как построить GiST индекс по первым субполям составного типа данных?
    #35569925
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как построить GiST индекс по первым субполям составного типа данных? Где найти соответствующую документацию?

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

Создаем новый тип
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TYPE mytype AS (
id INT8,
opt INT2,
...
info VARCHAR( 255 ),
gmt TIMESTAMP,
id_user INT4,
...
);
//Создаем таблицу
Код: plaintext
1.
2.
3.
4.
CREATE TABLE mytable(
id_rec INT8,
data mytype[]
);
Требуется создать частичный индекс только по первому или первым двум полям в структуре mytype. Вот такой вариант создаст индекс по всем полям.
Код: plaintext
1.
CREATE INDEX myindex ON mytable USING GIST(data)
А нужно, что-то типа такого, но я не нашел примеры такого синтаксиса. Как правильно это делать?
В первом случае, нужен индекс оптимизированный для целочисленного массива, желательно INT8.
Во втором непонятно, какой метод будет использован.
Код: plaintext
1.
2.
CREATE INDEX myindex ON mytable USING GIST(data.id gist__int_ops); 
CREATE INDEX myindex ON mytable USING GIST(data.id,data.opt)
...
Рейтинг: 0 / 0
Как построить GiST индекс по первым субполям составного типа данных?
    #35570114
Oleg Bartunov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция тебе поможет и функциональный индекс.

MySQLCraftКак построить GiST индекс по первым субполям составного типа данных? Где найти соответствующую документацию?

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

Создаем новый тип
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TYPE mytype AS (
id INT8,
opt INT2,
...
info VARCHAR( 255 ),
gmt TIMESTAMP,
id_user INT4,
...
);
//Создаем таблицу
Код: plaintext
1.
2.
3.
4.
CREATE TABLE mytable(
id_rec INT8,
data mytype[]
);
Требуется создать частичный индекс только по первому или первым двум полям в структуре mytype. Вот такой вариант создаст индекс по всем полям.
Код: plaintext
1.
CREATE INDEX myindex ON mytable USING GIST(data)
А нужно, что-то типа такого, но я не нашел примеры такого синтаксиса. Как правильно это делать?
В первом случае, нужен индекс оптимизированный для целочисленного массива, желательно INT8.
Во втором непонятно, какой метод будет использован.
Код: plaintext
1.
2.
CREATE INDEX myindex ON mytable USING GIST(data.id gist__int_ops); 
CREATE INDEX myindex ON mytable USING GIST(data.id,data.opt)
...
Рейтинг: 0 / 0
Как построить GiST индекс по первым субполям составного типа данных?
    #35570145
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg BartunovФункция тебе поможет и функциональный индекс.
Спасибо за оперативный ответ.
А не медленно будет? Побаиваюсь я их хронически.
Может лучше тогда разделить структуру на две части, создать два поля массива и индексировать только одно из них. Причем индексируемое, сделать стандартного типа (intarray и т.п.). Проблема в этом случае в том, что как после выполнения запроса или в запросе спозиционироваться внутри непроиндексированного поля на ту-же позицию, что и в проиндексированном.
...
Рейтинг: 0 / 0
Как построить GiST индекс по первым субполям составного типа данных?
    #35571947
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По другому вопрос задам...

допустим, мы создали такую таблицу

Код: plaintext
1.
2.
3.
4.
CREATE TABLE mytable(
id_rec INT8,
data GiST_indexing_type[],
info Not_indexing_type[]
);

Индекс построили только по полю дата.
В запросе требуется выполнять поиск с условием, использующим индекс по data и одновременно проверять условие в соотсветствующей позиции в непроиндексированном поле. Как обратиться в селекте к элементу в массиве info с тем же номером, что и у элемента в массиве data удовлетворяющего условию?

Почему такая извращенная задача? Очень просто. Документация по PostgreSQL и GiST рекомендует для ускорения запросов, заменять связующую таблицу в отношении многие ко многим, на индексируемый массив. Однако, в случае, когда записи в этой связующей таблице содержат кроме ключевых полей(FK) еще и другие поля, характеризующие данную связь и если эти описательные поля не нужно или вредно индексировать, возникает описанная выше проблема. Например, индекс может получиться очень большой, что сведет на нет всю оптимизацию. Количество записей во всех трех таблицах в отношении многие ко многим (T1<-MM->T2) достаточно велико, чтобы задуматься об оптимизации.
...
Рейтинг: 0 / 0
Как построить GiST индекс по первым субполям составного типа данных?
    #35573356
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg BartunovФункция тебе поможет и функциональный индекс.
А можно поподробнее, что должна делать эта функция и как ее применять?
За конкретный пример отдельное большое человеческое спасибо!
Можно ли(нужно ли) к результату работы функции применить intarray функции?

Развейте мои опасения. Функция должна возвращать массив, например, int[] в случае одного ключа или массив сложного типа мои_ключевые_поля[], и GiST индекс должен строиться по этим массивам?

Затем при запросе для каждой записи нужно вызывать эту функцию и снова преобразовывать общий массив, выделяя из него индексируемую часть и после этого проверять условие на вхождение параметра в массив? Только при этой последней проверке будет задействоан GiST индекс?

При этом, я не понимаю как в том же запросе обратиться к не проиндексированным субполям и проверить некоторое другое условие.

Заранее спасибо.

Ау!
...
Рейтинг: 0 / 0
Как построить GiST индекс по первым субполям составного типа данных?
    #35679767
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MySQLCraftКак построить GiST индекс по первым субполям составного типа данных? Где найти соответствующую документацию?
...
CREATE INDEX myindex ON mytable USING GIST(data)
[/src]А нужно, что-то типа такого, но я не нашел примеры такого синтаксиса. Как правильно это делать?

может быть не в тему. обычный индекс по субполям у меня создался так.

Код: plaintext
1.
CREATE INDEX idx_mytable_id
   ON mytable_log (((mytable).id));
лишняя пара скобок видимо означает что постгрес согласен рассматривать индекс как функциональный (а ((mytable).id) - как выражение). без нее - не создает. Синтаксиса специально для сложных типов не нашел.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как построить GiST индекс по первым субполям составного типа данных?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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