У меня есть очень простой запрос, который по сути таков:
Select * from my_table Where my_field != '';
В таблице около 40 000 строк, а столбец «my_field» — это текстовое поле (varchar 255).
Выполнение запроса занимает около 39 000 мс. Я предполагаю, потому что ему приходится просматривать каждую запись для вещей, которые не являются пустыми строками. Я проиндексировал столбец my_field, но ничего не изменилось.
На всякий случай, вот план запроса:
"Seq Scan on my_table (cost=0.00..3468.91 rows=39744 width=459)"
" Filter: ((my_field)::text <> ''::text)"
Какой мой лучший вариант здесь?
Объясните, проанализируйте:
"Seq Scan on my_table (cost=0.00..3468.91 rows=39730 width=459) (actual time=0.021..13.763 rows=39714 loops=1)"
" Filter: ((my_field)::text <> ''::text)"
"Total runtime: 14.856 ms"
Я добавил эти индексы
CREATE INDEX aa_idx ON my_table(my_field);
CREATE INDEX aa_idx ON my_table(my_field) WHERE my_field <> '';
Это Постгрес 9.1
Изменить: [2013-02-26 00:04GMT]
Будет ли какая-либо польза от создания раздела на «my_field» в качестве контрольного ограничения?
что-то вроде CHECK(my_field = '') и в разделе 2 CHECK(my_field != '')
Я предполагаю, что все, что у меня будет, это таблица с большим количеством строк? Но значит ли это, что запрос select != '' будет выполняться намного быстрее, даже если раздел будет содержать около 80% данных?
Я также изучил полнотекстовый поиск, но это казалось OTT для этого. Я также пытался сделать столбец целым числом 0 или 1 (bool), но это не повлияло на производительность (я думаю, потому что = 1 по-прежнему возвращает много строк?)
vacuum analyze
после добавления индекса)? - person wildplasser   schedule 25.02.2013explain analyze
, а не простоexplain
. Также: версия PostgreSQL? В какой локали находится ваша база данных? И, пожалуйста, покажите определение индекса, который вы добавили. - person Craig Ringer   schedule 25.02.2013select *
наselect COUNT(*)
(вывод громоздких результатов также влияет на время и пропускную способность) - person wildplasser   schedule 25.02.2013total_memory - xxx
, где xxx — это память, необходимая для ОС и активных запущенных процессов. - person wildplasser   schedule 25.02.2013