2013-05-24 3 views
1

У меня есть таблица с около 5 миллионов строкPostgreSQL Выберите из таблицы 5 миллионов строк

CREATE TABLE audit_log 
(
    event_time timestamp with time zone NOT NULL DEFAULT now(), 
    action smallint, -- 1:modify, 2:create, 3:delete, 4:security, 9:other 
    level smallint NOT NULL DEFAULT 20, -- 10:minor, 20:info, 30:warning, 40:error 
    component_id character varying(150), 
    CONSTRAINT audit_log_pk PRIMARY KEY (audit_log_id) 
) 
WITH (
    OIDS=FALSE 
); 

Мне нужно, чтобы все составные идентификаторы с чем-то вроде SELECT component_id from audit_log GROUP BY component_id и она занимает около 20 секунд для завершения запроса. Как я могу это оптимизировать?

UPD:

У меня есть индекс component_id

CREATE INDEX audit_log_component_id_idx 
    ON audit_log 
    USING btree 
    (component_id COLLATE pg_catalog."default"); 

UPD 2: Ну, я знал, что одно решение для перемещения имен компонентов в отдельную таблицу, но надеялся, что было простое решение. Спасибо, парни.

+0

Вы хотите сказать, что "select separate component_id from audit_log"? –

+0

@DavidAldridge Ну, отличная скорость в течение 2 секунд – message

+0

Это семантически правильный способ написания запроса. Использование группы - это более длинный и нестандартный способ ее написания. –

ответ

1
  • Создать индекс на столбце component_id

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

Возможно, вы также захотите переместить компонент (в настоящее время строку) в отдельную таблицу, ссылаясь на него идентификатором типа integer или аналогичным.

+0

У меня есть индекс btree. Это не помогает – message

+0

Какова мощность колонки? сколько у вас разных ценностей? попробовали ли вы разбить информацию о компоненте на строковое значение во второй таблице и только индексированный интегральный идентификатор в вашей таблице? – davek

0

Создайте некластеризованный индекс (component_id) для вашей таблицы. Или определите некластеризованное для всего поля, которое вы используете как часть своего класса. Попытайтесь увидеть разницу во времени выполнения или план выполнения. Ставка будет заключаться в том, чтобы преобразовать все операции сканирования в режим поиска.

0

Если у вас есть список допустимых компонентов идентификаторов в другой таблице и просто хотел, чтобы проверить их наличие в таблице аудита, возможно, с некоторыми условиями, то вы могли бы:

select 
    component_id 
from 
    components 
where 
    exists (
    select null 
    from audit_log 
    where audit_log.component_id = components.component_id) 

Это будет выполнять намного лучше если число отдельных компонентов_компьютера было значительно меньше числа строк в audit_log, а index_log.component_id индексируется.

Смежные вопросы