Как найти столбцы, которые нужно проиндексировать? - PullRequest
0 голосов
/ 20 февраля 2019

Я начинаю изучать SQL и реляционные базы данных.Ниже приведена таблица, которая у меня есть, и в ней около 10 миллионов записей.Мой составной ключ - (reltype, from_product_id, to_product_id).

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

Таблица DDL показана ниже.

Имя таблицы: prod_rel.

Имя схемы базы данных: public

CREATE TABLE public.prod_rel (
reltype varchar NULL,
assocsequence float4 NULL,
action varchar NULL,
from_product_id varchar NOT NULL,
to_product_id varchar NOT NULL,
status varchar NULL,
starttime varchar NULL,
endtime varchar null,
primary key reltype, from_product_id, to_product_id)
);

Операции, выполняемые с таблицей:

select distinct(reltype ) 
from public.prod_rel; 

update public.prod_rel  
   set status = ? , starttime = ? 
where from_product_id = ?;

update public.prod_rel  
   set status = ? , endtime = ? 
where from_product_id = ?;

select * 
from public.prod_rel  
where from_product_id  in (select distinct (from_product_id) 
                           from public.prod_rel 
                           where status = ? 
                           and action in ('A', 'E', 'C', 'P') 
                           and reltype = ? 
                           fetch first 1000 rows only);

Примечание. Я не выполняю никаких операций JOIN.Также, пожалуйста, игнорируйте заглавные буквы для имен таблиц или столбцов.Я только начинаю.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Я изменил порядок первичных столбцов, как показано ниже в соответствии с предложением @a_horse_with_no_name, и создал только один индекс для столбцов (from_product_id, reltype, status, action).

CREATE TABLE public.prod_rel (
reltype varchar NULL,
assocsequence float4 NULL,
action varchar NULL,
from_product_id varchar NOT NULL,
to_product_id varchar NOT NULL,
status varchar NULL,
starttime varchar NULL,
endtime varchar null,
primary key reltype, from_product_id, to_product_id)
);

Кроме того, я тщательно изучил портал, предложенный @a_horse_with_no_name.Это было прекрасно.Я узнал много нового о индексации.

https://use -the-index-luke.com /

0 голосов
/ 20 февраля 2019

В идеале могут быть два индекса:

CREATE INDEX ON prod_rel (from_product_id);

CREATE INDEX ON prod_rel (status, reltype)
   WHERE action IN ('A', 'E', 'C', 'P');

Ваш первичный ключ (который также реализован с использованием индекса) не может поддерживать запросы 2 и 3, поскольку from_product_id не находится в начале.Если вы переопределите первичный ключ как from_product_id, to_product_id, reltype, вам не понадобится первый предложенный мной индекс.

Почему порядок имеет значение?Представьте, что вы ищете книгу в библиотеке, где книги упорядочены по «фамилии, имени».Вы можете использовать этот порядок, чтобы быстро найти все книги «Диккенса», но не все книги какого-либо «Чарльза».

Но позвольте мне также прокомментировать ваши запросы.

Первая будетплохо работают, если есть много разных значений reltype;попробуйте поднять work_mem в этом случае.Это всегда последовательное сканирование всей таблицы, и никакой индекс не может помочь.

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